summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--ext/json/JSON_parser.c2
-rw-r--r--ext/json/tests/bug41403.phpt41
3 files changed, 44 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index e6d5b3f0fe..9edc9b9536 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,8 @@ PHP NEWS
- Fixed altering $this via argument named "this". (Dmitry)
- Fixed PHP CLI to use the php.ini from the binary location. (Hannes)
- Fixed segfault in strripos(). (Tony, Joxean Koret)
+- Fixed bug #41403 (json_decode cannot decode floats if localeconv
+ decimal_point is not '.'). (Tony)
- Fixed bug #41390 (Clarify error message with invalid protocol scheme).
(Scott)
- Fixed bug #41378 (fastcgi protocol lacks support for Reason-Phrase in
diff --git a/ext/json/JSON_parser.c b/ext/json/JSON_parser.c
index b57d65174e..ae8e7522e0 100644
--- a/ext/json/JSON_parser.c
+++ b/ext/json/JSON_parser.c
@@ -288,7 +288,7 @@ static void json_create_zval(zval **z, smart_str *buf, int type)
}
else if (type == IS_DOUBLE)
{
- ZVAL_DOUBLE(*z, atof(buf->c));
+ ZVAL_DOUBLE(*z, zend_strtod(buf->c, NULL));
}
else if (type == IS_STRING)
{
diff --git a/ext/json/tests/bug41403.phpt b/ext/json/tests/bug41403.phpt
new file mode 100644
index 0000000000..80576c85b1
--- /dev/null
+++ b/ext/json/tests/bug41403.phpt
@@ -0,0 +1,41 @@
+--TEST--
+Bug #41403 (json_decode cannot decode floats if localeconv decimal_point is not '.')
+--SKIPIF--
+<?php
+if (setlocale(LC_NUMERIC, "de_DE") === false) {
+ die("skip no de_DE locale");
+}
+?>
+--INI--
+precision=14
+--FILE--
+<?php
+
+setlocale(LC_NUMERIC, 'de_DE');
+var_dump(json_decode('[2.1]'));
+var_dump(json_decode('[0.15]'));
+var_dump(json_decode('[123.13452345]'));
+var_dump(json_decode('[123,13452345]'));
+
+echo "Done\n";
+?>
+--EXPECTF--
+array(1) {
+ [0]=>
+ float(2,1)
+}
+array(1) {
+ [0]=>
+ float(0,15)
+}
+array(1) {
+ [0]=>
+ float(123,13452345)
+}
+array(2) {
+ [0]=>
+ int(123)
+ [1]=>
+ int(13452345)
+}
+Done