Hi David,
When I was just checking PHP 5.4 compatibility with Xdebug I ran into
the case where zend_eval_string() no longer would bail out when you'd
evalulate something that doesn't work (like a standalone
"$this->property;" without being in a class scope).
Xdebug has code (simplified) like this:
int res = FAILURE;
zend_first_try {
res = zend_eval_string(eval_string, ret_zval, "xdebug://debug-eval"
TSRMLS_CC);
} zend_end_try();
return res;
This means that when zend_eval_string would cause an engine exception,
res would be FAILURE. It would only be true if zend_eval_string
succesfully completed.
However, after your patch, my "res" would still be set to SUCCESS. This
is because zend_execute's bailout is now caught by the zend_end_try that
you added:
int retval;
new_op_array = zend_compile_string(&pv, string_name TSRMLS_CC);
if (new_op_array) {
zend_try { // new code
zend_execute(new_op_array TSRMLS_CC);
} zend_end_try(); // new code
retval = SUCCESS;
Obvious, the return value should not be SUCCESS if something incorrect
was tried to be eval'ed.
Your patch also changes the behaviour of zend_eval_string; which is
probably not a very big issue for many people, but it can easily be
addressed by the following patch:
Index: zend_execute_API.c
===================================================================
--- zend_execute_API.c (revision 322905)
+++ zend_execute_API.c (working copy)
@@ -1195,8 +1195,11 @@
}
CG(interactive) = 0;
+ retval = SUCCESS;
zend_try {
zend_execute(new_op_array TSRMLS_CC);
+ } zend_catch {
+ retval = FAILURE;
} zend_end_try();
CG(interactive) = orig_interactive;
@@ -1218,7 +1221,6 @@
destroy_op_array(new_op_array TSRMLS_CC);
efree(new_op_array);
EG(return_value_ptr_ptr) = original_return_value_ptr_ptr;
- retval = SUCCESS;
} else {
retval = FAILURE;
}
The patch just changes the setting of the return value around, and I think we
should include this in the upcoming RC.
cheers,
Derick
On Sat, 12 Nov 2011, David Soria Parra wrote:
> dsp Sat, 12 Nov 2011 17:05:08 +0000
>
> Revision: http://svn.php.net/viewvc?view=revision&revision=319102
>
> Log:
> Fix #60218 (instantiating unknown class leads to memory leak in cli)
>
> Bug: https://bugs.php.net/60218 (error getting bug information)
>
> Changed paths:
> U php/php-src/branches/PHP_5_4/Zend/zend_execute_API.c
> U php/php-src/trunk/Zend/zend_execute_API.c
>
> Modified: php/php-src/branches/PHP_5_4/Zend/zend_execute_API.c
> ===================================================================
> --- php/php-src/branches/PHP_5_4/Zend/zend_execute_API.c 2011-11-12
> 16:32:10 UTC (rev 319101)
> +++ php/php-src/branches/PHP_5_4/Zend/zend_execute_API.c 2011-11-12
> 17:05:08 UTC (rev 319102)
> @@ -1195,7 +1195,9 @@
> }
> CG(interactive) = 0;
>
> - zend_execute(new_op_array TSRMLS_CC);
> + zend_try {
> + zend_execute(new_op_array TSRMLS_CC);
> + } zend_end_try();
>
> CG(interactive) = orig_interactive;
> if (local_retval_ptr) {
>
> Modified: php/php-src/trunk/Zend/zend_execute_API.c
> ===================================================================
> --- php/php-src/trunk/Zend/zend_execute_API.c 2011-11-12 16:32:10 UTC (rev
> 319101)
> +++ php/php-src/trunk/Zend/zend_execute_API.c 2011-11-12 17:05:08 UTC (rev
> 319102)
> @@ -1195,7 +1195,9 @@
> }
> CG(interactive) = 0;
>
> - zend_execute(new_op_array TSRMLS_CC);
> + zend_try {
> + zend_execute(new_op_array TSRMLS_CC);
> + } zend_end_try();
>
> CG(interactive) = orig_interactive;
> if (local_retval_ptr) {
>
>
--
http://derickrethans.nl | http://xdebug.org
Like Xdebug? Consider a donation: http://xdebug.org/donate.php
twitter: @derickr and @xdebug
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php