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