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:
Matthijs Mekking
2024-03-08 12:12:50 +01:00
parent fd49abf254
commit e39de45adc
2 changed files with 55 additions and 7 deletions

View 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";
};

View File

@@ -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);
}