diff --git a/bin/nsupdate/nsupdate.c b/bin/nsupdate/nsupdate.c index 25bb3891ca..a205699a43 100644 --- a/bin/nsupdate/nsupdate.c +++ b/bin/nsupdate/nsupdate.c @@ -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);