Bug #60505 [Com]: When a script exits due to write/flush failure, php cli still returns 0

From: Date: Tue, 23 Jan 2024 09:20:42 +0000
Subject: Bug #60505 [Com]: When a script exits due to write/flush failure, php cli still returns 0
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-246320@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=60505&edit=1 ID: 60505 Comment by: ameliabr dot nnr at gmail dot com Reported by: Chris_Horneck at symantec dot com Summary: When a script exits due to write/flush failure, php cli still returns 0 Status: Open Type: Bug Package: *General Issues Operating System: Platform agnostic PHP Version: 5.3.8 Block user comment: N Private report: N New Comment: The post is very useful. Thank you for this useful information. (https://github.com)|(https://www-subwaylistens.com/) Previous Comments: ------------------------------------------------------------------------ [2011-12-12 23:11:32] Chris_Horneck at symantec dot com Description: ------------ Here is the scenario that causes the issue: In php.ini, ignore_user_abort=0 Have a PHP script that writes to standard out using 'echo'. The php script is launched by a shell script that redirects standard out to a file. If the partition/disk that receives the standard out file fills up while the script is running, eventually the 'echo' will cause the script to bail out because PHP was unable to write to the output stream due to the disk being full. However, the php process will exit with error code 0 even though the script never completed. The root cause is in main.c php_execute_script. If an error occurs and zend_execute_scripts returns via longjmp, both retval and EG(exit_status) will still both be 0. This makes it difficult to ascertain whether or not your script ran successfully. The obvious fix seems to be to add a zend_catch block that would set retval and EG(exit_status) to FAILURE, but I am unsure if that would have any unwanted impact. This fix doesn't make the situation any easier to debug, but it at least allows php to exit with a proper error code. Test script: --------------- <?php $logfile = $argv[1]; function doLog($msg) { global $logfile; $datestr = date("Y-M-d H:i:s T",time()); $msg="[".$datestr."]". $msg . "\n"; file_put_contents($logfile, $msg, FILE_APPEND); } doLog("Starting test"); $i = 0; while(true) { echo "Echoing a string to standard out!!!\n"; if((++$i % 10) == 0) { doLog("Completed $i iterations"); } } doLog("Script exited normally"); return 0; ?> Expected result: ---------------- Expect the script to either run to completion or that PHP would exit with an error Actual result: -------------- In the case of the above script, the script bails out without running to completion, but an error code of 0 is returned to the parent process. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=60505&edit=1

« previous php.bugs (#246320) next »