diff options
author | Lloyd Hilaiel <lloyd@hilaiel.com> | 2011-04-25 09:50:46 -0600 |
---|---|---|
committer | Lloyd Hilaiel <lloyd@hilaiel.com> | 2011-04-25 09:50:46 -0600 |
commit | 807d3635055017206acaecf2e56b08ebc9e2f51c (patch) | |
tree | 8c0699cb937dc3627950fab872bf38bc933105cd | |
parent | ec8204ddf795a233d8c7053f026ba7e2208b529a (diff) | |
download | yajl-807d3635055017206acaecf2e56b08ebc9e2f51c.tar.gz |
fix a bug in overflow detection in integer parsing routine, add overflow tests (now that we always rep integers in 64bit entities regardless of arch word size)
-rw-r--r-- | src/yajl_parser.c | 5 | ||||
-rw-r--r-- | test/cases/bignums.json | 1 | ||||
-rw-r--r-- | test/cases/bignums.json.gold | 5 | ||||
-rw-r--r-- | test/cases/high_overflow.json | 1 | ||||
-rw-r--r-- | test/cases/high_overflow.json.gold | 2 | ||||
-rw-r--r-- | test/cases/low_overflow.json | 1 | ||||
-rw-r--r-- | test/cases/low_overflow.json.gold | 2 |
7 files changed, 16 insertions, 1 deletions
diff --git a/src/yajl_parser.c b/src/yajl_parser.c index 65d5ed6..69508b7 100644 --- a/src/yajl_parser.c +++ b/src/yajl_parser.c @@ -42,12 +42,15 @@ yajl_parse_integer(const unsigned char *number, unsigned int length) if (*pos == '+') { pos++; } while (pos < number + length) { - if ( ret > MAX_VALUE_TO_MULTIPLY ) { errno = ERANGE; return sign == 1 ? LLONG_MAX : LLONG_MIN; } ret *= 10; + if (LLONG_MAX - ret < (*pos - '0')) { + errno = ERANGE; + return sign == 1 ? LLONG_MAX : LLONG_MIN; + } ret += (*pos++ - '0'); } diff --git a/test/cases/bignums.json b/test/cases/bignums.json new file mode 100644 index 0000000..75aca9a --- /dev/null +++ b/test/cases/bignums.json @@ -0,0 +1 @@ +[ 9223372036854775807, -9223372036854775807 ] diff --git a/test/cases/bignums.json.gold b/test/cases/bignums.json.gold new file mode 100644 index 0000000..8bb3b1e --- /dev/null +++ b/test/cases/bignums.json.gold @@ -0,0 +1,5 @@ +array open '[' +integer: 9223372036854775807 +integer: -9223372036854775807 +array close ']' +memory leaks: 0 diff --git a/test/cases/high_overflow.json b/test/cases/high_overflow.json new file mode 100644 index 0000000..8136b73 --- /dev/null +++ b/test/cases/high_overflow.json @@ -0,0 +1 @@ +9223372036854775808
\ No newline at end of file diff --git a/test/cases/high_overflow.json.gold b/test/cases/high_overflow.json.gold new file mode 100644 index 0000000..19c4b77 --- /dev/null +++ b/test/cases/high_overflow.json.gold @@ -0,0 +1,2 @@ +parse error: integer overflow +memory leaks: 0 diff --git a/test/cases/low_overflow.json b/test/cases/low_overflow.json new file mode 100644 index 0000000..9af921b --- /dev/null +++ b/test/cases/low_overflow.json @@ -0,0 +1 @@ +-9223372036854775808
\ No newline at end of file diff --git a/test/cases/low_overflow.json.gold b/test/cases/low_overflow.json.gold new file mode 100644 index 0000000..19c4b77 --- /dev/null +++ b/test/cases/low_overflow.json.gold @@ -0,0 +1,2 @@ +parse error: integer overflow +memory leaks: 0 |