diff options
author | Xinchen Hui <laruence@gmail.com> | 2016-10-22 14:50:42 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2016-10-22 14:50:42 +0800 |
commit | 788368ff1cb7f933076b6eef6210a3c54eddc5dc (patch) | |
tree | 211e756a58d63e08987b771ff1d5c87b127e9d81 | |
parent | 2860fd40d6af162b302eec73d462db6ff5113a6a (diff) | |
parent | eca84946a4e7269d59ea2d79b5f42117de89ae74 (diff) | |
download | php-git-788368ff1cb7f933076b6eef6210a3c54eddc5dc.tar.gz |
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0:
Fixed bug #73350 (Exception::__toString() cause circular references)
-rw-r--r-- | Zend/tests/bug73156.phpt | 2 | ||||
-rw-r--r-- | Zend/tests/bug73350.phpt | 27 | ||||
-rw-r--r-- | Zend/zend_exceptions.c | 5 |
3 files changed, 31 insertions, 3 deletions
diff --git a/Zend/tests/bug73156.phpt b/Zend/tests/bug73156.phpt index b5092514a0..327ad9e431 100644 --- a/Zend/tests/bug73156.phpt +++ b/Zend/tests/bug73156.phpt @@ -1,5 +1,5 @@ --TEST-- -iBug #73156 (segfault on undefined function) +Bug #73156 (segfault on undefined function) --FILE-- <?php class A { diff --git a/Zend/tests/bug73350.phpt b/Zend/tests/bug73350.phpt new file mode 100644 index 0000000000..7505884efb --- /dev/null +++ b/Zend/tests/bug73350.phpt @@ -0,0 +1,27 @@ +--TEST-- +Bug #73350 (Exception::__toString() cause circular references) +--FILE-- +<?php +$e = new Exception(); + +// This line cause problem :( +// Comment it to see the difference. +(string) $e; + +// This line show the clue (PHP Warning: ...). +var_export($e); +?> +--EXPECTF-- +Exception::__set_state(array( + 'message' => '', + 'string' => 'Exception in %sbug73350.php:%d +Stack trace: +#0 {main}', + 'code' => 0, + 'file' => '%sbug73350.php', + 'line' => %d, + 'trace' => + array ( + ), + 'previous' => NULL, +)) diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 331213d8e6..8f41e1ce71 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -740,14 +740,15 @@ ZEND_METHOD(exception, __toString) Z_OBJPROP_P(exception)->u.v.nApplyCount++; exception = GET_PROPERTY(exception, ZEND_STR_PREVIOUS); if (exception && Z_TYPE_P(exception) == IS_OBJECT && Z_OBJPROP_P(exception)->u.v.nApplyCount > 0) { - exception = NULL; + break; } } zend_string_release(fname); + exception = getThis(); /* Reset apply counts */ while (exception && Z_TYPE_P(exception) == IS_OBJECT && (base_ce = i_get_exception_base(exception)) && instanceof_function(Z_OBJCE_P(exception), base_ce)) { - if(Z_OBJPROP_P(exception)->u.v.nApplyCount) { + if (Z_OBJPROP_P(exception)->u.v.nApplyCount) { Z_OBJPROP_P(exception)->u.v.nApplyCount--; } else { break; |