]> 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:58 +0000 (12:42 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 21 Jun 2007 12:42:58 +0000 (12:42 +0000)
ext/standard/php_fopen_wrapper.c

index ea1861b28f9ce2c55b46969228f139ed840ce4f6..0ba6303156fdca0dceb70f697e43718f706ebcb3 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;
@@ -212,6 +213,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);
@@ -224,6 +226,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);
@@ -236,6 +239,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);
@@ -287,10 +291,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;