Repository: gohugoio/hugo (language: go)

Issue:
Check blockquotes nilpointer
https://discourse.gohugo.io/t/panic-runtime-error-invalid-memory-address-or-nil-pointer-dereference-in-hugo-0-132-0/51125


Discussion / hints:

Fix patch:
diff --git a/markup/goldmark/blockquotes/blockquotes.go b/markup/goldmark/blockquotes/blockquotes.go
index f4c908e0ba9..2f5629d87db 100644
--- a/markup/goldmark/blockquotes/blockquotes.go
+++ b/markup/goldmark/blockquotes/blockquotes.go
@@ -75,20 +75,6 @@ func (r *htmlRenderer) renderBlockquote(w util.BufWriter, src []byte, node ast.N
 	text := ctx.Buffer.Bytes()[pos:]
 	ctx.Buffer.Truncate(pos)
 
-	// Extract a source sample to use for position information.
-	nn := n.FirstChild()
-	var start, stop int
-	for i := 0; i < nn.Lines().Len() && i < 2; i++ {
-		line := nn.Lines().At(i)
-		if i == 0 {
-			start = line.Start
-		}
-		stop = line.Stop
-	}
-
-	// We do not mutate the source, so this is safe.
-	sourceRef := src[start:stop]
-
 	ordinal := ctx.GetAndIncrementOrdinal(ast.KindBlockquote)
 
 	texts := string(text)
@@ -110,6 +96,22 @@ func (r *htmlRenderer) renderBlockquote(w util.BufWriter, src []byte, node ast.N
 		texts = "<p>" + texts[strings.Index(texts, "\n")+1:]
 	}
 
+	var sourceRef []byte
+
+	// Extract a source sample to use for position information.
+	if nn := n.FirstChild(); nn != nil {
+		var start, stop int
+		for i := 0; i < nn.Lines().Len() && i < 2; i++ {
+			line := nn.Lines().At(i)
+			if i == 0 {
+				start = line.Start
+			}
+			stop = line.Stop
+		}
+		// We do not mutate the source, so this is safe.
+		sourceRef = src[start:stop]
+	}
+
 	bqctx := &blockquoteContext{
 		page:             ctx.DocumentContext().Document,
 		pageInner:        r.getPageInner(ctx),


Test patch:
diff --git a/markup/goldmark/blockquotes/blockquotes_integration_test.go b/markup/goldmark/blockquotes/blockquotes_integration_test.go
index 45c7caa0fc2..45c031098fc 100644
--- a/markup/goldmark/blockquotes/blockquotes_integration_test.go
+++ b/markup/goldmark/blockquotes/blockquotes_integration_test.go
@@ -81,3 +81,23 @@ title: "p1"
 		"Blockquote Alert Page: |<p>This is a tip with attributes.</p>\n|p1|p1|",
 	)
 }
+
+func TestBlockquoteEmptyIssue12756(t *testing.T) {
+	t.Parallel()
+
+	files := `
+-- hugo.toml --
+-- content/p1.md --
+---
+title: "p1"
+---
+
+>
+-- layouts/_default/single.html --
+Content: {{ .Content }}
+
+`
+
+	b := hugolib.Test(t, files)
+	b.AssertFileContent("public/p1/index.html", "Content: <blockquote>\n</blockquote>\n")
+}