aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/opencontainers/runtime-tools/filepath/clean.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/opencontainers/runtime-tools/filepath/clean.go')
-rw-r--r--vendor/github.com/opencontainers/runtime-tools/filepath/clean.go26
1 files changed, 22 insertions, 4 deletions
diff --git a/vendor/github.com/opencontainers/runtime-tools/filepath/clean.go b/vendor/github.com/opencontainers/runtime-tools/filepath/clean.go
index b70c575f2..d5dd65ae1 100644
--- a/vendor/github.com/opencontainers/runtime-tools/filepath/clean.go
+++ b/vendor/github.com/opencontainers/runtime-tools/filepath/clean.go
@@ -30,6 +30,9 @@ func Clean(os, path string) string {
// Eliminate each inner .. path name element (the parent directory)
// along with the non-.. element that precedes it.
for i := 1; i < len(elements); i++ {
+ if i == 1 && abs && sep == '\\' {
+ continue
+ }
if i > 0 && elements[i] == ".." {
elements = append(elements[:i-1], elements[i+1:]...)
i -= 2
@@ -39,16 +42,31 @@ func Clean(os, path string) string {
// Eliminate .. elements that begin a rooted path:
// that is, replace "/.." by "/" at the beginning of a path,
// assuming Separator is '/'.
- if abs && len(elements) > 0 {
- for elements[0] == ".." {
- elements = elements[1:]
+ offset := 0
+ if sep == '\\' {
+ offset = 1
+ }
+ if abs {
+ for len(elements) > offset && elements[offset] == ".." {
+ elements = append(elements[:offset], elements[offset+1:]...)
}
}
cleaned := strings.Join(elements, string(sep))
if abs {
- cleaned = fmt.Sprintf("%c%s", sep, cleaned)
+ if sep == '/' {
+ cleaned = fmt.Sprintf("%c%s", sep, cleaned)
+ } else if len(elements) == 1 {
+ cleaned = fmt.Sprintf("%s%c", cleaned, sep)
+ }
}
+
+ // If the result of this process is an empty string, Clean returns
+ // the string ".".
+ if len(cleaned) == 0 {
+ cleaned = "."
+ }
+
if cleaned == path {
return path
}