]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/worker: clear query TCP flags when retrying
authorGrigorii Demidov <grigorii.demidov@nic.cz>
Thu, 16 Nov 2017 13:28:16 +0000 (14:28 +0100)
committerPetr Špaček <petr.spacek@nic.cz>
Mon, 8 Jan 2018 11:00:59 +0000 (12:00 +0100)
daemon/worker.c

index 63c4ba8c340033a7749440a1087dd91db44f3b94..1c89d8b7bafe98021358794e165124eb2e3cb343 100644 (file)
@@ -1043,6 +1043,15 @@ static void on_connect(uv_connect_t *req, int status)
                        struct qr_task *task = session->waiting.at[0];
                        session_del_tasks(session, task);
                        array_del(session->waiting, 0);
+                       /* TODO fixme
+                        * Daemon should not have direct access to rplan */
+                       struct request_ctx *ctx = task->ctx;
+                       assert(ctx);
+                       struct kr_request *req = &ctx->req;
+                       struct kr_rplan *rplan = &req->rplan;
+                       struct kr_query *qry = array_tail(rplan->pending);
+                       /* Prevent from KR_STATE_FAIL in kr_resolve_consume() */
+                       qry->flags.TCP = false;
                        qr_task_step(task, task->addrlist, NULL);
                        qr_task_unref(task);
                }
@@ -1810,6 +1819,15 @@ int worker_process_tcp(struct worker_ctx *worker, uv_stream_t *handle,
                        assert(task->refs > 1);
                        qr_task_unref(task);
                        if (session->outgoing) {
+                               /* TODO fixme
+                                * Daemon should not have direct access to rplan */
+                               struct request_ctx *ctx = task->ctx;
+                               assert(ctx);
+                               struct kr_request *req = &ctx->req;
+                               struct kr_rplan *rplan = &req->rplan;
+                               struct kr_query *qry = array_tail(rplan->pending);
+                               /* Prevent from KR_STATE_FAIL in kr_resolve_consume() */
+                               qry->flags.TCP = false;
                                qr_task_step(task, task->addrlist, NULL);
                        } else {
                                assert(task->ctx->source.session == session);
@@ -1820,6 +1838,15 @@ int worker_process_tcp(struct worker_ctx *worker, uv_stream_t *handle,
                while (session->tasks.len > 0) {
                        struct qr_task *task = session->tasks.at[0];
                        if (session->outgoing) {
+                               /* TODO fixme
+                                * Daemon should not have direct access to rplan */
+                               struct request_ctx *ctx = task->ctx;
+                               assert(ctx);
+                               struct kr_request *req = &ctx->req;
+                               struct kr_rplan *rplan = &req->rplan;
+                               struct kr_query *qry = array_tail(rplan->pending);
+                               /* Prevent from KR_STATE_FAIL in kr_resolve_consume() */
+                               qry->flags.TCP = false;
                                qr_task_step(task, task->addrlist, NULL);
                        } else {
                                assert(task->ctx->source.session == session);