]> granicus.if.org Git - json-c/commitdiff
fix json_parse_uint64() usage of errno
authorPierce Lopez <pierce.lopez@gmail.com>
Sun, 10 May 2020 17:20:02 +0000 (13:20 -0400)
committerPierce Lopez <pierce.lopez@gmail.com>
Sun, 10 May 2020 17:38:12 +0000 (13:38 -0400)
introduced in #542
fixes #601

json_util.c
json_util.h
tests/test_parse_int64.expected

index d3ee47df7233ab11a281a35197e4d0fe89d43a26..e8e2ec6bcb2ac1f0fff3479af79fa8b2e649b88f 100644 (file)
@@ -245,19 +245,17 @@ int json_parse_uint64(const char *buf, uint64_t *retval)
 {
        char *end = NULL;
        uint64_t val;
-       errno = 1;
 
+       errno = 0;
        while (*buf == ' ')
-       {
                buf++;
-       }
        if (*buf == '-')
-               errno = 0;
+               return 1;  /* error: uint cannot be negative */
 
        val = strtoull(buf, &end, 10);
        if (end != buf)
                *retval = val;
-       return ((errno == 0) || (end == buf)) ? 1 : 0;
+       return ((val == 0 && errno != 0) || (end == buf)) ? 1 : 0;
 }
 
 #ifndef HAVE_REALLOC
index 2a4b6c19bd3494c8ede16aabad7e6d1261cce8ce..7520f036c4f263598cfc86cc0f105d9965c2dc33 100644 (file)
@@ -100,6 +100,7 @@ JSON_EXPORT int json_object_to_fd(int fd, struct json_object *obj, int flags);
  */
 JSON_EXPORT const char *json_util_get_last_err(void);
 
+/* these parsing helpers return zero on success */
 JSON_EXPORT int json_parse_int64(const char *buf, int64_t *retval);
 JSON_EXPORT int json_parse_uint64(const char *buf, uint64_t *retval);
 JSON_EXPORT int json_parse_double(const char *buf, double *retval);
index f4c5750b0b2efaac5b91259af6587c36d9255bfb..6dca94b4701488f28951f4b5a584894bd61550f7 100644 (file)
@@ -34,13 +34,13 @@ buf=123 parseit=0, value=123
 ==========json_parse_uint64() test===========
 buf=x parseit=1, value=666 
 buf=0 parseit=0, value=0 
-buf=-0 parseit=1, value=0 
+buf=-0 parseit=1, value=666 
 buf=00000000 parseit=0, value=0 
-buf=-00000000 parseit=1, value=0 
+buf=-00000000 parseit=1, value=666 
 buf=1 parseit=0, value=1 
 buf=2147483647 parseit=0, value=2147483647 
-buf=-1 parseit=1, value=18446744073709551615 
-buf=-9223372036854775808 parseit=1, value=9223372036854775808 
+buf=-1 parseit=1, value=666 
+buf=-9223372036854775808 parseit=1, value=666 
 buf=   1 parseit=0, value=1 
 buf=00001234 parseit=0, value=1234 
 buf=0001234x parseit=0, value=1234