Repository: gohugoio/hugo (language: go)

Issue:
Missing bounds check in gitmap
https://github.com/bep/gitmap/blob/master/gitmap.go#L128

https://discourse.gohugo.io/t/runtime-error-index-out-of-range/33321


Discussion / hints:

Fix patch:
diff --git a/config/security/securityConfig.go b/config/security/securityConfig.go
index 46a5d0a2308..a3ec5197d1a 100644
--- a/config/security/securityConfig.go
+++ b/config/security/securityConfig.go
@@ -37,6 +37,7 @@ var DefaultConfig = Config{
 		Allow: MustNewWhitelist(
 			"^(dart-)?sass(-embedded)?$", // sass, dart-sass, dart-sass-embedded.
 			"^go$",                       // for Go Modules
+			"^git$",                      // For Git info
 			"^npx$",                      // used by all Node tools (Babel, PostCSS).
 			"^postcss$",
 			"^tailwindcss$",
diff --git a/go.mod b/go.mod
index b9b5860722e..2b7327aa336 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@ require (
 	github.com/aws/aws-sdk-go-v2/service/cloudfront v1.35.4
 	github.com/bep/clocks v0.5.0
 	github.com/bep/debounce v1.2.0
-	github.com/bep/gitmap v1.4.0
+	github.com/bep/gitmap v1.6.0
 	github.com/bep/goat v0.5.0
 	github.com/bep/godartsass v1.2.0
 	github.com/bep/godartsass/v2 v2.0.0
diff --git a/go.sum b/go.sum
index 54a4a376ca9..801a32cd211 100644
--- a/go.sum
+++ b/go.sum
@@ -120,6 +120,10 @@ github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo=
 github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
 github.com/bep/gitmap v1.4.0 h1:GeWbPb2QDTfcZLBQmCB693N3sJmPQfeu81fDrD5r8x8=
 github.com/bep/gitmap v1.4.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw=
+github.com/bep/gitmap v1.5.0 h1:ExDl7HeDaRDG8FXFRTnv20qzbyJlC6ivdOboMYFvrms=
+github.com/bep/gitmap v1.5.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw=
+github.com/bep/gitmap v1.6.0 h1:sDuQMm9HoTL0LtlrfxjbjgAg2wHQd4nkMup2FInYzhA=
+github.com/bep/gitmap v1.6.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw=
 github.com/bep/goat v0.5.0 h1:S8jLXHCVy/EHIoCY+btKkmcxcXFd34a0Q63/0D4TKeA=
 github.com/bep/goat v0.5.0/go.mod h1:Md9x7gRxiWKs85yHlVTvHQw9rg86Bm+Y4SuYE8CTH7c=
 github.com/bep/godartsass v1.2.0 h1:E2VvQrxAHAFwbjyOIExAMmogTItSKodoKuijNrGm5yU=
diff --git a/hugolib/gitinfo.go b/hugolib/gitinfo.go
index f0c5dfa2759..6b5261084f2 100644
--- a/hugolib/gitinfo.go
+++ b/hugolib/gitinfo.go
@@ -14,11 +14,13 @@
 package hugolib
 
 import (
+	"io"
 	"path/filepath"
 	"strings"
 
 	"github.com/bep/gitmap"
-	"github.com/gohugoio/hugo/config"
+	"github.com/gohugoio/hugo/common/hexec"
+	"github.com/gohugoio/hugo/deps"
 	"github.com/gohugoio/hugo/resources/page"
 	"github.com/gohugoio/hugo/source"
 )
@@ -38,10 +40,24 @@ func (g *gitInfo) forPage(p page.Page) source.GitInfo {
 	return source.NewGitInfo(*gi)
 }
 
-func newGitInfo(conf config.AllProvider) (*gitInfo, error) {
-	workingDir := conf.BaseConfig().WorkingDir
+func newGitInfo(d *deps.Deps) (*gitInfo, error) {
+	opts := gitmap.Options{
+		Repository: d.Conf.BaseConfig().WorkingDir,
+		GetGitCommandFunc: func(stdout, stderr io.Writer, args ...string) (gitmap.Runner, error) {
+			var argsv []any
+			for _, arg := range args {
+				argsv = append(argsv, arg)
+			}
+			argsv = append(
+				argsv,
+				hexec.WithStdout(stdout),
+				hexec.WithStderr(stderr),
+			)
+			return d.ExecHelper.New("git", argsv...)
+		},
+	}
 
-	gitRepo, err := gitmap.Map(workingDir, "")
+	gitRepo, err := gitmap.Map(opts)
 	if err != nil {
 		return nil, err
 	}
diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go
index 25a79d65a9e..659a772f222 100644
--- a/hugolib/hugo_sites.go
+++ b/hugolib/hugo_sites.go
@@ -346,7 +346,7 @@ func (h *HugoSites) GetContentPage(filename string) page.Page {
 
 func (h *HugoSites) loadGitInfo() error {
 	if h.Configs.Base.EnableGitInfo {
-		gi, err := newGitInfo(h.Conf)
+		gi, err := newGitInfo(h.Deps)
 		if err != nil {
 			h.Log.Errorln("Failed to read Git log:", err)
 		} else {


Test patch:
diff --git a/config/security/securityConfig_test.go b/config/security/securityConfig_test.go
index 87a24301259..faa05a97f8b 100644
--- a/config/security/securityConfig_test.go
+++ b/config/security/securityConfig_test.go
@@ -135,7 +135,7 @@ func TestToTOML(t *testing.T) {
 	got := DefaultConfig.ToTOML()
 
 	c.Assert(got, qt.Equals,
-		"[security]\n  enableInlineShortcodes = false\n\n  [security.exec]\n    allow = ['^(dart-)?sass(-embedded)?$', '^go$', '^npx$', '^postcss$', '^tailwindcss$']\n    osEnv = ['(?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\\w+|(XDG_CONFIG_)?HOME|USERPROFILE|SSH_AUTH_SOCK|DISPLAY|LANG|SYSTEMDRIVE)$']\n\n  [security.funcs]\n    getenv = ['^HUGO_', '^CI$']\n\n  [security.http]\n    methods = ['(?i)GET|POST']\n    urls = ['.*']",
+		"[security]\n  enableInlineShortcodes = false\n\n  [security.exec]\n    allow = ['^(dart-)?sass(-embedded)?$', '^go$', '^git$', '^npx$', '^postcss$', '^tailwindcss$']\n    osEnv = ['(?i)^((HTTPS?|NO)_PROXY|PATH(EXT)?|APPDATA|TE?MP|TERM|GO\\w+|(XDG_CONFIG_)?HOME|USERPROFILE|SSH_AUTH_SOCK|DISPLAY|LANG|SYSTEMDRIVE)$']\n\n  [security.funcs]\n    getenv = ['^HUGO_', '^CI$']\n\n  [security.http]\n    methods = ['(?i)GET|POST']\n    urls = ['.*']",
 	)
 }