From b51c366bfc963687b8cc14df614a2fc10bad6306 Mon Sep 17 00:00:00 2001 From: lalyos Date: Fri, 16 May 2014 00:25:38 +0200 Subject: [PATCH] Defend against infinite loop when following symlinks ideally it should never reach it, but there was already multiple issues with infinite loop at following symlinks. this fixes hanging unit tests Docker-DCO-1.1-Signed-off-by: Lajos Papp (github: lalyos) --- pkg/symlink/fs.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/symlink/fs.go b/pkg/symlink/fs.go index e91d33db4b..4dcfdf360f 100644 --- a/pkg/symlink/fs.go +++ b/pkg/symlink/fs.go @@ -3,10 +3,13 @@ package symlink import ( "fmt" "os" + "path" "path/filepath" "strings" ) +const maxLoopCounter = 100 + // FollowSymlink will follow an existing link and scope it to the root // path provided. func FollowSymlinkInScope(link, root string) (string, error) { @@ -30,7 +33,14 @@ func FollowSymlinkInScope(link, root string) (string, error) { prev = filepath.Join(prev, p) prev = filepath.Clean(prev) + loopCounter := 0 for { + loopCounter++ + + if loopCounter >= maxLoopCounter { + return "", fmt.Errorf("loopCounter reached MAX: %v", loopCounter) + } + if !strings.HasPrefix(prev, root) { // Don't resolve symlinks outside of root. For example, // we don't have to check /home in the below.