public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
From: "Stephen Provine via cygwin" <cygwin@cygwin.com>
To: "cygwin@cygwin.com" <cygwin@cygwin.com>
Subject: RE: Command line processing in dcrt0.cc does not match Microsoft parsing rules
Date: Thu, 05 Sep 2019 23:45:00 -0000	[thread overview]
Message-ID: <MWHPR21MB0845845AC5AD54E3A2EAA05EB9BB0@MWHPR21MB0845.namprd21.prod.outlook.com> (raw)
In-Reply-To: <MWHPR21MB084583452E7C41D0792C739EB9BB0@MWHPR21MB0845.namprd21.prod.outlook.com>

On 9/5/19 5:46 PM, Eric Blake wrote:
> If you start a cygwin process from Windows, then cygwin1.dll is given
> only a single string, which it must parse into argv according to windows
> conventions (if it does not produce the same argv[] as a windows process
> using CommandLineToArgvW, then that's a bug in cygwin1.dll).  But on top
> of that, if you are using cmd.exe to generate your command line, then
> you must use proper escaping, otherwise, cmd.exe can produce a command
> line that has unexpected quoting in the string handed to
> CommandLineToArgvW, and the Windows parsing when there are unbalanced
> quotes can be screwy

Great explanation, it's very helpful.

I've been using cmd.exe to generate the command line for my tests, but the
original problem was when my compiled Go binary directly executes another
Windows process using the Win32 APIs like CreateProcess directly. Here's a
simple Go program that reproduces the issue:

package main

import (
	"log"
	"os"
	"os/exec"
)

func main() {
	cmd := exec.Command("C:\\cygwin64\\bin\\bash.exe", "test.sh", "foo", "bar\"baz", "bat")
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	if err := cmd.Run(); err != nil {
		log.Fatal(err)
	}
}

The output of this process is:

foo
bar\baz bat


To prove it is not going through cmd.exe, I debugged the Go program
to the point that it calls the Win32 CreateProcess function, and the
first two arguments are:

lpApplicationName: "C:\\cygwin64\\bin\\bash.exe"
lpCommandLine: "C:\\cygwin64\\bin\\bash.exe test.sh foo bar\\\"baz bat"

So unless I'm missing something, bash.exe is not interpreting the command line
following the rules pointed to by the documentation for CommandLineToArgvW.

Thanks,
Stephen

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple

  parent reply	other threads:[~2019-09-05 23:45 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-30 19:31 Stephen Provine via cygwin
2019-08-30 20:53 ` Brian Inglis
2019-08-30 21:21 ` Stephen Provine via cygwin
2019-08-31  4:18   ` Brian Inglis
2019-09-03 16:38   ` Stephen Provine via cygwin
2019-09-04 16:20     ` Brian Inglis
2019-09-04 23:46     ` Stephen Provine via cygwin
2019-09-05  5:29       ` Brian Inglis
2019-09-05 18:31       ` Stephen Provine via cygwin
2019-09-05 19:05         ` Eric Blake
2019-09-05 22:01         ` Stephen Provine via cygwin
2019-09-05 22:46           ` Eric Blake
2019-09-05 23:45           ` Stephen Provine via cygwin [this message]
2019-09-06  0:46             ` Steven Penny
2019-09-06  1:26             ` Eric Blake
2019-09-06  6:20             ` Stephen Provine via cygwin
2019-09-07 21:50           ` Brian Inglis
2019-09-07 12:05         ` Andrey Repin
2019-09-07 12:20           ` Andrey Repin
2019-09-09 16:47           ` Stephen Provine via cygwin
2019-09-09 16:57             ` Stephen Provine via cygwin
2019-09-09 17:11               ` Eric Blake
2019-09-09 19:05                 ` Duncan Roe
2019-09-09 19:44                   ` Andrey Repin
2019-09-10 12:43                   ` Brian Inglis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=MWHPR21MB0845845AC5AD54E3A2EAA05EB9BB0@MWHPR21MB0845.namprd21.prod.outlook.com \
    --to=cygwin@cygwin.com \
    --cc=stephpr@microsoft.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).