]> granicus.if.org Git - php/commitdiff
Proper fix for bug #39215 Inappropriate close of stdin/stdout/stderr
authorDmitry Stogov <dmitry@php.net>
Thu, 21 Jun 2007 12:42:36 +0000 (12:42 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 21 Jun 2007 12:42:36 +0000 (12:42 +0000)
ext/standard/php_fopen_wrapper.c

index 165b3f4124743e6a361e036e74eb7fc7e3b3bc7d..52fb11f5a70e5a9ce4894b3c61d79b82c13aedc8 100644 (file)
@@ -159,6 +159,7 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, ch
        php_stream * stream = NULL;
        char *p, *token, *pathdup;
        long max_memory;
+       FILE *file = NULL;
 
        if (!strncasecmp(path, "php://", 6)) {
                path += 6;
@@ -210,6 +211,7 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, ch
                                fd = dup(fd);
                        } else {
                                cli_in = 1;
+                               file = stdin;
                        }
                } else {
                        fd = dup(STDIN_FILENO);
@@ -222,6 +224,7 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, ch
                                fd = dup(fd);
                        } else {
                                cli_out = 1;
+                               file = stdout;
                        }
                } else {
                        fd = dup(STDOUT_FILENO);
@@ -234,6 +237,7 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, ch
                                fd = dup(fd);
                        } else {
                                cli_err = 1;
+                               file = stderr;
                        }
                } else {
                        fd = dup(STDERR_FILENO);
@@ -285,10 +289,14 @@ php_stream * php_stream_url_wrap_php(php_stream_wrapper *wrapper, char *path, ch
                /* failed to dup */
                return NULL;
        }
-       
-       stream = php_stream_fopen_from_fd(fd, mode, NULL);
-       if (stream == NULL) {
-               close(fd);
+
+       if (file) {
+               stream = php_stream_fopen_from_file(file, mode);
+       } else {        
+               stream = php_stream_fopen_from_fd(fd, mode, NULL);
+               if (stream == NULL) {
+                       close(fd);
+               }
        }
  
        return stream;