]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon: proper processing of unsuccessful TLS rehandshake
authorGrigorii Demidov <grigorii.demidov@nic.cz>
Fri, 14 Dec 2018 12:31:47 +0000 (13:31 +0100)
committerGrigorii Demidov <grigorii.demidov@nic.cz>
Fri, 14 Dec 2018 12:49:04 +0000 (13:49 +0100)
daemon/session.c
daemon/tls.c
daemon/worker.c

index db238233db8ecf82c37f0732ed93cd946697e0f9..c870d8cd48a217ae71ab9267cc0bdb07ccf3b689 100644 (file)
@@ -136,7 +136,7 @@ int session_waitinglist_push(struct session *session, struct qr_task *task)
 
 struct qr_task *session_waitinglist_get(const struct session *session)
 {
-       return queue_head(session->waiting);
+       return (queue_len(session->waiting) > 0) ? (queue_head(session->waiting)) : NULL;
 }
 
 struct qr_task *session_waitinglist_pop(struct session *session, bool deref)
index 2457a59c186068ebb4f4f305378dd18b60a3e238..96f724d5396830b5741642b45e48ae4d3b12dd81 100644 (file)
@@ -253,7 +253,9 @@ static int tls_handshake(struct tls_common_ctx *ctx, tls_handshake_cb handshake_
                kr_log_verbose("[%s] TLS handshake with %s has completed\n",
                               logstring,  kr_straddr(peer));
                if (handshake_cb) {
-                       handshake_cb(session, 0);
+                       if (handshake_cb(session, 0) != kr_ok()) {
+                               return kr_error(EIO);
+                       }
                }
        } else if (err == GNUTLS_E_AGAIN) {
                return kr_error(EAGAIN);
index 889f9d0bf62735153f0e0f6695a9a8e7fb9020c2..8a7e5741ed6031426d8fe86f13fa4ee568a4efb4 100644 (file)
@@ -694,11 +694,25 @@ static int session_tls_hs_cb(struct session *session, int status)
 
        if (status) {
                struct qr_task *task = session_waitinglist_get(session);
-               struct kr_qflags *options = &task->ctx->req.options;
-               unsigned score = options->FORWARD || options->STUB ? KR_NS_FWD_DEAD : KR_NS_DEAD;
-               kr_nsrep_update_rtt(NULL, peer, score,
-                                   worker->engine->resolver.cache_rtt,
-                                   KR_NS_UPDATE_NORESET);
+               if (task) {
+                       struct kr_qflags *options = &task->ctx->req.options;
+                       unsigned score = options->FORWARD || options->STUB ? KR_NS_FWD_DEAD : KR_NS_DEAD;
+                       kr_nsrep_update_rtt(NULL, peer, score,
+                                           worker->engine->resolver.cache_rtt,
+                                           KR_NS_UPDATE_NORESET);
+               }
+#ifndef NDEBUG
+               else {
+                       /* Task isn't in the list of tasks
+                        * waiting for connection to upstream.
+                        * So that it MUST be unsuccessful rehandshake.
+                        * Check it. */
+                       assert(deletion_res != 0);
+                       const char *key = tcpsess_key(peer);
+                       assert(key);
+                       assert(map_contains(&worker->tcp_connected, key) != 0);
+               }
+#endif
                return ret;
        }