]> git.ipfire.org Git - thirdparty/git.git/commitdiff
git_parse_unsigned: reject negative values
authorPhillip Wood <phillip.wood@dunelm.org.uk>
Wed, 9 Nov 2022 14:16:26 +0000 (14:16 +0000)
committerTaylor Blau <me@ttaylorr.com>
Thu, 10 Nov 2022 02:30:38 +0000 (21:30 -0500)
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 <peff@peff.net>
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
config.c
t/t0040-parse-options.sh
t/t1050-large.sh

index cbb5a3bab74f6f6f292c1628ed889e57f0157d10..d5069d4f01dc8cb63e1db7f9ed4a220eeb6447e1 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1193,6 +1193,11 @@ static int git_parse_unsigned(const char *value, uintmax_t *ret, uintmax_t max)
                uintmax_t val;
                uintmax_t factor;
 
+               /* negative values would be accepted by strtoumax */
+               if (strchr(value, '-')) {
+                       errno = EINVAL;
+                       return 0;
+               }
                errno = 0;
                val = strtoumax(value, &end, 0);
                if (errno == ERANGE)
index 5cc62306e39c4f7ab2f6fec35d3cafc7bd65be86..64d2327b744874d1df582ff093aac6269c0160d7 100755 (executable)
@@ -709,4 +709,9 @@ test_expect_success 'subcommands are incompatible with KEEP_DASHDASH unless in c
        grep ^BUG err
 '
 
+test_expect_success 'negative magnitude' '
+       test_must_fail test-tool parse-options --magnitude -1 >out 2>err &&
+       grep "non-negative integer" err &&
+       test_must_be_empty out
+'
 test_done
index 4f3aa17c994240173fdb4de70da62611700e11fd..c71932b02423734908428a9b2be776fec229ce9e 100755 (executable)
@@ -5,6 +5,12 @@ test_description='adding and checking out large blobs'
 
 . ./test-lib.sh
 
+test_expect_success 'core.bigFileThreshold must be non-negative' '
+       test_must_fail git -c core.bigFileThreshold=-1 rev-parse >out 2>err &&
+       grep "bad numeric config value" err &&
+       test_must_be_empty out
+'
+
 test_expect_success setup '
        # clone does not allow us to pass core.bigfilethreshold to
        # new repos, so set core.bigfilethreshold globally