summaryrefslogtreecommitdiff
path: root/config.c
diff options
context:
space:
mode:
authorPhillip Wood <phillip.wood@dunelm.org.uk>2022-11-09 14:16:27 (GMT)
committerTaylor Blau <me@ttaylorr.com>2022-11-10 02:30:39 (GMT)
commit7595c0ece1d45ca540f26cecf485285f5ce8186f (patch)
treee91b323a5b5e2f12b7ff97ed8b71782897c9dde4 /config.c
parent84356ff7709bd45c7e61632f1b837a7144a5178f (diff)
downloadgit-7595c0ece1d45ca540f26cecf485285f5ce8186f.zip
git-7595c0ece1d45ca540f26cecf485285f5ce8186f.tar.gz
git-7595c0ece1d45ca540f26cecf485285f5ce8186f.tar.bz2
config: require at least one digit when parsing numbers
If the input to strtoimax() or strtoumax() does not contain any digits then they return zero and set `end` to point to the start of the input string. git_parse_[un]signed() do not check `end` and so fail to return an error and instead return a value of zero if the input string is a valid units factor without any digits (e.g "k"). Tests are added to check that 'git config --int' and OPT_MAGNITUDE() reject a units specifier without a leading digit. Helped-by: Jeff King <peff@peff.net> Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Taylor Blau <me@ttaylorr.com>
Diffstat (limited to 'config.c')
-rw-r--r--config.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/config.c b/config.c
index d5069d4..b7fb680 100644
--- a/config.c
+++ b/config.c
@@ -1167,6 +1167,10 @@ static int git_parse_signed(const char *value, intmax_t *ret, intmax_t max)
val = strtoimax(value, &end, 0);
if (errno == ERANGE)
return 0;
+ if (end == value) {
+ errno = EINVAL;
+ return 0;
+ }
factor = get_unit_factor(end);
if (!factor) {
errno = EINVAL;
@@ -1202,6 +1206,10 @@ static int git_parse_unsigned(const char *value, uintmax_t *ret, uintmax_t max)
val = strtoumax(value, &end, 0);
if (errno == ERANGE)
return 0;
+ if (end == value) {
+ errno = EINVAL;
+ return 0;
+ }
factor = get_unit_factor(end);
if (!factor) {
errno = EINVAL;