Skip to content

Commit 84356ff

Browse files
phillipwoodttaylorr
authored andcommitted
git_parse_unsigned: reject negative values
git_parse_unsigned() relies on strtoumax() which unfortunately parses negative values as large positive integers. Fix this by rejecting any string that contains '-' as we do in strtoul_ui(). I've chosen to treat negative numbers as invalid input and set errno to EINVAL rather than ERANGE one the basis that they are never acceptable if we're looking for a unsigned integer. This is also consistent with the existing behavior of rejecting "1–2" with EINVAL. As we do not have unit tests for this function it is tested indirectly by checking that negative values of reject for core.bigFileThreshold are rejected. As this function is also used by OPT_MAGNITUDE() a test is added to check that rejects negative values too. Helped-by: Jeff King <[email protected]> Signed-off-by: Phillip Wood <[email protected]> Signed-off-by: Taylor Blau <[email protected]>
1 parent d5b4139 commit 84356ff

File tree

3 files changed

+16
-0
lines changed

3 files changed

+16
-0
lines changed

config.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,6 +1193,11 @@ static int git_parse_unsigned(const char *value, uintmax_t *ret, uintmax_t max)
11931193
uintmax_t val;
11941194
uintmax_t factor;
11951195

1196+
/* negative values would be accepted by strtoumax */
1197+
if (strchr(value, '-')) {
1198+
errno = EINVAL;
1199+
return 0;
1200+
}
11961201
errno = 0;
11971202
val = strtoumax(value, &end, 0);
11981203
if (errno == ERANGE)

t/t0040-parse-options.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,4 +709,9 @@ test_expect_success 'subcommands are incompatible with KEEP_DASHDASH unless in c
709709
grep ^BUG err
710710
'
711711

712+
test_expect_success 'negative magnitude' '
713+
test_must_fail test-tool parse-options --magnitude -1 >out 2>err &&
714+
grep "non-negative integer" err &&
715+
test_must_be_empty out
716+
'
712717
test_done

t/t1050-large.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ test_description='adding and checking out large blobs'
55

66
. ./test-lib.sh
77

8+
test_expect_success 'core.bigFileThreshold must be non-negative' '
9+
test_must_fail git -c core.bigFileThreshold=-1 rev-parse >out 2>err &&
10+
grep "bad numeric config value" err &&
11+
test_must_be_empty out
12+
'
13+
814
test_expect_success setup '
915
# clone does not allow us to pass core.bigfilethreshold to
1016
# new repos, so set core.bigfilethreshold globally

0 commit comments

Comments
 (0)