From: Matthijs Mekking Date: Fri, 8 Mar 2024 11:12:50 +0000 (+0100) Subject: Detect invalid durations X-Git-Tag: v9.19.23~37^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e39de45adc435629ef8925edc5022bf15c8971a3;p=thirdparty%2Fbind9.git Detect invalid durations Be stricter in durations that are accepted. Basically we accept ISO 8601 formats, but fail to detect garbage after the integers in such strings. For example, 'P7.5D' will be treated as 7 days. Pass 'endptr' to 'strtoll' and check if the endptr is at the correct suffix. --- diff --git a/bin/tests/system/checkconf/bad-kasp-duration.conf b/bin/tests/system/checkconf/bad-kasp-duration.conf new file mode 100644 index 00000000000..74f08271b72 --- /dev/null +++ b/bin/tests/system/checkconf/bad-kasp-duration.conf @@ -0,0 +1,25 @@ +/* + * Copyright (C) Internet Systems Consortium, Inc. ("ISC") + * + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * See the COPYRIGHT file distributed with this work for additional + * information regarding copyright ownership. + */ + +dnssec-policy "invalid-sigrefresh" { + keys { + csk lifetime unlimited algorithm 13; + }; + signatures-refresh P7.5D; +}; + +zone "example.net" { + type primary; + file "example.db"; + dnssec-policy "invalid-sigrefresh"; +}; diff --git a/lib/isccfg/duration.c b/lib/isccfg/duration.c index edb8370f406..ee1c5707861 100644 --- a/lib/isccfg/duration.c +++ b/lib/isccfg/duration.c @@ -44,6 +44,7 @@ isccfg_duration_fromtext(isc_textregion_t *source, bool not_weeks = false; int i; long long int lli; + char *endptr; /* * Copy the buffer as it may not be NULL terminated. @@ -75,7 +76,11 @@ isccfg_duration_fromtext(isc_textregion_t *source, X = strpbrk(str, "Yy"); if (X != NULL) { errno = 0; - lli = strtoll(str + 1, NULL, 10); + endptr = NULL; + lli = strtoll(str + 1, &endptr, 10); + if (*endptr != *X) { + return (ISC_R_BADNUMBER); + } if (errno != 0 || lli < 0 || lli > UINT32_MAX) { return (ISC_R_BADNUMBER); } @@ -93,7 +98,10 @@ isccfg_duration_fromtext(isc_textregion_t *source, */ if (X != NULL && (T == NULL || (size_t)(X - P) < (size_t)(T - P))) { errno = 0; - lli = strtoll(str + 1, NULL, 10); + lli = strtoll(str + 1, &endptr, 10); + if (*endptr != *X) { + return (ISC_R_BADNUMBER); + } if (errno != 0 || lli < 0 || lli > UINT32_MAX) { return (ISC_R_BADNUMBER); } @@ -106,7 +114,10 @@ isccfg_duration_fromtext(isc_textregion_t *source, X = strpbrk(str, "Dd"); if (X != NULL) { errno = 0; - lli = strtoll(str + 1, NULL, 10); + lli = strtoll(str + 1, &endptr, 10); + if (*endptr != *X) { + return (ISC_R_BADNUMBER); + } if (errno != 0 || lli < 0 || lli > UINT32_MAX) { return (ISC_R_BADNUMBER); } @@ -125,7 +136,10 @@ isccfg_duration_fromtext(isc_textregion_t *source, X = strpbrk(str, "Hh"); if (X != NULL && T != NULL) { errno = 0; - lli = strtoll(str + 1, NULL, 10); + lli = strtoll(str + 1, &endptr, 10); + if (*endptr != *X) { + return (ISC_R_BADNUMBER); + } if (errno != 0 || lli < 0 || lli > UINT32_MAX) { return (ISC_R_BADNUMBER); } @@ -143,7 +157,10 @@ isccfg_duration_fromtext(isc_textregion_t *source, */ if (X != NULL && T != NULL && (size_t)(X - P) > (size_t)(T - P)) { errno = 0; - lli = strtoll(str + 1, NULL, 10); + lli = strtoll(str + 1, &endptr, 10); + if (*endptr != *X) { + return (ISC_R_BADNUMBER); + } if (errno != 0 || lli < 0 || lli > UINT32_MAX) { return (ISC_R_BADNUMBER); } @@ -156,7 +173,10 @@ isccfg_duration_fromtext(isc_textregion_t *source, X = strpbrk(str, "Ss"); if (X != NULL && T != NULL) { errno = 0; - lli = strtoll(str + 1, NULL, 10); + lli = strtoll(str + 1, &endptr, 10); + if (*endptr != *X) { + return (ISC_R_BADNUMBER); + } if (errno != 0 || lli < 0 || lli > UINT32_MAX) { return (ISC_R_BADNUMBER); } @@ -173,7 +193,10 @@ isccfg_duration_fromtext(isc_textregion_t *source, return (ISC_R_BADNUMBER); } else { errno = 0; - lli = strtoll(str + 1, NULL, 10); + lli = strtoll(str + 1, &endptr, 10); + if (*endptr != *W) { + return (ISC_R_BADNUMBER); + } if (errno != 0 || lli < 0 || lli > UINT32_MAX) { return (ISC_R_BADNUMBER); }