From f11ba3135b19006a47cf80861f3c291a3211eb1e Mon Sep 17 00:00:00 2001 From: John Howard Date: Wed, 26 Aug 2015 12:37:01 -0700 Subject: [PATCH] Windows: Fix use of IsAbs check Signed-off-by: John Howard --- daemon/daemon.go | 2 +- pkg/system/filesys.go | 6 ++++++ pkg/system/filesys_windows.go | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/daemon/daemon.go b/daemon/daemon.go index 854e07a7a9..8ece800211 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -1049,7 +1049,7 @@ func (daemon *Daemon) verifyContainerSettings(hostConfig *runconfig.HostConfig, // First perform verification of settings common across all platforms. if config != nil { - if config.WorkingDir != "" && !filepath.IsAbs(config.WorkingDir) { + if config.WorkingDir != "" && !system.IsAbs(config.WorkingDir) { return nil, fmt.Errorf("The working directory '%s' is invalid. It needs to be an absolute path.", config.WorkingDir) } } diff --git a/pkg/system/filesys.go b/pkg/system/filesys.go index 3e26e358ec..c14feb8496 100644 --- a/pkg/system/filesys.go +++ b/pkg/system/filesys.go @@ -4,6 +4,7 @@ package system import ( "os" + "path/filepath" ) // MkdirAll creates a directory named path along with any necessary parents, @@ -11,3 +12,8 @@ import ( func MkdirAll(path string, perm os.FileMode) error { return os.MkdirAll(path, perm) } + +// IsAbs is a platform-specific wrapper for filepath.IsAbs. +func IsAbs(path string) bool { + return filepath.IsAbs(path) +} diff --git a/pkg/system/filesys_windows.go b/pkg/system/filesys_windows.go index 90b500608e..16823d5517 100644 --- a/pkg/system/filesys_windows.go +++ b/pkg/system/filesys_windows.go @@ -4,7 +4,9 @@ package system import ( "os" + "path/filepath" "regexp" + "strings" "syscall" ) @@ -62,3 +64,19 @@ func MkdirAll(path string, perm os.FileMode) error { } return nil } + +// IsAbs is a platform-specific wrapper for filepath.IsAbs. On Windows, +// golang filepath.IsAbs does not consider a path \windows\system32 as absolute +// as it doesn't start with a drive-letter/colon combination. However, in +// docker we need to verify things such as WORKDIR /windows/system32 in +// a Dockerfile (which gets translated to \windows\system32 when being processed +// by the daemon. This SHOULD be treated as absolute from a docker processing +// perspective. +func IsAbs(path string) bool { + if !filepath.IsAbs(path) { + if !strings.HasPrefix(path, string(os.PathSeparator)) { + return false + } + } + return true +}