]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Remove optimisation on obtaining a headlock as it triggers a tsan.
authorMark Andrews <marka@isc.org>
Thu, 27 Aug 2020 03:21:13 +0000 (13:21 +1000)
committerMark Andrews <marka@isc.org>
Mon, 7 Sep 2020 23:25:43 +0000 (09:25 +1000)
WARNING: ThreadSanitizer: data race (pid=15898)
  Write of size 8 at 0x7b6400011818 by thread T9 (mutexes: write M1597):
    #0 get_client /builds/isc-projects/bind9/bin/named/client.c:3876:3 (named+0x4db171)
    #1 ns_client_replace /builds/isc-projects/bind9/bin/named/client.c:3710:12 (named+0x4d737b)
    #2 query_recurse /builds/isc-projects/bind9/bin/named/query.c:4325:13 (named+0x4ff469)
    #3 query_find /builds/isc-projects/bind9/bin/named/query.c (named+0x4fb949)
    #4 ns_query_start /builds/isc-projects/bind9/bin/named/query.c:9675:8 (named+0x4f37cb)
    #5 client_request /builds/isc-projects/bind9/bin/named/client.c:3112:3 (named+0x4de9ef)
    #6 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x50845)
    #7 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d799)

  Previous read of size 8 at 0x7b6400011818 by thread T2:
    #0 exit_check /builds/isc-projects/bind9/bin/named/client.c:698:5 (named+0x4d5d22)
    #1 ns_client_detach /builds/isc-projects/bind9/bin/named/client.c:3687:8 (named+0x4d7762)
    #2 query_find /builds/isc-projects/bind9/bin/named/query.c (named+0x4f9021)
    #3 query_resume /builds/isc-projects/bind9/bin/named/query.c:4164:12 (named+0x509b68)
    #4 dispatch /builds/isc-projects/bind9/lib/isc/task.c:1157:7 (libisc.so.1107+0x50845)
    #5 run /builds/isc-projects/bind9/lib/isc/task.c:1331:2 (libisc.so.1107+0x4d799)

lib/isc/include/isc/queue.h

index 210f302c84b61137579df43aa1db8dde4ad389fc..d682ba49403236ece9abad62f05dd8ca2370c59b 100644 (file)
        do { \
                bool headlocked = false; \
                ISC_QLINK_INSIST(!ISC_QLINK_LINKED(elt, link)); \
-               if ((queue).head == NULL) { \
-                       LOCK(&(queue).headlock); \
-                       headlocked = true; \
-               } \
                LOCK(&(queue).taillock); \
-               if ((queue).tail == NULL && !headlocked) { \
+               if ((queue).tail == NULL) { \
                        UNLOCK(&(queue).taillock); \
                        LOCK(&(queue).headlock); \
                        LOCK(&(queue).taillock); \