]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
move item_out test inside lock in dns_dispatch_getnext()
authorMark Andrews <marka@isc.org>
Tue, 19 Mar 2019 03:14:21 +0000 (14:14 +1100)
committerEvan Hunt <each@isc.org>
Sat, 1 Jun 2019 07:48:03 +0000 (00:48 -0700)
(cherry picked from commit 60c42f849d520564ed42e5ed0ba46b4b69c07712)

lib/dns/dispatch.c

index 408beda3679ddbaae865d8f11ece74d08ec8f242..3278db4a07c2d7021fa4a66d7b491167f5062830 100644 (file)
@@ -134,7 +134,7 @@ struct dns_dispentry {
        isc_task_t                     *task;
        isc_taskaction_t                action;
        void                           *arg;
-       bool                    item_out;
+       bool                            item_out;
        dispsocket_t                    *dispsocket;
        ISC_LIST(dns_dispatchevent_t)   items;
        ISC_LINK(dns_dispentry_t)       link;
@@ -3422,13 +3422,14 @@ dns_dispatch_getnext(dns_dispentry_t *resp, dns_dispatchevent_t **sockevent) {
        disp = resp->disp;
        REQUIRE(VALID_DISPATCH(disp));
 
-       REQUIRE(resp->item_out == true);
-       resp->item_out = false;
-
        ev = *sockevent;
        *sockevent = NULL;
 
        LOCK(&disp->lock);
+
+       REQUIRE(resp->item_out == true);
+       resp->item_out = false;
+
        if (ev->buffer.base != NULL)
                free_buffer(disp, ev->buffer.base, ev->buffer.length);
        free_devent(disp, ev);
@@ -3573,6 +3574,9 @@ dns_dispatch_removeresponse(dns_dispentry_t **resp,
                isc_task_send(disp->task[0], &disp->ctlevent);
 }
 
+/*
+ * disp must be locked.
+ */
 static void
 do_cancel(dns_dispatch_t *disp) {
        dns_dispatchevent_t *ev;