#25361 [Fbk]: Program Execution Functions fail in certain cases

From: Date: Fri, 03 Aug 2007 09:27:56 +0000
Subject: #25361 [Fbk]: Program Execution Functions fail in certain cases
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-115708@lists.php.net to get a copy of this message
 ID:               25361
 Updated by:       rquadling@php.net
 Reported By:      sam at freepeers dot com
 Status:           Feedback
 Bug Type:         Program Execution
 Operating System: Windows 2000
 PHP Version:      4.3.2
 New Comment:

From the cmd.exe /? help

If /C or /K is specified, then the remainder of the command line after
the switch is processed as a command line, where the following logic
is
used to process quote (") characters:

1. If all of the following conditions are met, then quote characters
on the command line are preserved:

- no /S switch
- exactly two quote characters
- no special characters between the two quote characters,
where special is one of: &<>()@^|
- there are one or more whitespace characters between the
the two quote characters
- the string between the two quote characters is the name
of an executable file.

2. Otherwise, old behavior is to see if the first character is
a quote character and if so, strip the leading character and
remove the last quote character on the command line, preserving
any text after the last quote character.

My intent is to force the command line supplied by exec() et. al. to be
wrapped in a pair of quotes, thus forcing option 2 to be used.

For older windows (9x), using command.com, the help is ...

/C string       Carries out the command specified by string, and then
stops.

If 9x is not a concern (I'm getting it tested next week as I don't have
a 9x machine at hand), then the first patch could be used which only
wraps "" around NT+.




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

[2007-08-03 09:10:28] rquadling@php.net

Non volatile link (Sorry Pierre) :
http://rquadling.php1h.com/proc_open.c.diff2

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

[2007-08-03 09:04:55] rquadling@php.net

Index: proc_open.c
===================================================================
RCS file: /repository/php-src/ext/standard/proc_open.c,v
retrieving revision 1.57
diff -u -r1.57 proc_open.c
--- proc_open.c	28 May 2007 23:00:25 -0000	1.57
+++ proc_open.c	2 Aug 2007 09:30:57 -0000
@@ -740,7 +740,7 @@
 	if (bypass_shell) {
 		newprocok = CreateProcess(NULL, command, &security, &security, TRUE,
NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, env.envp, cwd, &si, &pi);
 	} else {
-		spprintf(&command_with_cmd, 0, "%s /c %s", GetVersion() < 0x80000000
? COMSPEC_NT : COMSPEC_9X, command);
+		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);
 


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

[2007-08-02 09:33:59] rquadling@php.net

It may be that the /S is not required.

http://pastie.caboo.se/84306

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

[2007-08-02 09:28:08] rquadling@php.net

And thanks to Ashar Lohmar <asharlohmar@yahoo.com>, as he put me onto
this fix. He had a similar issue with wscript.

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

[2007-08-02 09:22:46] rquadling@php.net

For Windows NT+ (i.e. not win98-), this SEEMS to work.

cmd /s /c ""your long command" "another file""

Compare this against ...

cmd /c "your long command" "another file"

which doesn't work.

The /S option basically treats the rest of the string in quotes as a
command line.

This is slightly different behaviour.


%COMPSPEC% /S /C ""C:\Program Files\Internet Explorer\IEXPLORE.EXE"
"http://www.php.net""


This is a patch to proc_open.c which I think should deal with the
issue. It may need to be optimized.

Index: proc_open.c
===================================================================
RCS file: /repository/php-src/ext/standard/proc_open.c,v
retrieving revision 1.57
diff -u -r1.57 proc_open.c
--- proc_open.c	28 May 2007 23:00:25 -0000	1.57
+++ proc_open.c	2 Aug 2007 09:21:02 -0000
@@ -740,7 +740,12 @@
 	if (bypass_shell) {
 		newprocok = CreateProcess(NULL, command, &security, &security, TRUE,
NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, env.envp, cwd, &si, &pi);
 	} else {
-		spprintf(&command_with_cmd, 0, "%s /c %s", GetVersion() < 0x80000000
? COMSPEC_NT : COMSPEC_9X, command);
+		if (GetVersion() < 0x80000000) {
+			/* Wrap command in quotes and use the /s parameter to pass quotes
to the command line. */
+			spprintf(&command_with_cmd, 0, "%s /s /c \"%s\"", COMSPEC_NT,
command);
+		} else {
+			spprintf(&command_with_cmd, 0, "%s /c %s", COMSPEC_9X, command);
+		}
 
 		newprocok = CreateProcess(NULL, command_with_cmd, &security,
&security, TRUE, NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW, env.envp, cwd,
&si, &pi);
 
http://pastie.caboo.se/84303

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

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/25361

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


Thread (14 messages)

« previous php.bugs (#115708) next »