]> granicus.if.org Git - json-c/commitdiff
Initialize errno before calling sscanf in json_parse_int64() so parsing valid numbers...
authorEric Haszlakiewicz <erh+git@nimenees.com>
Sun, 29 Jul 2012 17:13:54 +0000 (12:13 -0500)
committerEric Haszlakiewicz <erh+git@nimenees.com>
Sun, 29 Jul 2012 17:13:54 +0000 (12:13 -0500)
json_util.c
tests/test_parse_int64.c
tests/test_parse_int64.expected

index bab772bc3d1f72b7e9d20e0b877a752e08d01565..79ae5c707121f73a4c8f94d8d43f7cd4d07d5b01 100644 (file)
@@ -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;
index 08933568d47d57bcfd820423a385f39788c56d20..c251e01348d5c156d0cf1dcf310e8f23cdc259a6 100644 (file)
@@ -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;
 }
index 23a9803ebe74d9037077b8758d8ae34dd0cf4c6f..d9cdf5aceef78978b6f9674ebfe25a06036a211c 100644 (file)
@@ -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