php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #48506 upcoming apr closes descriptors by default
Submitted: 2009-06-09 13:47 UTC Modified: 2017-10-24 06:12 UTC
From: arekm at maven dot pl Assigned:
Status: Open Package: Apache2 related
PHP Version: 5.2.9 OS:
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
Package:
Bug Type:
Summary:
From: arekm at maven dot pl
New email:
PHP Version: OS:

 

 [2009-06-09 13:47 UTC] arekm at maven dot pl
Description:
------------
Upcoming apr 2.0.0 (or 1.3 with backported patch) uses O_CLOEXEC for own descriptors by default.

This means that when using shell_exec() the run script/binary has no stdin/stdout/stderr due to O_CLOEXEC. This also means that if any output is produced then script ends with EPIPE.

Tested with apache + apr 1.3 with backported patch.

http://svn.apache.org/viewvc/apr/apr/trunk/CHANGES?r1=747357&r2=748988



Reproduce code:
---------------
<?php
echo shell_exec("LC_ALL=C strace -o /tmp/WYNIK -f -F -s 200 ls -l /notexistingfile");
?>

Run from apache + php + apr 1.3 + backported O_CLOEXEC patch like this one http://cvs.pld-linux.org/cgi-bin/cvsweb/packages/apr/apr-bug-46425.patch?rev=1.8

Expected result:
----------------
run "ls -l" and produce some output about file not existing

Actual result:
--------------
30120 lstat("/notexistingfile", 0x18f55f0) = -1 ENOENT (No such file or directory)
30120 write(2, "ls: ", 4)               = -1 EBADF (Bad file descriptor)
30120 write(2, "cannot access /notexistingfile", 30) = -1 EBADF (Bad file descriptor)
30120 write(2, ": No such file or directory", 27) = -1 EBADF (Bad file descriptor)
30120 write(2, "\n", 1)                 = -1 EBADF (Bad file descriptor)
30120 close(1)                          = 0
30120 close(2)                          = -1 EBADF (Bad file descriptor)
30120 exit_group(2)

As you can see there is no file descriptor 2 and this means that ls output is lost.


Probably the best for php is to always provide own descriptors without relying on apache provided one.           

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2009-07-25 15:01 UTC] arekm at maven dot pl
Note that latest released stable apr 1.3.6 also contains these changes and distributions will start to pick up these soon.)
 [2010-12-20 14:28 UTC] jani@php.net
-Package: Feature/Change Request +Package: Apache2 related
 [2017-10-24 06:12 UTC] kalle@php.net
-Status: Assigned +Status: Open -Assigned To: scottmac +Assigned To:
 
PHP Copyright © 2001-2019 The PHP Group
All rights reserved.
Last updated: Wed Oct 23 02:01:31 2019 UTC