]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
make (named_server_t).reload_status atomic
authorMark Andrews <marka@isc.org>
Tue, 22 Sep 2020 23:37:35 +0000 (09:37 +1000)
committerMark Andrews <marka@isc.org>
Wed, 30 Sep 2020 14:47:53 +0000 (00:47 +1000)
    WARNING: ThreadSanitizer: data race
    Write of size 4 at 0x000000000001 by thread T1:
    #0 view_loaded bin/named/server.c:9678:25
    #1 call_loaddone lib/dns/zt.c:308:3
    #2 doneloading lib/dns/zt.c:582:3
    #3 zone_asyncload lib/dns/zone.c:2322:3
    #4 dispatch lib/isc/task.c:1152:7
    #5 run lib/isc/task.c:1344:2

    Previous read of size 4 at 0x000000000001 by thread T2:
    #0 named_server_status bin/named/server.c:11903:14
    #1 named_control_docommand bin/named/control.c:272:12
    #2 control_command bin/named/controlconf.c:390:17
    #3 dispatch lib/isc/task.c:1152:7
    #4 run lib/isc/task.c:1344:2

    Location is heap block of size 409 at 0x000000000011 allocated by main thread:
    #0 malloc <null>
    #1 default_memalloc lib/isc/mem.c:713:8
    #2 mem_get lib/isc/mem.c:622:8
    #3 mem_allocateunlocked lib/isc/mem.c:1268:8
    #4 isc___mem_allocate lib/isc/mem.c:1288:7
    #5 isc__mem_allocate lib/isc/mem.c:2453:10
    #6 isc___mem_get lib/isc/mem.c:1037:11
    #7 isc__mem_get lib/isc/mem.c:2432:10
    #8 named_server_create bin/named/server.c:9978:27
    #9 setup bin/named/main.c:1256:2
    #10 main bin/named/main.c:1523:2

    Thread T1 (running) created by main thread at:
    #0 pthread_create <null>
    #1 isc_thread_create lib/isc/pthreads/thread.c:73:8
    #2 isc_taskmgr_create lib/isc/task.c:1434:3
    #3 create_managers bin/named/main.c:915:11
    #4 setup bin/named/main.c:1223:11
    #5 main bin/named/main.c:1523:2

    Thread T2 (running) created by main thread at:
    #0 pthread_create <null>
    #1 isc_thread_create lib/isc/pthreads/thread.c:73:8
    #2 isc_taskmgr_create lib/isc/task.c:1434:3
    #3 create_managers bin/named/main.c:915:11
    #4 setup bin/named/main.c:1223:11
    #5 main bin/named/main.c:1523:2

    SUMMARY: ThreadSanitizer: data race bin/named/server.c:9678:25 in view_loaded

(cherry picked from commit b00ba7ac94b11fb085ac262e8d6848ed9d5f8f97)

bin/named/include/named/server.h
bin/named/server.c

index 670bd9f7109267a64dbf0a43614e6838c575f98b..b0006cc9503a3e113fda2a4a63a9866250c75041 100644 (file)
@@ -82,9 +82,9 @@ struct named_server {
        uint32_t interface_interval;
        uint32_t heartbeat_interval;
 
-       isc_mutex_t    reload_event_lock;
-       isc_event_t *  reload_event;
-       named_reload_t reload_status;
+       isc_mutex_t  reload_event_lock;
+       isc_event_t *reload_event;
+       atomic_int   reload_status;
 
        bool flushonshutdown;
 
index e6db74adbdde5b745cd9fac7835ded323fe08602..8077161ab4f809d665f32a1b19a5c71550ad7b38 100644 (file)
@@ -9676,7 +9676,7 @@ view_loaded(void *arg) {
                              "FIPS mode is %s",
                              FIPS_mode() ? "enabled" : "disabled");
 #endif /* ifdef HAVE_FIPS_MODE */
-               server->reload_status = NAMED_RELOAD_DONE;
+               atomic_store(&server->reload_status, NAMED_RELOAD_DONE);
 
                isc_log_write(named_g_lctx, NAMED_LOGCATEGORY_GENERAL,
                              NAMED_LOGMODULE_SERVER, ISC_LOG_NOTICE,
@@ -10013,7 +10013,7 @@ named_server_create(isc_mem_t *mctx, named_server_t **serverp) {
        CHECKFATAL(server->reload_event == NULL ? ISC_R_NOMEMORY
                                                : ISC_R_SUCCESS,
                   "allocating reload event");
-       server->reload_status = NAMED_RELOAD_IN_PROGRESS;
+       atomic_store(&server->reload_status, NAMED_RELOAD_IN_PROGRESS);
 
        /*
         * Setup the server task, which is responsible for coordinating
@@ -10329,7 +10329,7 @@ loadconfig(named_server_t *server) {
                              NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
                              "reloading configuration failed: %s",
                              isc_result_totext(result));
-               server->reload_status = NAMED_RELOAD_FAILED;
+               atomic_store(&server->reload_status, NAMED_RELOAD_FAILED);
        }
 
        return (result);
@@ -10338,7 +10338,9 @@ loadconfig(named_server_t *server) {
 static isc_result_t
 reload(named_server_t *server) {
        isc_result_t result;
-       server->reload_status = NAMED_RELOAD_IN_PROGRESS;
+
+       atomic_store(&server->reload_status, NAMED_RELOAD_IN_PROGRESS);
+
        CHECK(loadconfig(server));
 
        result = load_zones(server, false, false);
@@ -10351,7 +10353,7 @@ reload(named_server_t *server) {
                              NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
                              "reloading zones failed: %s",
                              isc_result_totext(result));
-               server->reload_status = NAMED_RELOAD_FAILED;
+               atomic_store(&server->reload_status, NAMED_RELOAD_FAILED);
        }
 cleanup:
        return (result);
@@ -10701,7 +10703,7 @@ named_server_reloadcommand(named_server_t *server, isc_lex_t *lex,
 isc_result_t
 named_server_reconfigcommand(named_server_t *server) {
        isc_result_t result;
-       server->reload_status = NAMED_RELOAD_IN_PROGRESS;
+       atomic_store(&server->reload_status, NAMED_RELOAD_IN_PROGRESS);
 
        CHECK(loadconfig(server));
 
@@ -10715,7 +10717,7 @@ named_server_reconfigcommand(named_server_t *server) {
                              NAMED_LOGMODULE_SERVER, ISC_LOG_ERROR,
                              "loading new zones failed: %s",
                              isc_result_totext(result));
-               server->reload_status = NAMED_RELOAD_FAILED;
+               atomic_store(&server->reload_status, NAMED_RELOAD_FAILED);
        }
 cleanup:
        return (result);
@@ -11823,6 +11825,7 @@ named_server_status(named_server_t *server, isc_buffer_t **text) {
        char boottime[ISC_FORMATHTTPTIMESTAMP_SIZE];
        char configtime[ISC_FORMATHTTPTIMESTAMP_SIZE];
        char line[1024], hostname[256];
+       named_reload_t reload_status;
 
        if (named_g_server->version_set) {
                ob = " (";
@@ -11926,9 +11929,10 @@ named_server_status(named_server_t *server, isc_buffer_t **text) {
                                                ns_statscounter_tcphighwater));
        CHECK(putstr(text, line));
 
-       if (server->reload_status != NAMED_RELOAD_DONE) {
+       reload_status = atomic_load(&server->reload_status);
+       if (reload_status != NAMED_RELOAD_DONE) {
                snprintf(line, sizeof(line), "reload/reconfig %s\n",
-                        (server->reload_status == NAMED_RELOAD_FAILED
+                        (reload_status == NAMED_RELOAD_FAILED
                                  ? "failed"
                                  : "in progress"));
                CHECK(putstr(text, line));