]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Delay kserver cleanup until all tasks finishes
authorPetr Mensik <pemensik@redhat.com>
Fri, 27 Mar 2020 20:03:40 +0000 (21:03 +0100)
committerOndřej Surý <ondrej@isc.org>
Thu, 4 Jun 2020 09:35:07 +0000 (11:35 +0200)
It might be possible some pending task would run when kserver is already
cleaned up. Postpone gsstsig structures cleanup after task and timer
managers are destroyed. No pending threads are possible after it.

Make action in maybeshutdown only if doshutdown was not already called.
Might be called from getinput event.

(cherry picked from commit 2685e69be8dd6c9f81f3aebfffaaf95ba91e8934)

bin/nsupdate/nsupdate.c

index 25bb3891caff5fd979a317078aacc64ce0971d45..a205699a438b9dce09a0acc7146cc61c75b4ea5c 100644 (file)
@@ -831,6 +831,10 @@ doshutdown(void) {
 
 static void
 maybeshutdown(void) {
+       /* when called from getinput, doshutdown might be already finished */
+       if (requestmgr == NULL)
+               return;
+
        ddebug("Shutting down request manager");
        dns_requestmgr_shutdown(requestmgr);
 
@@ -2979,6 +2983,8 @@ send_gssrequest(isc_sockaddr_t *destaddr, dns_message_t *msg,
        isc_sockaddr_t *srcaddr;
 
        debug("send_gssrequest");
+       REQUIRE(destaddr != NULL);
+
        reqinfo = isc_mem_get(gmctx, sizeof(nsu_gssinfo_t));
        if (reqinfo == NULL)
                fatal("out of memory");
@@ -3269,20 +3275,6 @@ cleanup(void) {
                ddebug("Detaching GSS-TSIG keyring");
                dns_tsigkeyring_detach(&gssring);
        }
-       if (kserver != NULL) {
-               isc_mem_put(gmctx, kserver, sizeof(isc_sockaddr_t));
-               kserver = NULL;
-       }
-       if (realm != NULL) {
-               isc_mem_free(gmctx, realm);
-               realm = NULL;
-       }
-       if (dns_name_dynamic(&tmpzonename)) {
-               dns_name_free(&tmpzonename, gmctx);
-       }
-       if (dns_name_dynamic(&restart_master)) {
-               dns_name_free(&restart_master, gmctx);
-       }
 #endif
 
        if (sig0key != NULL)
@@ -3306,6 +3298,26 @@ cleanup(void) {
        ddebug("Destroying name state");
        dns_name_destroy();
 
+#ifdef GSSAPI
+       /*
+        * Cleanup GSSAPI resources after taskmgr has been destroyed.
+        */
+       if (kserver != NULL) {
+               isc_mem_put(gmctx, kserver, sizeof(isc_sockaddr_t));
+               kserver = NULL;
+       }
+       if (realm != NULL) {
+               isc_mem_free(gmctx, realm);
+               realm = NULL;
+       }
+       if (dns_name_dynamic(&tmpzonename)) {
+               dns_name_free(&tmpzonename, gmctx);
+       }
+       if (dns_name_dynamic(&restart_master)) {
+               dns_name_free(&restart_master, gmctx);
+       }
+#endif
+
        ddebug("Removing log context");
        isc_log_destroy(&glctx);