php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #60505 When a script exits due to write/flush failure, php cli still returns 0
Submitted: 2011-12-12 23:11 UTC Modified: -
From: Chris_Horneck at symantec dot com Assigned:
Status: Open Package: *General Issues
PHP Version: 5.3.8 OS: Platform agnostic
Private report: No CVE-ID: None
 [2011-12-12 23:11 UTC] 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.

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2024-01-23 09:20 UTC] ameliabr dot nnr at gmail dot com
The post is very useful. Thank you for this useful information. (https://github.com)|(https://www-subwaylistens.com/)
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Dec 06 04:01:28 2024 UTC