Prevent using symlinks to starlark files

Symlinks are frequently confusing / a source of bugs. They also don't
provide much utility over just loading the other file and re-exporting
its symbols, so recommend doing that instead.

Test: Presubmits
Change-Id: Ie3052ebc0add77f1746d6321fbdf7bc15df9819b
This commit is contained in:
Cole Faust
2023-11-09 14:28:34 -08:00
parent 092c6b68b8
commit ccd26808af
3 changed files with 37 additions and 0 deletions

View File

@@ -63,6 +63,14 @@ var sclBuiltins starlark.StringDict = starlark.StringDict{
"json": starlarkjson.Module,
}
func isSymlink(filepath string) (bool, error) {
if info, err := os.Lstat(filepath); err == nil {
return info.Mode() & os.ModeSymlink != 0, nil
} else {
return false, err
}
}
// Takes a module name (the first argument to the load() function) and returns the path
// it's trying to load, stripping out leading //, and handling leading :s.
func cleanModuleName(moduleName string, callerDir string, allowExternalPaths bool) (string, error) {
@@ -158,6 +166,13 @@ func loader(thread *starlark.Thread, module string) (starlark.StringDict, error)
if strings.HasSuffix(modulePath, ".scl") {
mode = ExecutionModeScl
}
if sym, err := isSymlink(modulePath); sym && err == nil {
return nil, fmt.Errorf("symlinks to starlark files are not allowed. Instead, load the target file and re-export its symbols: %s", modulePath)
} else if err != nil {
return nil, err
}
childThread := &starlark.Thread{Name: "exec " + module, Load: thread.Load}
// Cheating for the sake of testing:
// propagate starlarktest's Reporter key, otherwise testing
@@ -368,6 +383,12 @@ func Run(filename string, src interface{}, mode ExecutionMode, allowExternalEntr
return nil, nil, err
}
if sym, err := isSymlink(filename); sym && err == nil {
return nil, nil, fmt.Errorf("symlinks to starlark files are not allowed. Instead, load the target file and re-export its symbols: %s", filename)
} else if err != nil {
return nil, nil, err
}
// Add top-level file to cache for cycle detection purposes
moduleCache[filename] = nil