From 77c623946517cdfe2eb80ea1e7b0ad6752216667 Mon Sep 17 00:00:00 2001 From: Eric Haszlakiewicz Date: Sun, 29 Jul 2012 12:13:54 -0500 Subject: [PATCH] Initialize errno before calling sscanf in json_parse_int64() so parsing valid numbers after parsing an out of range number works. --- json_util.c | 9 ++++++--- tests/test_parse_int64.c | 10 ++++++++++ tests/test_parse_int64.expected | 3 +++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/json_util.c b/json_util.c index bab772b..79ae5c7 100644 --- a/json_util.c +++ b/json_util.c @@ -147,11 +147,14 @@ int json_parse_int64(const char *buf, int64_t *retval) int64_t num64; const char *buf_skip_space; int orig_has_neg; + int _errno; + errno = 0; // sscanf won't always set errno, so initialize if (sscanf(buf, "%" SCNd64, &num64) != 1) { MC_DEBUG("Failed to parse, sscanf != 1\n"); return 1; } + _errno = errno; buf_skip_space = buf; orig_has_neg = 0; // Skip leading spaces @@ -168,7 +171,7 @@ int json_parse_int64(const char *buf, int64_t *retval) if (buf_skip_space[0] == '0' && buf_skip_space[1] == '\0') orig_has_neg = 0; // "-0" is the same as just plain "0" - if (errno != ERANGE) + if (_errno != ERANGE) { char buf_cmp[100]; char *buf_cmp_start = buf_cmp; @@ -196,10 +199,10 @@ int json_parse_int64(const char *buf, int64_t *retval) ) ) { - errno = ERANGE; + _errno = ERANGE; } } - if (errno == ERANGE) + if (_errno == ERANGE) { if (orig_has_neg) num64 = INT64_MIN; diff --git a/tests/test_parse_int64.c b/tests/test_parse_int64.c index 0893356..c251e01 100644 --- a/tests/test_parse_int64.c +++ b/tests/test_parse_int64.c @@ -80,6 +80,9 @@ int main() strcpy(buf, "-21474836480"); // INT32_MIN * 10 checkit(buf); + strcpy(buf, "9223372036854775806"); // INT64_MAX - 1 + checkit(buf); + strcpy(buf, "9223372036854775807"); // INT64_MAX checkit(buf); @@ -92,6 +95,9 @@ int main() strcpy(buf, "-9223372036854775809"); // INT64_MIN - 1 checkit(buf); + strcpy(buf, "18446744073709551614"); // UINT64_MAX - 1 + checkit(buf); + strcpy(buf, "18446744073709551615"); // UINT64_MAX checkit(buf); @@ -101,5 +107,9 @@ int main() strcpy(buf, "-18446744073709551616"); // -UINT64_MAX checkit(buf); + // Ensure we can still parse valid numbers after parsing out of range ones. + strcpy(buf, "123"); + checkit(buf); + return 0; } diff --git a/tests/test_parse_int64.expected b/tests/test_parse_int64.expected index 23a9803..d9cdf5a 100644 --- a/tests/test_parse_int64.expected +++ b/tests/test_parse_int64.expected @@ -17,10 +17,13 @@ buf=-2147483647 parseit=0, value=-2147483647 buf=-2147483648 parseit=0, value=-2147483648 buf=-2147483649 parseit=0, value=-2147483649 buf=-21474836480 parseit=0, value=-21474836480 +buf=9223372036854775806 parseit=0, value=9223372036854775806 buf=9223372036854775807 parseit=0, value=9223372036854775807 buf=9223372036854775808 parseit=0, value=9223372036854775807 buf=-9223372036854775808 parseit=0, value=-9223372036854775808 buf=-9223372036854775809 parseit=0, value=-9223372036854775808 +buf=18446744073709551614 parseit=0, value=9223372036854775807 buf=18446744073709551615 parseit=0, value=9223372036854775807 buf=18446744073709551616 parseit=0, value=9223372036854775807 buf=-18446744073709551616 parseit=0, value=-9223372036854775808 +buf=123 parseit=0, value=123 -- 2.50.0