ID:               37726
 User updated by:  n dot escuder at intra-links dot com
 Reported By:      n dot escuder at intra-links dot com
 Status:           Open
 Bug Type:         Program Execution
 Operating System: Linux
 PHP Version:      5.1.4
 New Comment:

This is not the same in the bug #34794 the patch i see is only for new
opened descriptor and not all opened descriptor ( databases connections
... ).
In proc_open you use fork for creating a new child and change de
descriptor of STDIN STDOUT STDERR and after you do an exec.
Just before doing the exec you must close all open descriptor greater
than STDERR.


Previous Comments:
------------------------------------------------------------------------

[2006-06-25 17:51:36] jdolecek at NetBSD dot org

This may be the same problem as Bug #34794, which includes the fix.

------------------------------------------------------------------------

[2006-06-07 17:08:45] n dot escuder at intra-links dot com

Yes when we do a pcntl_fork or a fork in C the FD must stay open but
here it's a complety new program that is started.
Proc_open use fork for starting the new process but don't cleanup open
descriptor after the fork.

------------------------------------------------------------------------

[2006-06-07 15:16:24] [EMAIL PROTECTED]

IMHO, I think this is expected. When you fork under unix the open file
descriptors will be copied to the child process. proc_open just
enforces what the specified fd should look like.

------------------------------------------------------------------------

[2006-06-07 10:56:45] n dot escuder at intra-links dot com

Description:
------------
When executing a program with proc_open the child process that is
started by proc_open have all fd's that was opened in the master script
ex: file, database connection ....

The child process must don't have any fd open expect the fd specified
by $descriptorspec.

Reproduce code:
---------------
<?
$fd = fopen("/tmp/test.log", "w");

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("pipe", "w")
);

$pipes = null;

$process = proc_open("ls /proc/self/fd -l", $descriptorspec, $pipes);

while ( ( $line = fgets($pipes[1]) ) ) {
  echo $line;
}
proc_close( $process );
fclose($fd );
?>


Expected result:
----------------
total 5
lr-x------ 1 root root 64 2006-06-07 12:44 0 -> pipe:[22573]
l-wx------ 1 root root 64 2006-06-07 12:44 1 -> pipe:[22574]
l-wx------ 1 root root 64 2006-06-07 12:44 2 -> pipe:[22575]
lr-x------ 1 root root 64 2006-06-07 12:44 3 -> /proc/19964/fd


Actual result:
--------------
total 5
lr-x------ 1 root root 64 2006-06-07 12:44 0 -> pipe:[22573]
l-wx------ 1 root root 64 2006-06-07 12:44 1 -> pipe:[22574]
l-wx------ 1 root root 64 2006-06-07 12:44 2 -> pipe:[22575]
l-wx------ 1 root root 64 2006-06-07 12:44 3 -> /tmp/test.log
lr-x------ 1 root root 64 2006-06-07 12:44 4 -> /proc/19964/fd



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=37726&edit=1

Reply via email to