Re: com php-src: - Fixed bug #61978 (Object recursion not detected for classes that implement JsonSerializable): ext/json/json.c
ext/json/tests/bug61978.phpt
| From: | Nikita Popov | Date: | Wed, 09 May 2012 06:52:10 +0000 |
| Subject: | Re: com php-src: - Fixed bug #61978 (Object recursion not detected for classes that implement JsonSerializable): ext/json/json.c ext/json/tests/bug61978.phpt |
||
| References: | 1 | Groups: | php.cvs |
| Request: | Send a blank email to php-cvs+get-69014@lists.php.net to get a copy of this message | ||
This should probably not just insert null but let the whole function
fail. Otherwise one has to add additional error checks on every call.
Nikita
On Wed, May 9, 2012 at 2:05 AM, Felipe Pena <felipe@php.net> wrote:
> Commit: 92bc49b2b06417f86dc0fc537326e60f4d0a0c0b
> Author: Felipe Pena <felipensp@gmail.com> Tue, 8 May 2012 21:05:51 -0300
> Parents: 2cb0ed1328da3bca00990648c3dfc90c957395f1
> Branches: PHP-5.4 master
>
> Link:
> http://git.php.net/?p=php-src.git;a=commitdiff;h=92bc49b2b06417f86dc0fc537326e60f4d0a0c0b
>
> Log:
> - Fixed bug #61978 (Object recursion not detected for classes that implement JsonSerializable)
>
> Bugs:
> https://bugs.php.net/61978
>
> Changed paths:
> M ext/json/json.c
> A ext/json/tests/bug61978.phpt
>
>
> Diff:
> diff --git a/ext/json/json.c b/ext/json/json.c
> index fc1fcb7..557fbc3 100644
> --- a/ext/json/json.c
> +++ b/ext/json/json.c
> @@ -513,6 +513,19 @@ static void json_encode_serializable_object(smart_str *buf, zval *val, int
> optio
> {
> zend_class_entry *ce = Z_OBJCE_P(val);
> zval *retval = NULL, fname;
> + HashTable* myht;
> +
> + if (Z_TYPE_P(val) == IS_ARRAY) {
> + myht = HASH_OF(val);
> + } else {
> + myht = Z_OBJPROP_P(val);
> + }
> +
> + if (myht && myht->nApplyCount > 1) {
> + php_error_docref(NULL TSRMLS_CC, E_WARNING, "recursion
> detected");
> + smart_str_appendl(buf, "null", 4);
> + return;
> + }
>
> ZVAL_STRING(&fname, "jsonSerialize", 0);
>
> diff --git a/ext/json/tests/bug61978.phpt b/ext/json/tests/bug61978.phpt
> new file mode 100644
> index 0000000..2c73297
> --- /dev/null
> +++ b/ext/json/tests/bug61978.phpt
> @@ -0,0 +1,47 @@
> +--TEST--
> +Bug #61978 (Object recursion not detected for classes that implement JsonSerializable)
> +--SKIPIF--
> +<?php if (!extension_loaded("json")) print "skip"; ?>
> +--FILE--
> +<?php
> +
> +class JsonTest1 {
> + public $test;
> + public $me;
> + public function __construct() {
> + $this->test = '123';
> + $this->me = $this;
> + }
> +}
> +
> +class JsonTest2 implements JsonSerializable {
> + public $test;
> + public function __construct() {
> + $this->test = '123';
> + }
> + public function jsonSerialize() {
> + return array(
> + 'test' => $this->test,
> + 'me' => $this
> + );
> + }
> +}
> +
> +
> +$obj1 = new JsonTest1();
> +var_dump(json_encode($obj1));
> +
> +echo "\n==\n";
> +
> +$obj2 = new JsonTest2();
> +var_dump(json_encode($obj2));
> +
> +?>
> +--EXPECTF--
> +Warning: json_encode(): recursion detected in %s on line %d
> +string(44)
> "{"test":"123","me":{"test":"123","me":null}}"
> +
> +==
> +
> +Warning: json_encode(): recursion detected in %s on line %d
> +string(44)
> "{"test":"123","me":{"test":"123","me":null}}"
>
>
> --
> PHP CVS Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>