]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
worker: answer with NOTIMPL to all OPCODEs but QUERY bypassing resolve.c notimp
authorŠtěpán Balážik <sbalazik@gmail.com>
Tue, 1 Aug 2017 11:57:06 +0000 (13:57 +0200)
committerŠtěpán Balážik <sbalazik@gmail.com>
Tue, 1 Aug 2017 13:59:19 +0000 (15:59 +0200)
fixes #225

daemon/worker.c

index b31c7a18c6a12b35b2d6a3f1a21f141b1f9a5a5c..0855144e1c90f35c9ce08fdbe7c50d448098f39c 100644 (file)
@@ -739,8 +739,21 @@ static int qr_task_step(struct qr_task *task, const struct sockaddr *packet_sour
        if (!task || task->finished) {
                return kr_error(ESTALE);
        }
+
+       /* Answer with NOTIMPL to all OPCODEs but QUERY bypassing resolve.c */
+       if(packet && knot_wire_get_opcode(packet->wire) != KNOT_OPCODE_QUERY) {
+               knot_wire_set_rcode(packet->wire, KNOT_RCODE_NOTIMPL);
+               /* We need the packet finalized so qr_task_send does not try to resolve upon it. */
+               knot_wire_set_qr(packet->wire);
+               task->finished = true;
+               /* Send back answer */
+               (void) qr_task_send(task, task->source.handle, (struct sockaddr *)&task->source.addr, packet);
+               return KR_STATE_DONE;
+       }
+
        /* Close pending I/O requests */
        subreq_finalize(task, packet_source, packet);
+
        /* Consume input and produce next query */
        int sock_type = -1;
        task->addrlist = NULL;