Fun with argv

Paul Millar paulm at astro.gla.ac.uk
Sat Feb 16 11:32:40 CST 2002


Hi everyone,

I've been looking at the installer for Office97. You call setup.exe 
which runs acmsetup.exe with a bunch of options, specifically:
'E:\~MSSETUP.T\~msstfof.t\acmsetup /T Off97Pro.stf /S "D:\office\" '

Here, I've used single quotes to delimit the string. I'll carry on this
convention because it will get confusing otherwise.

The problem is build_argv() assumes the command line is suitably escaped
(as from a bash command line, for example), and so mangles the above line
to the following values:
 'E:\~MSSETUP.T\~msstfof.t\acmsetup'
 '/T'
 'Off97Pro.stf'
 '/S'
 'D:\office" '

But, the fun continues as you can pass arguments to setup.exe, which 
augment the arguments passed to acmsetup.exe, so running:

  wine setup.exe 'a a' '"b "B'

results in argv[] for setup.exe being:
  'setup.exe'
  'a a'
  '"b "B'

setup.exe then calls GetCommandLineA, which returns:
  'setup.exe "a a" "\"b \"B"'

and then it tries to exec
  'E:\~MSSETUP.T\~msstfof.t\acmsetup /T Off97Pro.stf /S "D:\office\" "a a" 
"\"b \"B"'
A command line with both unix-style escaped quotes and normal text. The 
build_argv result is:
  'E:\~MSSETUP.T\~msstfof.t\acmsetup'
 [...]
  '/S'
  'D:\office" a'
  'a "b'
  '"B'

and subsequent call to GetCommandLineA returns:
  'E:\~MSSETUP.T\~msstfof.t\acmsetup /T Off97Pro.stf /S "D:\office\" a" "a 
\"b" \"B'

What a mess!



More information about the wine-devel mailing list