Fix isSubPath to allow filenames starting with ".."
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LocalStorage implements StorageBackend using the local filesystem.
|
// LocalStorage implements StorageBackend using the local filesystem.
|
||||||
@@ -87,5 +88,10 @@ func isSubPath(base, target string) bool {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return rel != ".." && !filepath.IsAbs(rel) && rel[:2] != ".."
|
if filepath.IsAbs(rel) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// Reject paths that escape the base directory.
|
||||||
|
// filepath.Rel returns ".." or starts with "../" for paths outside base.
|
||||||
|
return rel != ".." && !strings.HasPrefix(rel, ".."+string(filepath.Separator))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,3 +128,21 @@ func TestOpenMissingFile(t *testing.T) {
|
|||||||
t.Errorf("expected 'not found on disk' error, got: %v", err)
|
t.Errorf("expected 'not found on disk' error, got: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIsSubPath_SameDirectory(t *testing.T) {
|
||||||
|
if !isSubPath("/base", "/base") {
|
||||||
|
t.Error("isSubPath should return true when base == target")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIsSubPath_ShortChildName(t *testing.T) {
|
||||||
|
if !isSubPath("/base", "/base/a") {
|
||||||
|
t.Error("isSubPath should return true for single-char child path")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestIsSubPath_DotDotPrefixFilename(t *testing.T) {
|
||||||
|
if !isSubPath("/base", "/base/..foo") {
|
||||||
|
t.Error("isSubPath should return true for filename starting with ..")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user