]> granicus.if.org Git - php/commitdiff
#41874, separate STDOUT and STDERR in exec functions
authorPierre Joye <pajoye@php.net>
Tue, 9 Jun 2009 00:25:37 +0000 (00:25 +0000)
committerPierre Joye <pajoye@php.net>
Tue, 9 Jun 2009 00:25:37 +0000 (00:25 +0000)
TSRM/tsrm_win32.c
ext/standard/proc_open.c
ext/standard/tests/file/bug41874.phpt [new file with mode: 0644]
ext/standard/tests/file/bug41874_1.phpt [new file with mode: 0644]
ext/standard/tests/file/bug41874_2.phpt [new file with mode: 0644]
ext/standard/tests/file/bug41874_3.phpt [new file with mode: 0644]

index 7eb18b29d3f1517276980f12a88b38450091a9da..027e20b2ae64317fcbecafcdc06e6483aa780429 100644 (file)
@@ -251,6 +251,7 @@ TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd,
        PROCESS_INFORMATION process;
        SECURITY_ATTRIBUTES security;
        HANDLE in, out;
+       DWORD dwCreateFlags = 0;
        char *cmd;
        process_pair *proc;
        TSRMLS_FETCH();
@@ -273,7 +274,6 @@ TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd,
        read = (type[0] == 'r') ? TRUE : FALSE;
        mode = ((str_len == 2) && (type[1] == 'b')) ? O_BINARY : O_TEXT;
 
-
        if (read) {
                in = dupHandle(in, FALSE);
                startup.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);
@@ -284,9 +284,14 @@ TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd,
                startup.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
        }
 
+       dwCreateFlags = NORMAL_PRIORITY_CLASS;
+       if (strcmp(sapi_module.name, "cli") != 0) {
+               dwCreateFlags |= CREATE_NO_WINDOW;
+       }
+
        cmd = (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c ")+2);
        sprintf(cmd, "%s /c \"%s\"", TWG(comspec), command);
-       if (!CreateProcess(NULL, cmd, &security, &security, security.bInheritHandle, NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, env, cwd, &startup, &process)) {
+       if (!CreateProcess(NULL, cmd, &security, &security, security.bInheritHandle, dwCreateFlags, env, cwd, &startup, &process)) {
                return NULL;
        }
        free(cmd);
index b7f6c67fb8a9392adfd111311fe16f88bbb0f6dc..584d175a4309560f977c01284b8652d4db16feaf 100644 (file)
@@ -483,6 +483,7 @@ PHP_FUNCTION(proc_open)
        STARTUPINFO si;
        BOOL newprocok;
        SECURITY_ATTRIBUTES security;
+       DWORD dwCreateFlags = 0;
        char *command_with_cmd;
        UINT old_error_mode;
 #endif
@@ -754,12 +755,17 @@ PHP_FUNCTION(proc_open)
                old_error_mode = SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX);
        }
        
+       dwCreateFlags = NORMAL_PRIORITY_CLASS;
+       if(strcmp(sapi_module.name, "cli") != 0) {
+               dwCreateFlags |= CREATE_NO_WINDOW;
+       }
+
        if (bypass_shell) {
-               newprocok = CreateProcess(NULL, command, &security, &security, TRUE, NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, env.envp, cwd, &si, &pi);
+               newprocok = CreateProcess(NULL, command, &security, &security, TRUE, dwCreateFlags, env.envp, cwd, &si, &pi);
        } else {
                spprintf(&command_with_cmd, 0, "%s /c %s", GetVersion() < 0x80000000 ? COMSPEC_NT : COMSPEC_9X, command);
 
-               newprocok = CreateProcess(NULL, command_with_cmd, &security, &security, TRUE, NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, env.envp, cwd, &si, &pi);
+               newprocok = CreateProcess(NULL, command_with_cmd, &security, &security, TRUE, dwCreateFlags, env.envp, cwd, &si, &pi);
                
                efree(command_with_cmd);
        }
diff --git a/ext/standard/tests/file/bug41874.phpt b/ext/standard/tests/file/bug41874.phpt
new file mode 100644 (file)
index 0000000..c6f9fed
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+bug #41874 (Separate STDOUT and STDERR in exec functions)
+--CREDITS--
+Venkat Raman Don
+--SKIPIF--
+<?php
+if(substr(PHP_OS, 0, 3) != 'WIN' ) {
+       die('skip windows only test');
+}
+?>
+--FILE--
+<?php
+$result = exec('cd 1:\\non_existant; dir nonexistant');
+echo "$result";
+system('cd 1:\\non_existant; dir nonexistant');
+$result = shell_exec('cd 1:\\non_existant; dir nonexistant');
+echo $result;
+?>
+--EXPECT--
+The system cannot find the drive specified.
+The system cannot find the drive specified.
+The system cannot find the drive specified.
diff --git a/ext/standard/tests/file/bug41874_1.phpt b/ext/standard/tests/file/bug41874_1.phpt
new file mode 100644 (file)
index 0000000..c6ddef8
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+bug #41874 (Separate STDOUT and STDERR in exec functions)
+--CREDITS--
+Venkat Raman Don
+--SKIPIF--
+<?php
+if(substr(PHP_OS, 0, 3) != 'WIN' ) {
+               die('skip windows only test');
+}
+?>
+--FILE--
+<?php
+popen("1:\\non_existent", "r");
+?>
+--EXPECT--
+The system cannot find the drive specified.
\ No newline at end of file
diff --git a/ext/standard/tests/file/bug41874_2.phpt b/ext/standard/tests/file/bug41874_2.phpt
new file mode 100644 (file)
index 0000000..5d7b7ca
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+bug #41874 (Separate STDOUT and STDERR in exec functions)
+--CREDITS--
+Venkat Raman Don
+--SKIPIF--
+<?php
+if(substr(PHP_OS, 0, 3) != 'WIN' ) {
+               die('skip windows only test');
+}
+?>
+--FILE--
+<?php
+$result = exec('cd 1:\\non_existant; dir nonexistant');
+echo "$result";
+?>
+--EXPECT--
+The system cannot find the drive specified.
\ No newline at end of file
diff --git a/ext/standard/tests/file/bug41874_3.phpt b/ext/standard/tests/file/bug41874_3.phpt
new file mode 100644 (file)
index 0000000..4d7b139
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+bug #41874 (Separate STDOUT and STDERR in exec functions)
+--CREDITS--
+Venkat Raman Don
+--SKIPIF--
+<?php
+if(substr(PHP_OS, 0, 3) != 'WIN' ) {
+               die('skip windows only test');
+}
+?>
+--FILE--
+<?php
+system('cd 1:\\non_existant; dir nonexistant');
+?>
+--EXPECT--
+The system cannot find the drive specified.
\ No newline at end of file