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: internals@lists.php.net
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

Reply via email to