Sorry guys,
I've added below the unified and more readable diff.
Frode, about your comment I generally agree, it would be much easier to
implement it differently for Windows as a separate code. In this diff I tried
my best to avoid hurting Unix functionality.
Still comments are welcome.
Tzachi Tager.
cvs diff -u -- exec.c (in directory C:\php-src\ext\standard\)
Index: exec.c
===================================================================
RCS file: /repository/php-src/ext/standard/exec.c,v
retrieving revision 1.113.2.3.2.1
diff -u -r1.113.2.3.2.1 exec.c
--- exec.c 1 Jan 2007 09:36:08 -0000 1.113.2.3.2.1
+++ exec.c 28 Jun 2007 14:15:42 -0000
@@ -272,45 +272,58 @@
for (x = 0, y = 0; x < l; x++) {
switch (str[x]) {
case '"':
- case '\'':
#ifndef PHP_WIN32
+ case '\'':
+#endif
if (!p && (p = memchr(str + x + 1, str[x], l -
x - 1))) {
/* noop */
} else if (p && *p == str[x]) {
p = NULL;
} else {
+#ifndef PHP_WIN32
cmd[y++] = '\\';
+#else
+ cmd[y++] = '"';
+ cmd[y++] = '^';
+ cmd[y++] = str[x];
+#endif
}
cmd[y++] = str[x];
break;
-#endif
- case '#': /* This is character-set independent */
case '&':
- case ';':
- case '`':
case '|':
- case '*':
- case '?':
- case '~':
case '<':
case '>':
case '^':
case '(':
case ')':
+#ifdef PHP_WIN32
+ case '%':
+ cmd[y++] = '"';
+ cmd[y++] = '^';
+ cmd[y++] = str[x];
+ cmd[y++] = '"';
+ break;
+#endif
+ case '#': /* This is character-set independent */
+ case ';':
+ case '`':
+ case '*':
+ case '?':
+ case '~':
case '[':
case ']':
case '{':
case '}':
case '$':
- case '\\':
case '\x0A': /* excluding these two */
case '\xFF':
#ifdef PHP_WIN32
- /* since Windows does not allow us to escape these
chars, just remove them */
- case '%':
+ /* since Windows does not allow us to escape
these chars, just remove them */
cmd[y++] = ' ';
break;
#endif
+ case '\\':
cmd[y++] = '\\';
/* fall-through */
default:
@@ -344,7 +357,6 @@
switch (str[x]) {
#ifdef PHP_WIN32
case '"':
- case '%':
cmd[y++] = ' ';
break;
#else
-----Original Message-----
From: Frode E. Moe [mailto:[EMAIL PROTECTED]
Sent: ו 06 יולי 2007 09:42
To: Tzachi Tager
Cc: [email protected]
Subject: Re: [PHP-DEV] Suggestion for fixing Bug #40928
On Fri, Jul 06, 2007 at 01:29:31 +0300, Tzachi Tager wrote:
> Hi,
> I was looking at Bug #40928 - escapeshellarg() does not quote percent
> (%) correctly for cmd.exe.
> This bug seems to be because escapeshellarg() in Windows replaces '%'
> and '"' with spaces, while assuming there isn't a real escaping method
> for command line in Windows. Therefore I'm guessing no one really use
> escapeshellarg() or escapeshellcmd() on Windows. And in order to change
> this I suggest to use the command line escaping that does exists
> (although looking a bit ugly), as you can see for example here:
> http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs
> /en-us/ntcmds_shelloverview.mspx?mfr=true , quoting: "You can use most
> characters as variable values, including white space. If you use the
> special characters <, >, |, &, or ^, you must precede them with the
> escape character (^) or quotation marks." - So all special characters
> will be replaced with "^<char>".
> So this is the diff file that I suggest to use- it for sure fix the
> above bug and may improve windows escapeshellcmd():
Hi, I'm the guy who reported the bug originally.
When I read your post now, I just realized that maybe there should be a
different set of escaping functions for win32 ("escapewin32arg" or
"escapecmdarg"?), so that the behaviour of escapeshellarg() does not change
across platforms. (What if you want to dynamically generate a downloadable
unix shell script, for example.)
Your patch was a bit difficult to read (too little context and not in
unidiff format), so I'll leave the commenting for those more familiar
with the C source.
Thanks for working on the problem, anyway!
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php