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.
This commit is contained in:
25
bin/tests/system/checkconf/bad-kasp-duration.conf
Normal file
25
bin/tests/system/checkconf/bad-kasp-duration.conf
Normal file
@@ -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";
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user