From d1d8d6e19cdcde204ed7fc7a0ad51670df07bf75 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Fri, 23 Aug 2024 16:42:04 +0300 Subject: [PATCH] build: avoid possible panic when reading git info Not all the error cases from getGitAttributes returned appendNoneFunc. When nil was returned it caused a panic. Signed-off-by: Tonis Tiigi --- build/git.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/build/git.go b/build/git.go index 05eb474d92a..0b7aba10407 100644 --- a/build/git.go +++ b/build/git.go @@ -21,9 +21,15 @@ type gitAttrsAppendFunc func(so *client.SolveOpt) func gitAppendNoneFunc(_ *client.SolveOpt) {} -func getGitAttributes(ctx context.Context, contextPath, dockerfilePath string) (gitAttrsAppendFunc, error) { +func getGitAttributes(ctx context.Context, contextPath, dockerfilePath string) (f gitAttrsAppendFunc, err error) { + defer func() { + if f == nil { + f = gitAppendNoneFunc + } + }() + if contextPath == "" { - return gitAppendNoneFunc, nil + return nil, nil } setGitLabels := false @@ -42,7 +48,7 @@ func getGitAttributes(ctx context.Context, contextPath, dockerfilePath string) ( } if !setGitLabels && !setGitInfo { - return gitAppendNoneFunc, nil + return nil, nil } // figure out in which directory the git command needs to run in @@ -59,14 +65,14 @@ func getGitAttributes(ctx context.Context, contextPath, dockerfilePath string) ( if st, err1 := os.Stat(path.Join(wd, ".git")); err1 == nil && st.IsDir() { return nil, errors.Wrap(err, "git was not found in the system") } - return gitAppendNoneFunc, nil + return nil, nil } if !gitc.IsInsideWorkTree() { if st, err := os.Stat(path.Join(wd, ".git")); err == nil && st.IsDir() { return nil, errors.New("failed to read current commit information with git rev-parse --is-inside-work-tree") } - return gitAppendNoneFunc, nil + return nil, nil } root, err := gitc.RootDir()