Re: Re: svn: /php/php-src/ branches/PHP_5_4/Zend/zend_execute_API.c trunk/Zend/zend_execute_API.c
| From: | Laruence | Date: | Tue, 07 Feb 2012 03:16:19 +0000 |
| Subject: | Re: Re: svn: /php/php-src/ branches/PHP_5_4/Zend/zend_execute_API.c trunk/Zend/zend_execute_API.c | ||
| References: | 1 2 3 4 5 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-57781@lists.php.net to get a copy of this message | ||
On Tue, Feb 7, 2012 at 1:47 AM, Stas Malyshev <smalyshev@sugarcrm.com> wrote:
> Hi!
>
>
>> there comes a new bug relate to this change, #60978, in php_cli.c
>
>
> I'm not sure this bug is critical enough to keep messing with the code base
> this close to the release. Could you please describe what is the current
> status, what was before the fix and what exactly the problems are here?
Hi Stats,
let me try to describe the whole thing. before any change. the
php -r implemented like:
exit_code = 0;
zend_try {
if ( zend_eval_stringl() == FAILUE) { [1]
exit_code = 254; [2]
}
} zend_end_try();
if (!exit_code) {
exit_code = EG(exit_code); [3]
}
in zend_eval_stringl:
op_array = compile(*); [4]
zend_execute(op_array); [5]
free(op_array);
return SUCCESS;
then there comes a bug, if longjmp(via die, exit or zend_bailout
directly) called in [5] (zend_execute), the [4] (op_array) will be
leaked. so dsp change the zend_eval_stringl to:
op_array = compile(**);
zend_try {
zend_execute(op_array);
} zend_end_try();
free(op_array);
return SUCCESS;
then Derick found this make his xdebug code won't works any more. in
xdebug, it expect zend_eval_stringl longjmp when error occurred. but
after dsp's fix, obviously, zend_eval_stringl will not jmp anymore.
so Derick change the codes to :
op_array = compile(**);
retval = SUCCESS;
zend_try {
zend_execute(op_array);
} zend_catch {
retval = FAILURE; [6]
} zend_end_try();
free(op_array);
return retval;
let look at [1], before any change, a call to exit(or die) in a
eval string, will let the process goto [3], then make the exit_code
eqaul to EG(exit_code).
after Derick's fix [6], a call to exit(or die) in a eval string
will lead the process goto [2], which cause the exit_code always be
254 [2].
so I proposal change the fix to:
op_array = compile(**);
zend_try {
zend_execute(op_array);
} zend_catch {
free(op_array);
zend_bailout();
} zend_end_try();
free(op_array);
return SUCCESS;
this change should can meet all the needs... and won't break any BCs.
do I describe this clearly ?
thanks
> --
> Stanislav Malyshev, Software Architect
> SugarCRM: http://www.sugarcrm.com/
> (408)454-6900 ext. 227
--
Laruence Xinchen Hui
http://www.laruence.com/