Skip to content

Commit

Permalink
Initialize errno before calling sscanf in json_parse_int64() so parsi…
Browse files Browse the repository at this point in the history
…ng valid numbers after parsing an out of range number works.
  • Loading branch information
hawicz committed Jul 29, 2012
1 parent 2da148d commit 77c6239
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 3 deletions.
9 changes: 6 additions & 3 deletions json_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
10 changes: 10 additions & 0 deletions tests/test_parse_int64.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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);

Expand All @@ -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;
}
3 changes: 3 additions & 0 deletions tests/test_parse_int64.expected
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 77c6239

Please sign in to comment.