]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3913. [bug] Address race issue in dispatch. [RT #36731]
authorMark Andrews <marka@isc.org>
Wed, 6 Aug 2014 08:49:53 +0000 (18:49 +1000)
committerMark Andrews <marka@isc.org>
Wed, 6 Aug 2014 08:51:51 +0000 (18:51 +1000)
(cherry picked from commit 493f3eb297ea90ad2eb349591f1cb88194dce46d)

CHANGES
lib/dns/dispatch.c

diff --git a/CHANGES b/CHANGES
index 6a51fb890fe739e5dbb974c65ba81b0705146a95..b2a301cd8827ec9356b9227e3aa39ef924824a60 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,7 @@
        --- 9.8.8b2 released ---
 
+3913.  [bug]           Address race issue in dispatch. [RT #36731]
+
 3910.  [bug]           Fix races to free event during shutdown. [RT#36720]
 
 3909.  [bug]           When computing the number of elements required for a
index 992623d27f1ab25d32605cc4155eb4b80066e623..7dd63ce86491371bc4d478390f52390a785af013 100644 (file)
@@ -1245,8 +1245,8 @@ udp_recv(isc_event_t *ev_in, dns_dispatch_t *disp, dispsocket_t *dispsock) {
                } else {
                        free_buffer(disp, ev->region.base, ev->region.length);
 
-                       UNLOCK(&disp->lock);
                        isc_event_free(&ev_in);
+                       UNLOCK(&disp->lock);
                        return;
                }
        } else if (ev->result != ISC_R_SUCCESS) {
@@ -1257,8 +1257,8 @@ udp_recv(isc_event_t *ev_in, dns_dispatch_t *disp, dispsocket_t *dispsock) {
                                     "odd socket result in udp_recv(): %s",
                                     isc_result_totext(ev->result));
 
-               UNLOCK(&disp->lock);
                isc_event_free(&ev_in);
+               UNLOCK(&disp->lock);
                return;
        }
 
@@ -1432,9 +1432,8 @@ udp_recv(isc_event_t *ev_in, dns_dispatch_t *disp, dispsocket_t *dispsock) {
                 */
                deactivate_dispsocket(disp, dispsock);
        }
-       UNLOCK(&disp->lock);
-
        isc_event_free(&ev_in);
+       UNLOCK(&disp->lock);
 }
 
 /*
@@ -1616,9 +1615,8 @@ tcp_recv(isc_task_t *task, isc_event_t *ev_in) {
  restart:
        (void)startrecv(disp, NULL);
 
-       UNLOCK(&disp->lock);
-
        isc_event_free(&ev_in);
+       UNLOCK(&disp->lock);
 }
 
 /*