Browse Source

Windows: Fix use of IsAbs check

Signed-off-by: John Howard <jhoward@microsoft.com>
John Howard 10 years ago
parent
commit
f11ba3135b
3 changed files with 25 additions and 1 deletions
  1. 1 1
      daemon/daemon.go
  2. 6 0
      pkg/system/filesys.go
  3. 18 0
      pkg/system/filesys_windows.go

+ 1 - 1
daemon/daemon.go

@@ -1049,7 +1049,7 @@ func (daemon *Daemon) verifyContainerSettings(hostConfig *runconfig.HostConfig,
 
 
 	// First perform verification of settings common across all platforms.
 	// First perform verification of settings common across all platforms.
 	if config != nil {
 	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)
 			return nil, fmt.Errorf("The working directory '%s' is invalid. It needs to be an absolute path.", config.WorkingDir)
 		}
 		}
 	}
 	}

+ 6 - 0
pkg/system/filesys.go

@@ -4,6 +4,7 @@ package system
 
 
 import (
 import (
 	"os"
 	"os"
+	"path/filepath"
 )
 )
 
 
 // MkdirAll creates a directory named path along with any necessary parents,
 // MkdirAll creates a directory named path along with any necessary parents,
@@ -11,3 +12,8 @@ import (
 func MkdirAll(path string, perm os.FileMode) error {
 func MkdirAll(path string, perm os.FileMode) error {
 	return os.MkdirAll(path, perm)
 	return os.MkdirAll(path, perm)
 }
 }
+
+// IsAbs is a platform-specific wrapper for filepath.IsAbs.
+func IsAbs(path string) bool {
+	return filepath.IsAbs(path)
+}

+ 18 - 0
pkg/system/filesys_windows.go

@@ -4,7 +4,9 @@ package system
 
 
 import (
 import (
 	"os"
 	"os"
+	"path/filepath"
 	"regexp"
 	"regexp"
+	"strings"
 	"syscall"
 	"syscall"
 )
 )
 
 
@@ -62,3 +64,19 @@ func MkdirAll(path string, perm os.FileMode) error {
 	}
 	}
 	return nil
 	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
+}