Bug #60505 [Com]: When a script exits due to write/flush failure, php cli still returns 0
| From: | ameliabr dot nnr at gmail dot com | 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