Skip to content

Commit

Permalink
Windows: CMD not honouring arg escaping
Browse files Browse the repository at this point in the history
Signed-off-by: John Howard <[email protected]>
  • Loading branch information
John Howard committed Jun 15, 2016
1 parent eab3a1f commit d05d021
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 0 deletions.
2 changes: 2 additions & 0 deletions builder/dockerfile/dispatchers.go
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,8 @@ func cmd(b *Builder, args []string, attributes map[string]bool, original string)
}

b.runConfig.Cmd = strslice.StrSlice(cmdSlice)
// set config as already being escaped, this prevents double escaping on windows
b.runConfig.ArgsEscaped = true

if err := b.commit("", b.runConfig.Cmd, fmt.Sprintf("CMD %q", cmdSlice)); err != nil {
return err
Expand Down
1 change: 1 addition & 0 deletions daemon/commit.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ func merge(userConf, imageConf *containertypes.Config) error {
if len(userConf.Entrypoint) == 0 {
if len(userConf.Cmd) == 0 {
userConf.Cmd = imageConf.Cmd
userConf.ArgsEscaped = imageConf.ArgsEscaped
}

if userConf.Entrypoint == nil {
Expand Down
25 changes: 25 additions & 0 deletions integration-cli/docker_cli_build_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6952,3 +6952,28 @@ func (s *DockerSuite) TestBuildShellWindowsPowershell(c *check.C) {
c.Fatalf("Line with 'John' not found in output %q", out)
}
}

// #22868. Make sure shell-form CMD is marked as escaped in the config of the image
func (s *DockerSuite) TestBuildCmdShellArgsEscaped(c *check.C) {
testRequires(c, DaemonIsWindows)
name := "testbuildcmdshellescaped"

_, err := buildImage(name, `
FROM `+minimalBaseImage()+`
CMD "tasklist"
`, true)
if err != nil {
c.Fatal(err)
}
res := inspectFieldJSON(c, name, "Config.ArgsEscaped")
if res != "true" {
c.Fatalf("CMD did not update Config.ArgsEscaped on image: %v", res)
}
dockerCmd(c, "run", "--name", "inspectme", name)
dockerCmd(c, "wait", "inspectme")
res = inspectFieldJSON(c, name, "Config.Cmd")

if res != `["cmd","/S","/C","\"tasklist\""]` {
c.Fatalf("CMD was not escaped Config.Cmd: got %v", res)
}
}

0 comments on commit d05d021

Please sign in to comment.