Prevent invalid paths being added to mock file system

Bug: 182885307
Test: m nothing
Change-Id: Ie9f60fd02e2a2bc44811dbcadf0eada4e52c9749
This commit is contained in:
Paul Duffin
2021-03-16 14:08:00 +00:00
parent 9f4b3bbb7c
commit 80f4cea1ad
2 changed files with 67 additions and 1 deletions

View File

@@ -16,6 +16,7 @@ package android
import (
"fmt"
"strings"
"testing"
)
@@ -241,6 +242,7 @@ type MockFS map[string][]byte
// Fails if the supplied map files with the same paths are present in both of them.
func (fs MockFS) Merge(extra map[string][]byte) {
for p, c := range extra {
validateFixtureMockFSPath(p)
if _, ok := fs[p]; ok {
panic(fmt.Errorf("attempted to add file %s to the mock filesystem but it already exists", p))
}
@@ -248,6 +250,27 @@ func (fs MockFS) Merge(extra map[string][]byte) {
}
}
// Ensure that tests cannot add paths into the mock file system which would not be allowed in the
// runtime, e.g. absolute paths, paths relative to the 'out/' directory.
func validateFixtureMockFSPath(path string) {
// This uses validateSafePath rather than validatePath because the latter prevents adding files
// that include a $ but there are tests that allow files with a $ to be used, albeit only by
// globbing.
validatedPath, err := validateSafePath(path)
if err != nil {
panic(err)
}
// Make sure that the path is canonical.
if validatedPath != path {
panic(fmt.Errorf("path %q is not a canonical path, use %q instead", path, validatedPath))
}
if path == "out" || strings.HasPrefix(path, "out/") {
panic(fmt.Errorf("cannot add output path %q to the mock file system", path))
}
}
func (fs MockFS) AddToFixture() FixturePreparer {
return FixtureMergeMockFs(fs)
}
@@ -281,6 +304,11 @@ func FixtureRegisterWithContext(registeringFunc func(ctx RegistrationContext)) F
func FixtureModifyMockFS(mutator func(fs MockFS)) FixturePreparer {
return newSimpleFixturePreparer(func(f *fixture) {
mutator(f.mockFS)
// Make sure that invalid paths were not added to the mock filesystem.
for p, _ := range f.mockFS {
validateFixtureMockFSPath(p)
}
})
}
@@ -298,6 +326,7 @@ func FixtureMergeMockFs(mockFS MockFS) FixturePreparer {
// Fail if the filesystem already contains a file with that path, use FixtureOverrideFile instead.
func FixtureAddFile(path string, contents []byte) FixturePreparer {
return FixtureModifyMockFS(func(fs MockFS) {
validateFixtureMockFSPath(path)
if _, ok := fs[path]; ok {
panic(fmt.Errorf("attempted to add file %s to the mock filesystem but it already exists, use FixtureOverride*File instead", path))
}