]> git.ipfire.org Git - thirdparty/git.git/commitdiff
set errno=0 before strtoX calls
authorKyle Lippincott <spectral@google.com>
Mon, 5 Aug 2024 17:10:07 +0000 (17:10 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 5 Aug 2024 17:59:20 +0000 (10:59 -0700)
To detect conversion failure after calls to functions like `strtod`, one
can check `errno == ERANGE`. These functions are not guaranteed to set
`errno` to `0` on successful conversion, however. Manual manipulation of
`errno` can likely be avoided by checking that the output pointer
differs from the input pointer, but that's not how other locations, such
as parse.c:139, handle this issue; they set errno to 0 prior to
executing the function.

For every place I could find a strtoX function with an ERANGE check
following it, set `errno = 0;` prior to executing the conversion
function.

Signed-off-by: Kyle Lippincott <spectral@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/get-tar-commit-id.c
ref-filter.c
t/helper/test-json-writer.c
t/helper/test-trace2.c

index 66a7389f9f4a21df975ef12a00d93fd7d8eee46f..7195a072edc3d68d5d754e210b0e7dae6a7009ee 100644 (file)
@@ -35,6 +35,7 @@ int cmd_get_tar_commit_id(int argc, const char **argv UNUSED, const char *prefix
        if (header->typeflag[0] != TYPEFLAG_GLOBAL_HEADER)
                return 1;
 
+       errno = 0;
        len = strtol(content, &end, 10);
        if (errno == ERANGE || end == content || len < 0)
                return 1;
index 8c5e673fc0a521425c1035ce3f31575c185c34ef..54880a2497aa90319e2eefaffaa365ee2543f52e 100644 (file)
@@ -1628,6 +1628,7 @@ static void grab_date(const char *buf, struct atom_value *v, const char *atomnam
        timestamp = parse_timestamp(eoemail + 2, &zone, 10);
        if (timestamp == TIME_MAX)
                goto bad;
+       errno = 0;
        tz = strtol(zone, NULL, 10);
        if ((tz == LONG_MIN || tz == LONG_MAX) && errno == ERANGE)
                goto bad;
index ed52eb76bfcbb2830080e40c25a6d59bf7d336da..a288069b04cb3b4d9360b834e8240589f2f5fd7b 100644 (file)
@@ -415,6 +415,7 @@ static void get_i(struct line *line, intmax_t *s_in)
 
        get_s(line, &s);
 
+       errno = 0;
        *s_in = strtol(s, &endptr, 10);
        if (*endptr || errno == ERANGE)
                die("line[%d]: invalid integer value", line->nr);
@@ -427,6 +428,7 @@ static void get_d(struct line *line, double *s_in)
 
        get_s(line, &s);
 
+       errno = 0;
        *s_in = strtod(s, &endptr);
        if (*endptr || errno == ERANGE)
                die("line[%d]: invalid float value", line->nr);
index cd955ec63e90fd79b507af4e6de2150d3beef051..c588c273ce73f18ab487d6125d7387601a86bb21 100644 (file)
@@ -26,6 +26,7 @@ static int get_i(int *p_value, const char *data)
        if (!data || !*data)
                return MyError;
 
+       errno = 0;
        *p_value = strtol(data, &endptr, 10);
        if (*endptr || errno == ERANGE)
                return MyError;