]> 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:49:53 +0000 (18:49 +1000)
CHANGES
lib/dns/dispatch.c

diff --git a/CHANGES b/CHANGES
index 2e0e6f53d0a9c1802240f8f95336b831242e61c6..ff9ecac4f2a1e00792f1cfabaa73e7732a58f09d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,5 @@
+3913.  [bug]           Address race issue in dispatch. [RT #36731]
+
 3912.  [bug]           Address some unrecoverable lookup failures. [RT #36330]
 
 3911.  [func]          Implement EDNS EXPIRE option client side, allowing
index b1d93788d10be9d90946c1dbcdc5e7266adcfa25..5a90ee5e7b7e47073544d870c2a06182c6317399 100644 (file)
@@ -1122,8 +1122,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) {
@@ -1134,8 +1134,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;
        }
 
@@ -1310,9 +1310,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);
 }
 
 /*
@@ -1494,9 +1493,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);
 }
 
 /*