From 2a2bb0430ef2851c6d7b5b145ba2bdf2f22568f3 Mon Sep 17 00:00:00 2001 From: bckr Date: Tue, 3 Mar 2020 14:00:19 +0100 Subject: [PATCH 1/3] Avoid resolving dotted segments when host path for volume is named pipe --- drivers/docker/driver.go | 2 +- drivers/docker/utils.go | 11 +++++++++++ drivers/docker/utils_unix_test.go | 3 ++- drivers/docker/utils_windows_test.go | 9 +++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go index dfdaeb5a9..bcee20b9c 100644 --- a/drivers/docker/driver.go +++ b/drivers/docker/driver.go @@ -636,7 +636,7 @@ func (d *Driver) containerBinds(task *drivers.TaskConfig, driverConfig *TaskConf // Otherwise, we assume we receive a relative path binding in the format // relative/to/task:/also/in/container if taskLocalBindVolume { - src = expandPath(task.TaskDir().Dir, src) + src = expandPath(task.TaskDir().Dir, src, runtime.GOOS) } else { // Resolve dotted path segments src = filepath.Clean(src) diff --git a/drivers/docker/utils.go b/drivers/docker/utils.go index 81e9e06cb..ee31b9991 100644 --- a/drivers/docker/utils.go +++ b/drivers/docker/utils.go @@ -6,6 +6,7 @@ import ( "os" "os/exec" "path/filepath" + "regexp" "strings" "github.com/docker/cli/cli/config/configfile" @@ -206,6 +207,16 @@ func validateCgroupPermission(s string) bool { // expandPath returns the absolute path of dir, relative to base if dir is relative path. // base is expected to be an absolute path func expandPath(base, dir string) string { + if os == "windows" { + pipeExp := regexp.MustCompile(`^` + rxPipe + `$`) + match := pipeExp.FindStringSubmatch(strings.ToLower(dir)) + + if len(match) == 1 { + // avoid resolving dot-segment in named pipe + return dir + } + } + if filepath.IsAbs(dir) { return filepath.Clean(dir) } diff --git a/drivers/docker/utils_unix_test.go b/drivers/docker/utils_unix_test.go index 2260ef89e..39e4e814d 100644 --- a/drivers/docker/utils_unix_test.go +++ b/drivers/docker/utils_unix_test.go @@ -4,6 +4,7 @@ package docker import ( "path/filepath" + "runtime" "testing" "github.com/stretchr/testify/require" @@ -57,7 +58,7 @@ func TestExpandPath(t *testing.T) { for _, c := range cases { t.Run(c.expected, func(t *testing.T) { - require.Equal(t, c.expected, filepath.ToSlash(expandPath(c.base, c.target))) + require.Equal(t, c.expected, filepath.ToSlash(expandPath(c.base, c.target, runtime.GOOS))) }) } } diff --git a/drivers/docker/utils_windows_test.go b/drivers/docker/utils_windows_test.go index ebc0350be..2891fe8d3 100644 --- a/drivers/docker/utils_windows_test.go +++ b/drivers/docker/utils_windows_test.go @@ -24,6 +24,8 @@ func TestExpandPath(t *testing.T) { {"/tmp/alloc/task", "c:/home/user", "c:/home/user"}, {"/tmp/alloc/task", "c:/home/user/..", "c:/home"}, + + {"/tmp/alloc/task", `//./pipe/named_pipe`, `//./pipe/named_pipe`}, } for _, c := range cases { @@ -55,6 +57,13 @@ func TestParseVolumeSpec_Windows(t *testing.T) { `e:\containerpath`, "", }, + { + "named pipe", + `//./pipe/named_pipe://./pipe/named_pipe`, + `\\.\pipe\named_pipe`, + `//./pipe/named_pipe`, + "", + }, } for _, c := range validCases { From 1549ed827ab5657ef52542933dc655dcb9ea9b6c Mon Sep 17 00:00:00 2001 From: bckr Date: Tue, 3 Mar 2020 15:38:38 +0100 Subject: [PATCH 2/3] Fix too many arguments --- drivers/docker/driver.go | 2 +- drivers/docker/utils.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go index bcee20b9c..dfdaeb5a9 100644 --- a/drivers/docker/driver.go +++ b/drivers/docker/driver.go @@ -636,7 +636,7 @@ func (d *Driver) containerBinds(task *drivers.TaskConfig, driverConfig *TaskConf // Otherwise, we assume we receive a relative path binding in the format // relative/to/task:/also/in/container if taskLocalBindVolume { - src = expandPath(task.TaskDir().Dir, src, runtime.GOOS) + src = expandPath(task.TaskDir().Dir, src) } else { // Resolve dotted path segments src = filepath.Clean(src) diff --git a/drivers/docker/utils.go b/drivers/docker/utils.go index ee31b9991..5692a54b6 100644 --- a/drivers/docker/utils.go +++ b/drivers/docker/utils.go @@ -7,6 +7,7 @@ import ( "os/exec" "path/filepath" "regexp" + "runtime" "strings" "github.com/docker/cli/cli/config/configfile" @@ -207,7 +208,7 @@ func validateCgroupPermission(s string) bool { // expandPath returns the absolute path of dir, relative to base if dir is relative path. // base is expected to be an absolute path func expandPath(base, dir string) string { - if os == "windows" { + if runtime.GOOS == "windows" { pipeExp := regexp.MustCompile(`^` + rxPipe + `$`) match := pipeExp.FindStringSubmatch(strings.ToLower(dir)) From d9cf32657e2a9e35de208d9b2f10ce2e7b7d969e Mon Sep 17 00:00:00 2001 From: bckr Date: Tue, 3 Mar 2020 15:39:43 +0100 Subject: [PATCH 3/3] Remove argument passing runtime GOOS --- drivers/docker/utils_unix_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/docker/utils_unix_test.go b/drivers/docker/utils_unix_test.go index 39e4e814d..2260ef89e 100644 --- a/drivers/docker/utils_unix_test.go +++ b/drivers/docker/utils_unix_test.go @@ -4,7 +4,6 @@ package docker import ( "path/filepath" - "runtime" "testing" "github.com/stretchr/testify/require" @@ -58,7 +57,7 @@ func TestExpandPath(t *testing.T) { for _, c := range cases { t.Run(c.expected, func(t *testing.T) { - require.Equal(t, c.expected, filepath.ToSlash(expandPath(c.base, c.target, runtime.GOOS))) + require.Equal(t, c.expected, filepath.ToSlash(expandPath(c.base, c.target))) }) } }