Fix isSubPath to allow filenames starting with ".."

This commit is contained in:
2026-06-24 14:28:32 +08:00
parent e2af482cc9
commit a289130dcd
2 changed files with 25 additions and 1 deletions
+7 -1
View File
@@ -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))
} }
+18
View File
@@ -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 ..")
}
}