Is it possible that switching /S on will break existing scripts?
If so, it's probably better to make the comspec setting a PHP .ini
option that only the admin can change and allow /S to be set there.

--Wez.

On 2/5/06, Tim Starling <[EMAIL PROTECTED]> wrote:
> This patch is untested, my apologies for that. I don't have a working Visual 
> C++ environment in
> which to compile PHP at the moment. I have, however, tested the concepts 
> involved. I can also
> provide test cases and expected output if that would help.
>
> The problem is PHP's incorrect invocation of cmd.exe, which causes no end of 
> trouble to those
> developing PHP applications on Windows systems. You can find many workarounds 
> for it in the manual
> comments, but a permanent, robust fix is actually quite simple, at least for 
> NT-based versions of
> Windows.
>
> Here is an extract of the output of "help cmd" on Windows XP:
>
> CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
>     [[/S] [/C | /K] string]
>
> /C      Carries out the command specified by string and then terminates
> /K      Carries out the command specified by string but remains
>
> [...]
>
> 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.
>
> [end quote]
>
> This provides a simple, robust means to execute a command via cmd.exe:
>
> cmd.exe /s /c "...command goes here..."
>
> Otherwise, the programmer risks being plunged into a world of heuristic pain 
> that only a Microsoft
> developer could love. Some instructive examples:
>
> C:\>cmd /c "C:\Program Files\ImageMagick-6.2.6-Q16\convert.exe"
> Version: ImageMagick 6.2.6 01/27/06 Q16 http://www.imagemagick.org
> Copyright: Copyright (C) 1999-2006 ImageMagick Studio LLC
>
> Usage: convert.exe [options ...] file [ [options ...] file ...] [options ...] 
> file
> [...]
>
> C:\>cmd /c "C:\Program Files\ImageMagick-6.2.6-Q16\convert.exe" -version
> Version: ImageMagick 6.2.6 01/27/06 Q16 http://www.imagemagick.org
> Copyright: Copyright (C) 1999-2006 ImageMagick Studio LLC
>
> C:\>cmd /c "C:\Program Files\ImageMagick-6.2.6-Q16\convert.exe" "some file"
> 'C:\Program' is not recognized as an internal or external command,
> operable program or batch file.
>
> C:\>cd "C:\Program Files\ImageMagick-6.2.6-Q16"
>
> C:\Program Files\ImageMagick-6.2.6-Q16>cmd /c "convert source dest"
> convert: unable to open image `source': No such file or directory.
> convert: missing an image filename `dest'.
>
> C:\Program Files\ImageMagick-6.2.6-Q16>echo @echo G'day > "convert source 
> dest.bat"
>
> C:\Program Files\ImageMagick-6.2.6-Q16>cmd /c "convert source dest"
> G'day
>
>
>
> Positively scary. /s restores sanity to the situation:
>
> C:\Program Files\ImageMagick-6.2.6-Q16>cmd /s /c "convert source dest"
> convert: unable to open image `source': No such file or directory.
> convert: missing an image filename `dest'.
>
>
> Users of COMMAND.COM are not so blessed. There's no handling for double 
> quotes at all, so if you
> want to execute a program with spaces in the name, you just have to use the 
> 8.3 alias. In my patch,
> this is the responsibility of the application.
>
> C:\>command.com /s /c "echo hello"
> Invalid switch
> Bad command or file name
>
> The problem as it manifests itself in PHP was reported as Bug #34671, and 
> closed as bogus by a
> trigger-happy admin. You can't work around it properly in application-level 
> code, because you can't
> specify /s.
>
> -- Tim Starling
>
>
> Index: TSRM/tsrm_win32.c
> ===================================================================
> RCS file: /repository/TSRM/tsrm_win32.c,v
> retrieving revision 1.28
> diff -u -r1.28 tsrm_win32.c
> --- TSRM/tsrm_win32.c   1 Jan 2006 13:09:48 -0000       1.28
> +++ TSRM/tsrm_win32.c   6 Feb 2006 01:53:29 -0000
> @@ -209,8 +209,15 @@
>                 startup.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
>         }
>
> -       cmd = (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c 
> "));
> -       sprintf(cmd, "%s /c %s", TWG(comspec), command);
> +       if (GetVersion()<0x80000000) {
> +               /* NT calling convention: quotes around everything, /s to 
> disable heuristics */
> +               cmd = 
> (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /s /c \"\""));
> +               sprintf(cmd, "%s /s /c \"%s\"", TWG(comspec), command);
> +       } else {
> +               /* 95/98/Me calling convention. Long names need to be 
> converted to short names by the application. */
> +               cmd = 
> (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c "));
> +               sprintf(cmd, "%s /c %s", TWG(comspec), command);
> +       }
>         if (!CreateProcess(NULL, cmd, &security, &security, 
> security.bInheritHandle, NORMAL_PRIORITY_CLASS, env, cwd, &startup, 
> &process)) {
>                 return NULL;
>         }
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to