summaryrefslogtreecommitdiff
path: root/ext/json
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2007-02-18 16:54:59 +0000
committerIlia Alshanetsky <iliaa@php.net>2007-02-18 16:54:59 +0000
commit5e274ea47d2d31894b775fc8c171db88ee061c2e (patch)
tree2fac646495f4746fa861aab7cf889e4a0aaccf3c /ext/json
parent05584eb55a55816fdfe7ed4913d97334abec4f6c (diff)
downloadphp-git-5e274ea47d2d31894b775fc8c171db88ee061c2e.tar.gz
Fixed bug #40503 (json_encode() value corruption on 32bit systems with
overflown values).
Diffstat (limited to 'ext/json')
-rw-r--r--ext/json/json.c20
-rw-r--r--ext/json/tests/bug40503.phpt19
2 files changed, 30 insertions, 9 deletions
diff --git a/ext/json/json.c b/ext/json/json.c
index 0f552d4fcd..1bfe3e0743 100644
--- a/ext/json/json.c
+++ b/ext/json/json.c
@@ -345,7 +345,7 @@ static void json_encode_r(smart_str *buf, zval *val TSRMLS_DC) {
}
break;
case IS_LONG:
- smart_str_append_long(buf, Z_LVAL_P(val));
+ smart_str_append_long(buf, Z_LVAL_P(val));
break;
case IS_DOUBLE:
{
@@ -353,14 +353,16 @@ static void json_encode_r(smart_str *buf, zval *val TSRMLS_DC) {
int len;
double dbl = Z_DVAL_P(val);
- if (!zend_isinf(dbl) && !zend_isnan(dbl))
- {
- len = spprintf(&d, 0, "%.9g", dbl);
- if (d)
- {
- smart_str_appendl(buf, d, len);
- efree(d);
- }
+ if (!zend_isinf(dbl) && !zend_isnan(dbl)) {
+ len = spprintf(&d, 0, "%.9g", dbl);
+ if (d) {
+ if (dbl > LONG_MAX && !memchr(d, '.', len)) {
+ smart_str_append_unsigned(buf, (unsigned long)Z_DVAL_P(val));
+ } else {
+ smart_str_appendl(buf, d, len);
+ }
+ efree(d);
+ }
}
else
{
diff --git a/ext/json/tests/bug40503.phpt b/ext/json/tests/bug40503.phpt
new file mode 100644
index 0000000000..d451eea35d
--- /dev/null
+++ b/ext/json/tests/bug40503.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Bug #40503 (json_encode() value corruption on 32bit systems with overflown values)
+--SKIPIF--
+<?php if (!extension_loaded("json")) print "skip"; ?>
+--FILE--
+<?php
+function show_eq($x,$y) {
+ echo "$x ". ($x==$y ? "==" : "!=") ." $y\n";
+}
+
+$value = 0x7FFFFFFF; #2147483647;
+show_eq("$value", json_encode($value));
+$value++;
+show_eq("$value", json_encode($value));
+
+?>
+--EXPECT--
+2147483647 == 2147483647
+2147483648 == 2147483648