tony2001 Thu Jul 20 08:56:57 2006 UTC
Added files: (Branch: PHP_5_2)
/php-src/ext/json/tests 002.phpt 003.phpt 004.phpt 005.phpt
Modified files:
/php-src/ext/json json.c
/php-src/ext/json/tests 001.phpt
Log:
MFH: add recursion protection to json_encode() and new tests
http://cvs.php.net/viewvc.cgi/php-src/ext/json/json.c?r1=1.9.2.2&r2=1.9.2.3&diff_format=u
Index: php-src/ext/json/json.c
diff -u php-src/ext/json/json.c:1.9.2.2 php-src/ext/json/json.c:1.9.2.3
--- php-src/ext/json/json.c:1.9.2.2 Thu Jul 20 07:40:49 2006
+++ php-src/ext/json/json.c Thu Jul 20 08:56:57 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: json.c,v 1.9.2.2 2006/07/20 07:40:49 tony2001 Exp $ */
+/* $Id: json.c,v 1.9.2.3 2006/07/20 08:56:57 tony2001 Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -135,6 +135,11 @@
r = 1;
}
+ if (myht && myht->nApplyCount > 1) {
+ php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "recursion
detected");
+ return;
+ }
+
if (r == 0)
{
smart_str_appendc(buf, '[');
@@ -151,6 +156,7 @@
ulong index;
uint key_len;
HashPosition pos;
+ HashTable *tmp_ht;
int need_comma = 0;
zend_hash_internal_pointer_reset_ex(myht, &pos);
@@ -160,6 +166,11 @@
break;
if (zend_hash_get_current_data_ex(myht, (void **) &data, &pos) ==
SUCCESS) {
+ tmp_ht = HASH_OF(*data);
+ if (tmp_ht) {
+ tmp_ht->nApplyCount++;
+ }
+
if (r == 0) {
if (need_comma) {
smart_str_appendc(buf, ',');
@@ -200,6 +211,10 @@
json_encode_r(buf, *data TSRMLS_CC);
}
}
+
+ if (tmp_ht) {
+ tmp_ht->nApplyCount--;
+ }
}
}
}
http://cvs.php.net/viewvc.cgi/php-src/ext/json/tests/001.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u
Index: php-src/ext/json/tests/001.phpt
diff -u php-src/ext/json/tests/001.phpt:1.1.2.2
php-src/ext/json/tests/001.phpt:1.1.2.3
--- php-src/ext/json/tests/001.phpt:1.1.2.2 Thu Jul 20 08:24:31 2006
+++ php-src/ext/json/tests/001.phpt Thu Jul 20 08:56:57 2006
@@ -1,5 +1,7 @@
--TEST--
json_decode() tests
+--SKIPIF--
+<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
http://cvs.php.net/viewvc.cgi/php-src/ext/json/tests/002.phpt?view=markup&rev=1.1
Index: php-src/ext/json/tests/002.phpt
+++ php-src/ext/json/tests/002.phpt
--TEST--
json_encode() tests
--SKIPIF--
<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
var_dump(json_encode(""));
var_dump(json_encode(NULL));
var_dump(json_encode(TRUE));
var_dump(json_encode(array(""=>"")));
var_dump(json_encode(array(array(1))));
var_dump(json_encode(1));
var_dump(json_encode("ÑÑÑÑиÑ"));
echo "Done\n";
?>
--EXPECTF--
string(2) """"
string(4) "null"
string(4) "true"
string(2) "{}"
string(5) "[[1]]"
string(1) "1"
string(38) ""\u0440\u0443\u0441\u0441\u0438\u0448""
Done
http://cvs.php.net/viewvc.cgi/php-src/ext/json/tests/003.phpt?view=markup&rev=1.1
Index: php-src/ext/json/tests/003.phpt
+++ php-src/ext/json/tests/003.phpt
--TEST--
json_encode() & endless loop - 1
--SKIPIF--
<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
$a = array();
$a[] = &$a;
var_dump($a);
var_dump(json_encode($a));
echo "Done\n";
?>
--EXPECTF--
array(1) {
[0]=>
&array(1) {
[0]=>
&array(1) {
[0]=>
*RECURSION*
}
}
}
Catchable fatal error: json_encode(): recursion detected in %s on line %d
http://cvs.php.net/viewvc.cgi/php-src/ext/json/tests/004.phpt?view=markup&rev=1.1
Index: php-src/ext/json/tests/004.phpt
+++ php-src/ext/json/tests/004.phpt
--TEST--
json_encode() & endless loop - 2
--SKIPIF--
<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
$a = new stdclass;
$a->prop = $a;
var_dump($a);
var_dump(json_encode($a));
echo "Done\n";
?>
--EXPECTF--
object(stdClass)#%d (1) {
["prop"]=>
object(stdClass)#%d (1) {
["prop"]=>
*RECURSION*
}
}
Catchable fatal error: json_encode(): recursion detected in %s on line %d
http://cvs.php.net/viewvc.cgi/php-src/ext/json/tests/005.phpt?view=markup&rev=1.1
Index: php-src/ext/json/tests/005.phpt
+++ php-src/ext/json/tests/005.phpt
--TEST--
json_encode() & endless loop - 3
--SKIPIF--
<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
$a = array();
$a[] = $a;
var_dump($a);
var_dump(json_encode($a));
echo "Done\n";
?>
--EXPECTF--
array(1) {
[0]=>
array(1) {
[0]=>
*RECURSION*
}
}
Catchable fatal error: json_encode(): recursion detected in %s on line %d
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php