strtoul_ui: reject negative values
authorMatthieu Moy <Matthieu.Moy@imag.fr>
Thu, 17 Sep 2015 16:28:33 +0000 (18:28 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 17 Sep 2015 17:02:27 +0000 (10:02 -0700)
strtoul_ui uses strtoul to get a long unsigned, then checks that casting
to unsigned does not lose information and return the casted value.

On 64 bits architecture, checking that the cast does not change the value
catches most errors, but when sizeof(int) == sizeof(long) (e.g. i386),
the check does nothing. Unfortunately, strtoul silently accepts negative
values, and as a result strtoul_ui("-1", ...) raised no error.

This patch catches negative values before it's too late, i.e. before
calling strtoul.

Reported-by: Max Kirillov <max@max630.net>
Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-compat-util.h
index c6d391f86490b94e4df667d64d54323e1915c477..4515c494ee3873c0668be9d52892b14386390b7e 100644 (file)
@@ -812,6 +812,9 @@ static inline int strtoul_ui(char const *s, int base, unsigned int *result)
        char *p;
 
        errno = 0;
+       /* negative values would be accepted by strtoul */
+       if (strchr(s, '-'))
+               return -1;
        ul = strtoul(s, &p, base);
        if (errno || *p || p == s || (unsigned int) ul != ul)
                return -1;