From:             RQuadling at GMail dot com
Operating system: Windows XP SP2
PHP version:      5.3CVS-2007-11-12 (snap)
PHP Bug Type:     Feature/Change Request
Bug description:  Use ^ as escape char for windows escapeshellcmd

Description:
------------
The windows version of escapeshellcmd replaces any of the special
characters with a space, whereas, on other platforms it escapes them.

There is a valid escape character for windows. It is the ^ character.

Taking the current set of type-able characters from exec.c, the following
is a proof of the ^ working ...

2007/11/12 13:22:42 V:\PHP\PHP5>echo foo ^' bar
foo ' bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^" bar
foo " bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^# bar
foo # bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^$ bar
foo $ bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^% bar
foo % bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^& bar
foo & bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^( bar
foo ( bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^) bar
foo ) bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^* bar
foo * bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^; bar
foo ; bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^? bar
foo ? bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^[ bar
foo [ bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^\ bar
foo \ bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^] bar
foo ] bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^^ bar
foo ^ bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^` bar
foo ` bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^{ bar
foo { bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^| bar
foo | bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^} bar
foo } bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^~ bar
foo ~ bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^< bar
foo < bar

2007/11/12 13:22:43 V:\PHP\PHP5>echo foo ^> bar
foo > bar

I can't easily emulate 0xA0 and 0xFF in this test.


I've included a patch also ...

Index: exec.c
===================================================================
RCS file: /repository/php-src/ext/standard/exec.c,v
retrieving revision 1.125
diff -u -r1.125 exec.c
--- exec.c      5 Nov 2007 14:06:19 -0000       1.125
+++ exec.c      12 Nov 2007 13:13:09 -0000
@@ -291,13 +291,12 @@
                        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 '%':
-                               cmd[y++] = ' ';
-                               break;
-#endif
+#ifdef PHP_WIN32
+                               cmd[y++] = '^';
+#else
                                cmd[y++] = '\\';
+#endif
                                /* fall-through */
                        default:
                                cmd[y++] = str[x];



http://rquadling.php1h.com/exec.c.patch.txt

Reproduce code:
---------------
php -r "exec(escapeshellcmd('echo foo | bar'), $a, $b); var_dump($a,
$b);"


Expected result:
----------------
array(1) {
  [0]=>
  string(10) "foo ^| bar"
}
int(0)

Actual result:
--------------
array(1) {
  [0]=>
  string(9) "foo   bar"
}
int(0)

-- 
Edit bug report at http://bugs.php.net/?id=43261&edit=1
-- 
Try a CVS snapshot (PHP 4.4): 
http://bugs.php.net/fix.php?id=43261&r=trysnapshot44
Try a CVS snapshot (PHP 5.2): 
http://bugs.php.net/fix.php?id=43261&r=trysnapshot52
Try a CVS snapshot (PHP 5.3): 
http://bugs.php.net/fix.php?id=43261&r=trysnapshot53
Try a CVS snapshot (PHP 6.0): 
http://bugs.php.net/fix.php?id=43261&r=trysnapshot60
Fixed in CVS:                 http://bugs.php.net/fix.php?id=43261&r=fixedcvs
Fixed in release:             
http://bugs.php.net/fix.php?id=43261&r=alreadyfixed
Need backtrace:               http://bugs.php.net/fix.php?id=43261&r=needtrace
Need Reproduce Script:        http://bugs.php.net/fix.php?id=43261&r=needscript
Try newer version:            http://bugs.php.net/fix.php?id=43261&r=oldversion
Not developer issue:          http://bugs.php.net/fix.php?id=43261&r=support
Expected behavior:            http://bugs.php.net/fix.php?id=43261&r=notwrong
Not enough info:              
http://bugs.php.net/fix.php?id=43261&r=notenoughinfo
Submitted twice:              
http://bugs.php.net/fix.php?id=43261&r=submittedtwice
register_globals:             http://bugs.php.net/fix.php?id=43261&r=globals
PHP 3 support discontinued:   http://bugs.php.net/fix.php?id=43261&r=php3
Daylight Savings:             http://bugs.php.net/fix.php?id=43261&r=dst
IIS Stability:                http://bugs.php.net/fix.php?id=43261&r=isapi
Install GNU Sed:              http://bugs.php.net/fix.php?id=43261&r=gnused
Floating point limitations:   http://bugs.php.net/fix.php?id=43261&r=float
No Zend Extensions:           http://bugs.php.net/fix.php?id=43261&r=nozend
MySQL Configuration Error:    http://bugs.php.net/fix.php?id=43261&r=mysqlcfg

Reply via email to