Handle quotes in command lines
Uwe Bonnes
bon at elektron.ikp.physik.tu-darmstadt.de
Thu Jan 10 16:29:23 CST 2002
>>>>> "Francois" == Francois Gouget <fgouget at free.fr> writes:
Francois> On Thu, 10 Jan 2002, Uwe Bonnes wrote:
>> Hallo,
>>
>> some application builds a commandline with arguments enclosed by
>> quotes '"', starts a daughter process with this commandline and
>> relies on the quotes being intact in the daughter process. Wine
>> happily removed the quotes and so the daughter process failed.
>> Appended patch keeps quotes intact, tested via CreateProcess and
>> calling a programm from the shell. When invoking wine from the shell,
>> quotes need to be escaped, like any other special characters.
Francois> No. Your patch mishandles quotes.
Francois> Normal behavior: $ ./createp Type the command to execute: main
Francois> a\"b "c\"d\\" e CreateProcess returned: 1 error=0
Francois> GetCommandLine=[main a\"b c\"d\ e] main -> argc=4 0 [main] 1
Francois> [a"b] 2 [c"d\] 3 [e]
Show me what lpCmdLine your test program passes to CreateProsess. Are you
sure createp code doesn't misshandle things. Trying with my commandline
test program, it looks right:
: > wine -- cmdline.exe a\"b "c\"d\\" e
: fixme:win32:PE_CreateModule Security directory ignored
: "a"b c"d\ e"
The first and last quotes are added by my program.
E.g. tcsh chokes on your argument arangement (but tcsh isn't _the_
reference:-):
: > wine -- cmdline.exe a\"b "c\"d\\" e
: Überflüssiges ".
"Überflüssiges" == Surplus
Francois> With your patch: main a\"b "c\"d\\" e CreateProcess returned:
Francois> 1 error=0 GetCommandLine=[main "a\b "c\d\\"" e] main -> argc=3
Francois> 0 [main] 1 [a\b "c\d\"] 2 [e] main -> __argc=3 0 [main] 1 [a\b
Francois> "c\d\"] 2 [e]
Francois> With your patch we: * change the command line from what was
Francois> specified, just as before * add quotes where there are none *
Francois> misinterpret quotes * don't split arguments properly anymore
Francois> The existing quote handling is perfect!
Run a.exe of the tests appended and see the
difference. Run against the DOS Shell in WinXX(/Vmware) to see what should
happen.
Francois> I tested and
Francois> retested it. The problem you are having is that we cannot
Francois> garantee that the child process will get the exact same
Francois> commandline because of the cmdline -> argv -> cmdline
Francois> conversion. The fix for your problem is to pass the command
Francois> line to the child process via a wineserver call or something.
Francois> Guess which is the first test I am going to write with the
Francois> new testing framework!!! (and I would much prefer to print
Francois> the contents of argv to file than to try and hard-code all the
Francois> checks in the child, plus how am I going to know which was the
Francois> command line that was given to me anyway!
Contend of my tests:
caller.c: Programm that calls cmdline via CreateProcess
cmdline.c: Print the arguments
ucmdline.c: prints the arguments( Unix-File)
--
Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cmdline.tar.gz
Type: application/octet-stream
Size: 12176 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-devel/attachments/20020110/cf514227/cmdline.tar.obj
More information about the wine-devel
mailing list