php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #66227 exec() returns early upon multiple signals
Submitted: 2013-12-03 18:12 UTC Modified: -
Votes:2
Avg. Score:3.5 ± 1.5
Reproduced:1 of 1 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: bhiggins at arbor dot net Assigned:
Status: Open Package: Scripting Engine problem
PHP Version: 5.5Git-2013-12-03 (Git) OS: Linux
Private report: No CVE-ID: None
View Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
If you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: bhiggins at arbor dot net
New email:
PHP Version: OS:

 

 [2013-12-03 18:12 UTC] bhiggins at arbor dot net
Description:
------------
The exec() routine fails to read its child process output, when the php program receives multiple signals - ie, SIGUSR1 is received in the apache process multiple times.

exec() calls php_stream_read_line(), which calls php_stream_fill_read_buffer(), which calls php_stdio_read().  php_stdio_read() attempts to read from the pipe to the child process, but only retries the read once when the read is interrupted.

I have encountered a scenario in which the second read is also interrupted.  When this happens, the error bubbles up the stack, ultimately resulting in errors in the child process (when it tries to write to its closed stdout pipe) and a failure of the exec() call to gather output from the child process.

I have a patch that retries the read indefinitely when it's interrupted.  This appears to fix the issue.

Test script:
---------------
No script.  Run php in apache, and exec() a child process that sleeps for 30 seconds.  Then, kill -USR1 <apache pid> multiple times.  The child process will fail to write to stdout, and the exec() call will not return the output from the child process.


Patches

php-read-retry.diff (last revision 2013-12-03 18:12 UTC by bhiggins at arbor dot net)

Pull Requests

 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Wed Dec 11 22:01:27 2024 UTC