diff --git a/bin/tests/system/logfileconfig/ns1/named.tsconf.in b/bin/tests/system/logfileconfig/ns1/named.tsconf.in index e7513edb49..7e62a93782 100644 --- a/bin/tests/system/logfileconfig/ns1/named.tsconf.in +++ b/bin/tests/system/logfileconfig/ns1/named.tsconf.in @@ -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; }; diff --git a/bin/tests/system/logfileconfig/tests.sh b/bin/tests/system/logfileconfig/tests.sh index 5fce3f9813..ec3e265d32 100644 --- a/bin/tests/system/logfileconfig/tests.sh +++ b/bin/tests/system/logfileconfig/tests.sh @@ -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)) diff --git a/lib/isc/log.c b/lib/isc/log.c index 8f48f4718d..031393d430 100644 --- a/lib/isc/log.c +++ b/lib/isc/log.c @@ -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) { - if (versions <= 0) { - return INT64_MAX; - } - int64_t to_keep[ISC_LOG_MAX_VERSIONS] = { 0 }; int64_t version = 0; + + if (versions <= 0) { + return (INT64_MAX); + } + 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().