From 24d0c56350e10b09d1bedc40b678ed4b2dc279cb Mon Sep 17 00:00:00 2001 From: Jingwen Chen Date: Tue, 7 Feb 2023 09:29:36 +0000 Subject: [PATCH] Remove unnecessary pass in validatePath. Perform a single pass over pathComponents in both validatePath and validateSafePath instead. Test: presubmits Change-Id: I1499183e345ca180900c54a18f9dc8bd534f2588 --- android/paths.go | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/android/paths.go b/android/paths.go index 0fc39df6c..2c5010473 100644 --- a/android/paths.go +++ b/android/paths.go @@ -1868,10 +1868,14 @@ func (p InstallPaths) Strings() []string { return ret } -// validateSafePath validates a path that we trust (may contain ninja variables). -// Ensures that each path component does not attempt to leave its component. -func validateSafePath(pathComponents ...string) (string, error) { +// validatePathInternal ensures that a path does not leave its component, and +// optionally doesn't contain Ninja variables. +func validatePathInternal(allowNinjaVariables bool, pathComponents ...string) (string, error) { for _, path := range pathComponents { + if !allowNinjaVariables && strings.Contains(path, "$") { + return "", fmt.Errorf("Path contains invalid character($): %s", path) + } + path := filepath.Clean(path) if path == ".." || strings.HasPrefix(path, "../") || strings.HasPrefix(path, "/") { return "", fmt.Errorf("Path is outside directory: %s", path) @@ -1883,16 +1887,18 @@ func validateSafePath(pathComponents ...string) (string, error) { return filepath.Join(pathComponents...), nil } +// validateSafePath validates a path that we trust (may contain ninja +// variables). Ensures that each path component does not attempt to leave its +// component. Returns a joined version of each path component. +func validateSafePath(pathComponents ...string) (string, error) { + return validatePathInternal(true, pathComponents...) +} + // validatePath validates that a path does not include ninja variables, and that // each path component does not attempt to leave its component. Returns a joined // version of each path component. func validatePath(pathComponents ...string) (string, error) { - for _, path := range pathComponents { - if strings.Contains(path, "$") { - return "", fmt.Errorf("Path contains invalid character($): %s", path) - } - } - return validateSafePath(pathComponents...) + return validatePathInternal(false, pathComponents...) } func PathForPhony(ctx PathContext, phony string) WritablePath {