On Tue, Feb 7, 2012 at 1:47 AM, Stas Malyshev <smalys...@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/

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to