summaryrefslogtreecommitdiff
path: root/ext/json
diff options
context:
space:
mode:
authorJakub Zelenka <bukka@php.net>2016-08-14 14:00:35 +0100
committerJakub Zelenka <bukka@php.net>2016-08-14 14:00:35 +0100
commit436d50a82192cbef4431fe9a70c641f49aec55a8 (patch)
treee2cef22ee7d7b463398498cfa3234e3d8807ed1c /ext/json
parent98787d90020c7b21c1dd5d1701e6157993d02aec (diff)
parent9f1d962ed6057a3996f1b5aa82467a3172e41e8f (diff)
downloadphp-git-436d50a82192cbef4431fe9a70c641f49aec55a8.tar.gz
Merge branch 'PHP-5.6' into PHP-7.0
Diffstat (limited to 'ext/json')
-rw-r--r--ext/json/json.c10
-rw-r--r--ext/json/tests/bug72787.phpt15
2 files changed, 25 insertions, 0 deletions
diff --git a/ext/json/json.c b/ext/json/json.c
index 6571bf99f0..61445ee114 100644
--- a/ext/json/json.c
+++ b/ext/json/json.c
@@ -260,6 +260,16 @@ static PHP_FUNCTION(json_decode)
RETURN_NULL();
}
+ if (depth <= 0) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Depth must be greater than zero");
+ RETURN_NULL();
+ }
+
+ if (depth > INT_MAX) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Depth must be lower than %d", INT_MAX);
+ RETURN_NULL();
+ }
+
/* For BC reasons, the bool $assoc overrides the long $options bit for PHP_JSON_OBJECT_AS_ARRAY */
if (assoc) {
options |= PHP_JSON_OBJECT_AS_ARRAY;
diff --git a/ext/json/tests/bug72787.phpt b/ext/json/tests/bug72787.phpt
new file mode 100644
index 0000000000..c9820faa9f
--- /dev/null
+++ b/ext/json/tests/bug72787.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #72787 (json_decode reads out of bounds)
+--SKIPIF--
+<?php if (!extension_loaded("json")) print "skip"; ?>
+<?php if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only"); ?>
+--FILE--
+<?php
+
+var_dump(json_decode('[]', false, 0x100000000));
+
+?>
+--EXPECTF--
+
+Warning: json_decode(): Depth must be lower than %d in %s on line %d
+NULL