]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
fixed a bug in rolling timestamp logfiles
authorEvan Hunt <each@isc.org>
Tue, 12 Oct 2021 23:31:47 +0000 (16:31 -0700)
committerEvan Hunt <each@isc.org>
Wed, 13 Oct 2021 15:31:47 +0000 (08:31 -0700)
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.

bin/tests/system/logfileconfig/ns1/named.tsconf.in
bin/tests/system/logfileconfig/tests.sh
lib/isc/log.c

index e7513edb4929d559f3ef7118049671d1ef93eeee..7e62a93782f23ce3073c75ecf818ae75a103cd12 100644 (file)
@@ -25,7 +25,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;
        };
index 5fce3f9813f0c61369a800e1aea8f6bab8d4cbdb..ec3e265d3293bb5b96d77abdb18439c5dd629358 100644 (file)
@@ -187,10 +187,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))
 
index 8f48f4718d8720e3c4cd1ab7ded451a2f5c39179..031393d4300b4a71da3128b39151badfc12395cd 100644 (file)
@@ -1088,7 +1088,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++;
@@ -1105,12 +1105,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;
        }
@@ -1119,6 +1120,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] != '.')
@@ -1126,8 +1130,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);
@@ -1145,12 +1148,13 @@ 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;
        char sep = '/';
+
        /*
         * It is safe to DE_CONST the file.name because it was copied
         * with isc_mem_strdup().