From 66f2cd228d9d6f02d9406e4e8469274b25adc3a4 Mon Sep 17 00:00:00 2001 From: Matthijs Mekking Date: Wed, 14 Apr 2021 09:19:20 +0200 Subject: [PATCH] Use isdigit instead of checking character range When looking for key files, we could use isdigit rather than checking if the character is within the range [0-9]. Use (unsigned char) cast to ensure the value is representable in the unsigned char type (as suggested by the isdigit manpage). Change " & 0xff" occurrences to the recommended (unsigned char) type cast. --- bin/named/unix/os.c | 2 +- lib/bind9/check.c | 1 + lib/dns/dnssec.c | 13 +++---------- lib/dns/name.c | 4 ++-- lib/dns/rcode.c | 4 ++-- lib/dns/rdata/generic/x25_19.c | 5 +++-- lib/dns/rdata/in_1/atma_34.c | 4 ++-- lib/isc/tm.c | 2 +- lib/isc/unix/dir.c | 2 +- lib/isc/win32/dir.c | 2 +- lib/isc/win32/file.c | 2 +- lib/ns/query.c | 3 ++- 12 files changed, 20 insertions(+), 24 deletions(-) diff --git a/bin/named/unix/os.c b/bin/named/unix/os.c index 99d570a7c6..b434ff8e8b 100644 --- a/bin/named/unix/os.c +++ b/bin/named/unix/os.c @@ -379,7 +379,7 @@ all_digits(const char *s) { return (false); } while (*s != '\0') { - if (!isdigit((*s) & 0xff)) { + if (!isdigit((unsigned char)(*s))) { return (false); } s++; diff --git a/lib/bind9/check.c b/lib/bind9/check.c index 042ede21e5..a7837e6caf 100644 --- a/lib/bind9/check.c +++ b/lib/bind9/check.c @@ -11,6 +11,7 @@ /*! \file */ +#include #include #include #include diff --git a/lib/dns/dnssec.c b/lib/dns/dnssec.c index f2a107b5fd..acba420e1f 100644 --- a/lib/dns/dnssec.c +++ b/lib/dns/dnssec.c @@ -11,6 +11,7 @@ /*! \file */ +#include #include #include #include @@ -1433,8 +1434,7 @@ dns_dnssec_findmatchingkeys(const dns_name_t *origin, const char *directory, alg = 0; for (i = len + 1 + 1; i < dir.entry.length; i++) { - if (dir.entry.name[i] < '0' || dir.entry.name[i] > '9') - { + if (!isdigit((unsigned char)dir.entry.name[i])) { break; } alg *= 10; @@ -1452,15 +1452,8 @@ dns_dnssec_findmatchingkeys(const dns_name_t *origin, const char *directory, } for (i++; i < dir.entry.length; i++) { - if (dir.entry.name[i] < '0' || dir.entry.name[i] > '9') - { + if (!isdigit((unsigned char)dir.entry.name[i])) { break; - - /* - * Did we not read exactly 5 more digits? - * Did we overflow? - * Did we correctly terminate? - */ } } diff --git a/lib/dns/name.c b/lib/dns/name.c index dc7f62b1f1..b6657f620a 100644 --- a/lib/dns/name.c +++ b/lib/dns/name.c @@ -1204,7 +1204,7 @@ dns_name_fromtext(dns_name_t *name, isc_buffer_t *source, POST(state); /* FALLTHROUGH */ case ft_escape: - if (!isdigit(c & 0xff)) { + if (!isdigit((unsigned char)c)) { if (count >= 63) { return (DNS_R_LABELTOOLONG); } @@ -1224,7 +1224,7 @@ dns_name_fromtext(dns_name_t *name, isc_buffer_t *source, state = ft_escdecimal; /* FALLTHROUGH */ case ft_escdecimal: - if (!isdigit(c & 0xff)) { + if (!isdigit((unsigned char)c)) { return (DNS_R_BADESCAPE); } value *= 10; diff --git a/lib/dns/rcode.c b/lib/dns/rcode.c index 2581970639..ef046b3322 100644 --- a/lib/dns/rcode.c +++ b/lib/dns/rcode.c @@ -219,8 +219,8 @@ maybe_numeric(unsigned int *valuep, isc_textregion_t *source, unsigned int max, char buffer[NUMBERSIZE]; int v; - if (!isdigit(source->base[0] & 0xff) || source->length > NUMBERSIZE - 1) - { + if (!isdigit((unsigned char)source->base[0]) || + source->length > NUMBERSIZE - 1) { return (ISC_R_BADNUMBER); } diff --git a/lib/dns/rdata/generic/x25_19.c b/lib/dns/rdata/generic/x25_19.c index 80ef247600..0ba32d582f 100644 --- a/lib/dns/rdata/generic/x25_19.c +++ b/lib/dns/rdata/generic/x25_19.c @@ -35,7 +35,8 @@ fromtext_x25(ARGS_FROMTEXT) { RETTOK(DNS_R_SYNTAX); } for (i = 0; i < token.value.as_textregion.length; i++) { - if (!isdigit(token.value.as_textregion.base[i] & 0xff)) { + if (!isdigit((unsigned char)token.value.as_textregion.base[i])) + { RETTOK(ISC_R_RANGE); } } @@ -125,7 +126,7 @@ fromstruct_x25(ARGS_FROMSTRUCT) { } for (i = 0; i < x25->x25_len; i++) { - if (!isdigit(x25->x25[i] & 0xff)) { + if (!isdigit((unsigned char)x25->x25[i])) { return (ISC_R_RANGE); } } diff --git a/lib/dns/rdata/in_1/atma_34.c b/lib/dns/rdata/in_1/atma_34.c index 893e8cda82..07a9198e53 100644 --- a/lib/dns/rdata/in_1/atma_34.c +++ b/lib/dns/rdata/in_1/atma_34.c @@ -91,7 +91,7 @@ fromtext_in_atma(ARGS_FROMTEXT) { lastwasperiod = true; continue; } - if ((sr->base[0] < '0') || (sr->base[0] > '9')) { + if (!isdigit((unsigned char)sr->base[0])) { RETTOK(DNS_R_SYNTAX); } RETERR(mem_tobuffer(target, sr->base, 1)); @@ -157,7 +157,7 @@ fromwire_in_atma(ARGS_FROMWIRE) { if (region.base[0] == 1) { unsigned int i; for (i = 1; i < region.length; i++) { - if (region.base[i] < '0' || region.base[i] > '9') { + if (!isdigit((unsigned char)region.base[i])) { return (DNS_R_FORMERR); } } diff --git a/lib/isc/tm.c b/lib/isc/tm.c index 5309b14664..9c0a8e36f1 100644 --- a/lib/isc/tm.c +++ b/lib/isc/tm.c @@ -89,7 +89,7 @@ conv_num(const char **buf, int *dest, int llim, int ulim) { /* The limit also determines the number of valid digits. */ int rulim = ulim; - if (**buf < '0' || **buf > '9') { + if (!isdigit((unsigned char)**buf)) { return (0); } diff --git a/lib/isc/unix/dir.c b/lib/isc/unix/dir.c index 29e4bb794e..49367956fd 100644 --- a/lib/isc/unix/dir.c +++ b/lib/isc/unix/dir.c @@ -230,7 +230,7 @@ isc_dir_createunique(char *templet) { */ p = x; while (*p != '\0') { - if (isdigit(*p & 0xff)) { + if (isdigit((unsigned char)*p)) { *p = 'a'; } else if (*p != 'z') { ++*p; diff --git a/lib/isc/win32/dir.c b/lib/isc/win32/dir.c index 006f60a981..cbfc0dc98e 100644 --- a/lib/isc/win32/dir.c +++ b/lib/isc/win32/dir.c @@ -273,7 +273,7 @@ isc_dir_createunique(char *templet) { */ p = x; while (*p != '\0') { - if (isdigit(*p & 0xff)) { + if (isdigit((unsigned char)*p)) { *p = 'a'; } else if (*p != 'z') { ++*p; diff --git a/lib/isc/win32/file.c b/lib/isc/win32/file.c index 624b24d71e..e1d3c89141 100644 --- a/lib/isc/win32/file.c +++ b/lib/isc/win32/file.c @@ -102,7 +102,7 @@ gettemp(char *path, bool binary, int *doopen) { if (*trv == 'z') { *trv++ = 'a'; } else { - if (isdigit(*trv)) { + if (isdigit((unsigned char)*trv)) { *trv = 'a'; } else { ++*trv; diff --git a/lib/ns/query.c b/lib/ns/query.c index f15101ced2..67c65f0fe5 100644 --- a/lib/ns/query.c +++ b/lib/ns/query.c @@ -11,6 +11,7 @@ /*! \file */ +#include #include #include #include @@ -5352,7 +5353,7 @@ get_root_key_sentinel_id(query_ctx_t *qctx, const char *ndata) { int i; for (i = 0; i < 5; i++) { - if (ndata[i] < '0' || ndata[i] > '9') { + if (!isdigit((unsigned char)ndata[i])) { return (false); } v *= 10;