diff --git a/CHANGES b/CHANGES index 4bd6c74b3b..0c77506969 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +6274. [bug] The 'lock-file' file was being removed when it + shouldn't have been making it ineffective if named was + started 3 or more times. [GL #4387] + 6271. [bug] Fix a shutdown race in dns__catz_update_cb(). [GL #4381] 6267. [func] Adjust UDP timeouts used in zone maintenance. [GL #4260] diff --git a/bin/named/os.c b/bin/named/os.c index 7af47294ba..0222abb7c2 100644 --- a/bin/named/os.c +++ b/bin/named/os.c @@ -552,17 +552,19 @@ cleanup_pidfile(void) { } static void -cleanup_lockfile(void) { +cleanup_lockfile(bool unlink_lockfile) { if (singletonfd != -1) { close(singletonfd); singletonfd = -1; } if (lockfile != NULL) { - int n = unlink(lockfile); - if (n == -1 && errno != ENOENT) { - named_main_earlywarning("unlink '%s': failed", - lockfile); + if (unlink_lockfile) { + int n = unlink(lockfile); + if (n == -1 && errno != ENOENT) { + named_main_earlywarning("unlink '%s': failed", + lockfile); + } } free(lockfile); lockfile = NULL; @@ -830,7 +832,7 @@ named_os_issingleton(const char *filename) { if (ret == -1) { named_main_earlywarning("couldn't create '%s'", filename); - cleanup_lockfile(); + cleanup_lockfile(false); return (false); } } @@ -842,7 +844,7 @@ named_os_issingleton(const char *filename) { singletonfd = open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (singletonfd == -1) { - cleanup_lockfile(); + cleanup_lockfile(false); return (false); } @@ -854,8 +856,7 @@ named_os_issingleton(const char *filename) { /* Non-blocking (does not wait for lock) */ if (fcntl(singletonfd, F_SETLK, &lock) == -1) { - close(singletonfd); - singletonfd = -1; + cleanup_lockfile(false); return (false); } @@ -866,7 +867,7 @@ void named_os_shutdown(void) { closelog(); cleanup_pidfile(); - cleanup_lockfile(); + cleanup_lockfile(true); } void diff --git a/bin/tests/system/runtime/tests.sh b/bin/tests/system/runtime/tests.sh index e4be62cf07..ed282ff1fb 100644 --- a/bin/tests/system/runtime/tests.sh +++ b/bin/tests/system/runtime/tests.sh @@ -81,12 +81,14 @@ status=$((status+ret)) n=$((n+1)) echo_i "verifying that named checks for conflicting named processes ($n)" ret=0 +test -f ns2/named.lock || ret=1 testpid=$(run_named ns2 named$n.run -c named-alt2.conf -D runtime-ns2-extra-2 -X named.lock) test -n "$testpid" || ret=1 retry_quiet 10 check_named_log "another named process" ns2/named$n.run || ret=1 test -n "$testpid" && retry_quiet 10 check_pid $testpid || ret=1 test -n "$testpid" && kill -15 $testpid > kill$n.out 2>&1 && ret=1 test -n "$testpid" && retry_quiet 10 check_pid $testpid || ret=1 +test -f ns2/named.lock || ret=1 if [ $ret -ne 0 ]; then echo_i "failed"; fi status=$((status+ret)) diff --git a/doc/notes/notes-current.rst b/doc/notes/notes-current.rst index 1c3a09a6f1..b857f117a3 100644 --- a/doc/notes/notes-current.rst +++ b/doc/notes/notes-current.rst @@ -39,6 +39,10 @@ Bug Fixes DNSSEC records, it was scheduled to be resigning. This unwanted behavior has been fixed. :gl:`#4350` +- The :any:`lock-file` file was being removed when it shouldn't + have been making it ineffective if named was started 3 or more + times. :gl:`#4387` + Known Issues ~~~~~~~~~~~~