]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2403. [bug] TSIG context leak. [RT #18341]
authorMark Andrews <marka@isc.org>
Mon, 28 Jul 2008 08:57:19 +0000 (08:57 +0000)
committerMark Andrews <marka@isc.org>
Mon, 28 Jul 2008 08:57:19 +0000 (08:57 +0000)
CHANGES
lib/dns/message.c
lib/dns/xfrin.c

diff --git a/CHANGES b/CHANGES
index d3ece648f9dc82e9db6b5999b0a54f620dec29b7..9efd071d522d44a81eb14bd50f319990c28e7f87 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+2403.  [bug]           TSIG context leak. [RT #18341]
+
 2402.  [port]          Support Solaris 2.11 and over. [RT #18362]
 
 2401.  [bug]           Expect to get E[MN]FILE errno internal_accept()
index e16bb385af1f1ee755112125908f8b24a9812762..9b49a8d1bcedb079b56be569a3d2ab23f908182a 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: message.c,v 1.194.2.10.2.28 2007/08/28 07:19:13 tbox Exp $ */
+/* $Id: message.c,v 1.194.2.10.2.28.4.1 2008/07/28 08:57:19 marka Exp $ */
 
 /***
  *** Imports
@@ -590,6 +590,9 @@ msgreset(dns_message_t *msg, isc_boolean_t everything) {
                msg->tsigkey = NULL;
        }
 
+       if (msg->tsigctx != NULL)
+               dst_context_destroy(&msg->tsigctx);
+
        if (msg->query.base != NULL) {
                if (msg->free_query != 0)
                        isc_mem_put(msg->mctx, msg->query.base,
index ecd31c4fe8023abf92b46bf90db80606a4548bfd..460b7761ccea6b16814bc074369131cd57de523e 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: xfrin.c,v 1.124.2.4.2.21.4.3 2008/07/23 23:16:26 marka Exp $ */
+/* $Id: xfrin.c,v 1.124.2.4.2.21.4.4 2008/07/28 08:57:19 marka Exp $ */
 
 #include <config.h>
 
@@ -1046,6 +1046,8 @@ xfrin_send_request(dns_xfrin_ctx_t *xfr) {
        xfr->id++;
        xfr->nmsg = 0;
        msg->id = xfr->id;
+       if (xfr->tsigctx != NULL)
+               dst_context_destroy(&xfr->tsigctx);
 
        CHECK(render(msg, xfr->mctx, &xfr->qbuffer));
 
@@ -1181,7 +1183,10 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) {
 
        CHECK(dns_message_settsigkey(msg, xfr->tsigkey));
        CHECK(dns_message_setquerytsig(msg, xfr->lasttsig));
+
        msg->tsigctx = xfr->tsigctx;
+       xfr->tsigctx = NULL;
+       
        if (xfr->nmsg > 0)
                msg->tcp_continuation = 1;
 
@@ -1294,9 +1299,11 @@ xfrin_recv_done(isc_task_t *task, isc_event_t *ev) {
        xfr->nmsg++;
 
        /*
-        * Copy the context back.
+        * Take the context back.
         */
+       INSIST(xfr->tsigctx == NULL);
        xfr->tsigctx = msg->tsigctx;
+       msg->tsigctx = NULL;
 
        dns_message_destroy(&msg);
 
@@ -1392,6 +1399,9 @@ maybe_free(dns_xfrin_ctx_t *xfr) {
        if (xfr->tcpmsg_valid)
                dns_tcpmsg_invalidate(&xfr->tcpmsg);
 
+       if (xfr->tsigctx != NULL)
+               dst_context_destroy(&xfr->tsigctx);
+
        if ((xfr->name.attributes & DNS_NAMEATTR_DYNAMIC) != 0)
                dns_name_free(&xfr->name, xfr->mctx);