summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLloyd Hilaiel <lloyd@hilaiel.com>2011-04-25 09:50:46 -0600
committerLloyd Hilaiel <lloyd@hilaiel.com>2011-04-25 09:50:46 -0600
commit807d3635055017206acaecf2e56b08ebc9e2f51c (patch)
tree8c0699cb937dc3627950fab872bf38bc933105cd
parentec8204ddf795a233d8c7053f026ba7e2208b529a (diff)
downloadyajl-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.c5
-rw-r--r--test/cases/bignums.json1
-rw-r--r--test/cases/bignums.json.gold5
-rw-r--r--test/cases/high_overflow.json1
-rw-r--r--test/cases/high_overflow.json.gold2
-rw-r--r--test/cases/low_overflow.json1
-rw-r--r--test/cases/low_overflow.json.gold2
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