com php-src: Alter php_json_decode_ex() to respec t JSON_BIGINT_AS_STRING for bare numbers.: NEWS ext/json/json.c ext/json/tests/bug63737. phpt
| From: | Adam Harvey | Date: | Tue, 11 Dec 2012 11:51:30 +0000 |
| Subject: | com php-src: Alter php_json_decode_ex() to respec t JSON_BIGINT_AS_STRING for bare numbers.: NEWS ext/json/json.c ext/json/tests/bug63737. phpt | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-70695@lists.php.net to get a copy of this message | ||
Commit: 2d1694d4ebd51ab61f12e6bc545a17e3baf3b4a0
Author: Adam Harvey <aharvey@php.net> Tue, 11 Dec 2012 19:51:30 +0800
Parents: 95fd52ff3d3cc2162baf4d30fe06cf37da398050
Branches: PHP-5.4 PHP-5.5 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=2d1694d4ebd51ab61f12e6bc545a17e3baf3b4a0
Log:
Alter php_json_decode_ex() to respect JSON_BIGINT_AS_STRING for bare numbers.
Fixes bug #63737 (json_decode does not properly decode with options parameter).
Bugs:
https://bugs.php.net/63737
Changed paths:
M NEWS
M ext/json/json.c
A ext/json/tests/bug63737.phpt
Diff:
diff --git a/NEWS b/NEWS
index 29b62a3..0504472 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? ??? 2012, PHP 5.4.11
+- JSON:
+ . Fixed bug #63737 (json_decode does not properly decode with options
+ parameter). (Adam)
+
?? ??? 2012, PHP 5.4.10
- Core:
diff --git a/ext/json/json.c b/ext/json/json.c
index fb01529..e26c369 100644
--- a/ext/json/json.c
+++ b/ext/json/json.c
@@ -682,7 +682,7 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len,
else
{
double d;
- int type;
+ int type, overflow_info;
long p;
RETVAL_NULL();
@@ -698,11 +698,36 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int
str_len,
RETVAL_BOOL(0);
}
- if ((type = is_numeric_string(str, str_len, &p, &d, 0)) != 0) {
+ if ((type = is_numeric_string_ex(str, str_len, &p, &d, 0, &overflow_info)) != 0) {
if (type == IS_LONG) {
RETVAL_LONG(p);
} else if (type == IS_DOUBLE) {
- RETVAL_DOUBLE(d);
+ if (options & PHP_JSON_BIGINT_AS_STRING && overflow_info) {
+ /* Within an object or array, a numeric literal is assumed
+ * to be an integer if and only if it's entirely made up of
+ * digits (exponent notation will result in the number
+ * being treated as a double). We'll match that behaviour
+ * here. */
+ int i;
+ zend_bool is_float = 0;
+
+ for (i = (str[0] == '-' ? 1 : 0); i < str_len; i++) {
+ /* Not using isdigit() because it's locale specific,
+ * but we expect JSON input to always be UTF-8. */
+ if (str[i] < '0' || str[i] > '9') {
+ is_float = 1;
+ break;
+ }
+ }
+
+ if (is_float) {
+ RETVAL_DOUBLE(d);
+ } else {
+ RETVAL_STRINGL(str, str_len, 1);
+ }
+ } else {
+ RETVAL_DOUBLE(d);
+ }
}
}
diff --git a/ext/json/tests/bug63737.phpt b/ext/json/tests/bug63737.phpt
new file mode 100644
index 0000000..1fb06d4
--- /dev/null
+++ b/ext/json/tests/bug63737.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Bug #63737 (json_decode does not properly decode with options parameter)
+--SKIPIF--
+<?php if (!extension_loaded("json")) print "skip"; ?>
+--FILE--
+<?php
+function decode($json) {
+ $x = json_decode($json);
+ var_dump($x);
+ $x = json_decode($json, false, 512, JSON_BIGINT_AS_STRING);
+ var_dump($x);
+}
+
+decode('123456789012345678901234567890');
+decode('-123456789012345678901234567890');
+
+// This shouldn't affect floats, but let's check that.
+decode('123456789012345678901234567890.1');
+decode('-123456789012345678901234567890.1');
+
+echo "Done\n";
+?>
+--EXPECT--
+float(1.2345678901235E+29)
+string(30) "123456789012345678901234567890"
+float(-1.2345678901235E+29)
+string(31) "-123456789012345678901234567890"
+float(1.2345678901235E+29)
+float(1.2345678901235E+29)
+float(-1.2345678901235E+29)
+float(-1.2345678901235E+29)
+Done