From 85c17277489f335c1fed8259ce6928b267498e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Mon, 17 Feb 2025 16:06:54 +0100 Subject: [PATCH] markup/goldmark: Fix panic on stray attribute nodes --- .../extensions/attributes/attributes.go | 11 +++++-- .../attributes/attributes_integration_test.go | 33 +++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/markup/goldmark/internal/extensions/attributes/attributes.go b/markup/goldmark/internal/extensions/attributes/attributes.go index f5f6f97b4..50ccb2ed4 100644 --- a/markup/goldmark/internal/extensions/attributes/attributes.go +++ b/markup/goldmark/internal/extensions/attributes/attributes.go @@ -117,8 +117,9 @@ func (a *transformer) isFragmentNode(n ast.Node) bool { func (a *transformer) Transform(node *ast.Document, reader text.Reader, pc parser.Context) { var attributes []ast.Node + var solitaryAttributeNodes []ast.Node if a.cfg.Attribute.Block { - attributes = make([]ast.Node, 0, 500) + attributes = make([]ast.Node, 0, 100) } ast.Walk(node, func(node ast.Node, entering bool) (ast.WalkStatus, error) { if !entering { @@ -141,8 +142,7 @@ func (a *transformer) Transform(node *ast.Document, reader text.Reader, pc parse attributes = append(attributes, node) return ast.WalkSkipChildren, nil } else { - // remove attributes node - node.Parent().RemoveChild(node.Parent(), node) + solitaryAttributeNodes = append(solitaryAttributeNodes, node) } } @@ -161,6 +161,11 @@ func (a *transformer) Transform(node *ast.Document, reader text.Reader, pc parse // remove attributes node attr.Parent().RemoveChild(attr.Parent(), attr) } + + // Remove any solitary attribute nodes. + for _, n := range solitaryAttributeNodes { + n.Parent().RemoveChild(n.Parent(), n) + } } func (a *transformer) generateAutoID(n ast.Node, reader text.Reader, pc parser.Context) { diff --git a/markup/goldmark/internal/extensions/attributes/attributes_integration_test.go b/markup/goldmark/internal/extensions/attributes/attributes_integration_test.go index 90cf3d084..e56c52550 100644 --- a/markup/goldmark/internal/extensions/attributes/attributes_integration_test.go +++ b/markup/goldmark/internal/extensions/attributes/attributes_integration_test.go @@ -75,3 +75,36 @@ Second line "|Identifiers: [a-a-a-a-a-a-c-c-c-c-c-c-c-c-d base-name base-name-1 example-hyperlink-in-a-header foo-something-bar foobar my-title my-title-1 second-line term title-with-id title-with-id]|", ) } + +func TestSolitaryAttributesCrash(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +[markup.goldmark.parser.attribute] +block = true +-- layouts/_default/single.html -- +Content: {{ .Content }} +-- content/p1.md -- +--- +title: "Title" +--- + +1. a + +{.x} + +1. b + +{.x} + + + +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/p1/index.html", + `
  • a
  • `, + ) +}