# HG changeset patch # User Mike Becker # Date 1702823630 -3600 # Node ID 30d484806c2b6f30dc3a52707ddff1d980c7eb5a # Parent d479b5e25b6ec3973b0dee7b76e500df112563c1 fix faulty string to int conversion utilities Probably it was expected that errno is set to EINVAL when illegal characters are encountered. But this is not standard and does not happen on every system, allowing illegal strings to be parsed as valid integers. diff -r d479b5e25b6e -r 30d484806c2b libidav/utils.c --- a/libidav/utils.c Sun Dec 17 15:22:34 2023 +0100 +++ b/libidav/utils.c Sun Dec 17 15:33:50 2023 +0100 @@ -213,10 +213,11 @@ } int util_strtouint(const char *str, uint64_t *value) { + if (str == NULL || *str == '\0') return 0; char *end; errno = 0; uint64_t val = strtoull(str, &end, 0); - if(errno == 0) { + if(errno == 0 && *end == '\0') { *value = val; return 1; } else { @@ -225,10 +226,11 @@ } int util_strtoint(const char *str, int64_t *value) { + if (str == NULL || *str == '\0') return 0; char *end; errno = 0; int64_t val = strtoll(str, &end, 0); - if(errno == 0) { + if(errno == 0 && *end == '\0') { *value = val; return 1; } else { @@ -237,11 +239,14 @@ } int util_szstrtouint(const char *str, uint64_t *value) { + if (str == NULL || *str == '\0') return 0; char *end; errno = 0; size_t len = strlen(str); uint64_t val = strtoull(str, &end, 0); - if(end == str+len) { + if(errno != 0) { + return 0; + } if(end == str+len) { *value = val; return 1; } else if(end == str+len-1) {