Commit:    2d1694d4ebd51ab61f12e6bc545a17e3baf3b4a0
Author:    Adam Harvey <ahar...@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


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to