Edit report at https://bugs.php.net/bug.php?id=60978&edit=1
ID: 60978 Updated by: larue...@php.net Reported by: the...@php.net Summary: exit code incorrect Status: Assigned Type: Bug Package: Scripting Engine problem Operating System: Windows PHP Version: 5.4.0RC7 -Assigned To: derick +Assigned To: laruence Block user comment: N Private report: N New Comment: fixed in trunk, and also "make it works" in 5.4 , I will close this after I ci the final fix to 5.4(as long as 5.4.0 release) Previous Comments: ------------------------------------------------------------------------ [2012-02-08 03:03:08] larue...@php.net Automatic comment from SVN on behalf of laruence Revision: http://svn.php.net/viewvc/?view=revision&revision=323120 Log: Revert -r319102 and -r322922 in 5.4 branch since they introduce #60978 Fixed #60978 in trunk without reverting previous fix #see http://news.php.net/php.internals/57789 ------------------------------------------------------------------------ [2012-02-06 09:57:29] larue...@php.net I think a appropriate way to fix these issues(memleak, xdebug, this issue) is catch->efree->throw. I have made a patch. Derick, what do you think? ------------------------------------------------------------------------ [2012-02-06 09:55:47] larue...@php.net The following patch has been added/updated: Patch Name: wrong_exit_code.patch Revision: 1328522147 URL: https://bugs.php.net/patch-display.php?bug=60978&patch=wrong_exit_code.patch&revision=1328522147 ------------------------------------------------------------------------ [2012-02-05 13:36:33] the...@php.net Checking SVN history revealed r322922 as the cause - see http://svn.php.net/viewvc?view=revision&revision=322922. Reverting it fixes this bug. The commit mentions a relation to bug #60218 but I'm not sure why it "Reinstated correct return values". Before this fix the code in zend_execute_API.c read: zend_execute(new_op_array TSRMLS_CC); [...] retval = SUCCESS; After the fix it read: zend_try { zend_execute(new_op_array TSRMLS_CC); } zend_end_try(); [...] retval = SUCCESS; Finally, r322922 changed it to: retval = SUCCESS; zend_try { zend_execute(new_op_array TSRMLS_CC); } zend_catch { retval = FAILURE; } zend_end_try(); The zend_catch "block" is executed whenever SETJMP returns non-zero, so basically when LONGJMP is called, which is the case for zend_bailout(), which again is used by exit() and die(). To my eyes, this *changed* the return value instead of reinstating it. @derick, maybe you can shed some light on this commit? ------------------------------------------------------------------------ [2012-02-05 10:54:30] the...@php.net Test suite: <?php if (!isset($argv[1])) { exit("*** Usage: php exit.php /path/to/php/binary\n"); } $php= realpath($argv[1]); if (!is_executable($php)) { exit("*** PHP Binary '$argv[1]' is not executable\n"); } $tests= array( "echo '';" => 0, "exit('test');" => 0, "exit(2);" => 2, "fatal();" => 255, "\$->" => 254, "throw new Exception('test');" => 255 ); foreach ($tests as $source => $expected) { $cmd= '"'.$php.'" -r "'.$source.'" 2>&1'; $output= array(); exec($cmd, $output, $actual); if ($actual === $expected) { printf("%-30s: [OK]\n", $source); } else { printf("%-30s: [FAIL, expect %d, have %d (%s)]\n", $source, $expected, $actual, implode(' ', $output)); } } ?> ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=60978 -- Edit this bug report at https://bugs.php.net/bug.php?id=60978&edit=1