From: Evan Hunt Date: Tue, 12 Oct 2021 23:31:47 +0000 (-0700) Subject: fixed a bug in rolling timestamp logfiles X-Git-Tag: v9.16.40~11^2~2 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=6e422ae3ae3e3c88a3a17a177b08b251ce5bb3d5;p=thirdparty%2Fbind9.git fixed a bug in rolling timestamp logfiles due to comparing logfile suffixes as 32 bit rather than 64 bit integers, logfiles with timestamp suffixes that should have been removed when rolling could be left in place. this has been fixed. (cherry picked from commit 9a9e906306e1bf5c358572643798d94ce5fc36a1) --- diff --git a/bin/tests/system/logfileconfig/ns1/named.tsconf.in b/bin/tests/system/logfileconfig/ns1/named.tsconf.in index 38ddaaab153..4b0f8af55f3 100644 --- a/bin/tests/system/logfileconfig/ns1/named.tsconf.in +++ b/bin/tests/system/logfileconfig/ns1/named.tsconf.in @@ -27,7 +27,7 @@ options { logging { channel default_log { buffered no; - file "named_ts" versions 10 size 1000 suffix timestamp; # small size + file "named_ts" versions 3 size 1000 suffix timestamp; # small size severity debug 100; print-time yes; }; diff --git a/bin/tests/system/logfileconfig/tests.sh b/bin/tests/system/logfileconfig/tests.sh index c423eb137ad..11ade7df6ed 100644 --- a/bin/tests/system/logfileconfig/tests.sh +++ b/bin/tests/system/logfileconfig/tests.sh @@ -194,10 +194,22 @@ ret=0 copy_setports ns1/named.tsconf.in ns1/named.conf # a seconds since epoch version number touch ns1/named_ts.1480039317 +# a timestamp version number +touch ns1/named_ts.20150101120000120 rndc_reconfig ns1 10.53.0.1 > rndc.out.test$n -$DIG version.bind txt ch @10.53.0.1 -p ${PORT} > dig.out.test$n -grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 -test_with_retry -f ns1/named_ts.1480039317 && ret=1 +_found2() ( + $DIG version.bind txt ch @10.53.0.1 -p ${PORT} > dig.out.test$n + grep "status: NOERROR" dig.out.test$n > /dev/null || ret=1 + + # we are configured to keep three versions, so the oldest + # timestamped versions should be gone, and there should + # be two new ones. + [ -f ns1/named_ts.1480039317 ] && return 1 + [ -f ns1/named_ts.20150101120000120 ] && return 1 + set -- ns1/named_ts.* + [ "$#" -eq 2 ] || return 1 +) +retry_quiet 5 _found2 || ret=1 if [ "$ret" -ne 0 ]; then echo_i "failed"; fi status=$((status+ret)) diff --git a/lib/isc/log.c b/lib/isc/log.c index 0dc31bca04f..b15d66a601e 100644 --- a/lib/isc/log.c +++ b/lib/isc/log.c @@ -1103,7 +1103,7 @@ greatest_version(isc_logfile_t *file, int versions, int *greatestp) { } static void -insert_sort(int64_t to_keep[], int64_t versions, int version) { +insert_sort(int64_t to_keep[], int64_t versions, int64_t version) { int i = 0; while (i < versions && version < to_keep[i]) { i++; @@ -1120,12 +1120,13 @@ insert_sort(int64_t to_keep[], int64_t versions, int version) { static int64_t last_to_keep(int64_t versions, isc_dir_t *dirp, char *bname, size_t bnamelen) { + int64_t to_keep[ISC_LOG_MAX_VERSIONS] = { 0 }; + int64_t version = 0; + if (versions <= 0) { - return INT64_MAX; + return (INT64_MAX); } - int64_t to_keep[ISC_LOG_MAX_VERSIONS] = { 0 }; - int64_t version = 0; if (versions > ISC_LOG_MAX_VERSIONS) { versions = ISC_LOG_MAX_VERSIONS; } @@ -1134,6 +1135,9 @@ last_to_keep(int64_t versions, isc_dir_t *dirp, char *bname, size_t bnamelen) { */ memset(to_keep, 0, sizeof(to_keep)); while (isc_dir_read(dirp) == ISC_R_SUCCESS) { + char *digit_end = NULL; + char *ename = NULL; + if (dirp->entry.length <= bnamelen || strncmp(dirp->entry.name, bname, bnamelen) != 0 || dirp->entry.name[bnamelen] != '.') @@ -1141,8 +1145,7 @@ last_to_keep(int64_t versions, isc_dir_t *dirp, char *bname, size_t bnamelen) { continue; } - char *digit_end; - char *ename = &dirp->entry.name[bnamelen + 1]; + ename = &dirp->entry.name[bnamelen + 1]; version = strtoull(ename, &digit_end, 10); if (*digit_end == '\0') { insert_sort(to_keep, versions, version); @@ -1160,8 +1163,8 @@ last_to_keep(int64_t versions, isc_dir_t *dirp, char *bname, size_t bnamelen) { static isc_result_t remove_old_tsversions(isc_logfile_t *file, int versions) { isc_result_t result; - char *bname, *digit_end; - const char *dirname; + char *bname = NULL, *digit_end = NULL; + const char *dirname = NULL; int64_t version, last = INT64_MAX; size_t bnamelen; isc_dir_t dir;