From 3325b6e29063441ffc767ea650a4058203324097 Mon Sep 17 00:00:00 2001 From: Tibor Vass Date: Tue, 24 Jun 2014 12:50:44 -0400 Subject: [PATCH 1/2] fix bug in FollowSymlinkInScope when link == root Docker-DCO-1.1-Signed-off-by: Tibor Vass (github: tiborvass) Upstream-commit: 385c9b1a08aeaf7e08363007e5bb79bf30225b7e Component: engine --- components/engine/integration-cli/docker_cli_run_test.go | 2 +- components/engine/pkg/symlink/fs.go | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/components/engine/integration-cli/docker_cli_run_test.go b/components/engine/integration-cli/docker_cli_run_test.go index fc71f01820..c4261a081c 100644 --- a/components/engine/integration-cli/docker_cli_run_test.go +++ b/components/engine/integration-cli/docker_cli_run_test.go @@ -945,4 +945,4 @@ func TestModeHostname(t *testing.T) { deleteAllContainers() logDone("run - hostname and several network modes") -} +} \ No newline at end of file diff --git a/components/engine/pkg/symlink/fs.go b/components/engine/pkg/symlink/fs.go index 257491f91b..32ca06b780 100644 --- a/components/engine/pkg/symlink/fs.go +++ b/components/engine/pkg/symlink/fs.go @@ -13,8 +13,6 @@ const maxLoopCounter = 100 // FollowSymlink will follow an existing link and scope it to the root // path provided. func FollowSymlinkInScope(link, root string) (string, error) { - prev := "/" - root, err := filepath.Abs(root) if err != nil { return "", err @@ -25,10 +23,17 @@ func FollowSymlinkInScope(link, root string) (string, error) { return "", err } + if link == root { + return root, nil + } + + if !strings.HasPrefix(filepath.Dir(link), root) { return "", fmt.Errorf("%s is not within %s", link, root) } + prev := "/" + for _, p := range strings.Split(link, "/") { prev = filepath.Join(prev, p) prev = filepath.Clean(prev) From 2ab25c0f866b8619c65f264802ae638207c54c87 Mon Sep 17 00:00:00 2001 From: Tibor Vass Date: Tue, 24 Jun 2014 12:53:53 -0400 Subject: [PATCH 2/2] add integration test for --workdir=/ Docker-DCO-1.1-Signed-off-by: Tibor Vass (github: tiborvass) Upstream-commit: baacc7006b35badb2e9ba807451ab158936d7832 Component: engine --- .../integration-cli/docker_cli_run_test.go | 16 +++++++++++++++- components/engine/pkg/symlink/fs.go | 3 +-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/components/engine/integration-cli/docker_cli_run_test.go b/components/engine/integration-cli/docker_cli_run_test.go index c4261a081c..9e5a90bedf 100644 --- a/components/engine/integration-cli/docker_cli_run_test.go +++ b/components/engine/integration-cli/docker_cli_run_test.go @@ -945,4 +945,18 @@ func TestModeHostname(t *testing.T) { deleteAllContainers() logDone("run - hostname and several network modes") -} \ No newline at end of file +} + +func TestRootWorkdir(t *testing.T) { + s, _, err := cmd(t, "run", "--workdir", "/", "busybox", "pwd") + if err != nil { + t.Fatal(s, err) + } + if s != "/\n" { + t.Fatalf("pwd returned '%s' (expected /\\n)", s) + } + + deleteAllContainers() + + logDone("run - workdir /") +} diff --git a/components/engine/pkg/symlink/fs.go b/components/engine/pkg/symlink/fs.go index 32ca06b780..da9c590675 100644 --- a/components/engine/pkg/symlink/fs.go +++ b/components/engine/pkg/symlink/fs.go @@ -27,13 +27,12 @@ func FollowSymlinkInScope(link, root string) (string, error) { return root, nil } - if !strings.HasPrefix(filepath.Dir(link), root) { return "", fmt.Errorf("%s is not within %s", link, root) } prev := "/" - + for _, p := range strings.Split(link, "/") { prev = filepath.Join(prev, p) prev = filepath.Clean(prev)