markup/goldmark: Fix panic on stray attribute nodes

This commit is contained in:
Bjørn Erik Pedersen 2025-02-17 16:06:54 +01:00
parent 641403f7de
commit 85c1727748
No known key found for this signature in database
2 changed files with 41 additions and 3 deletions

View file

@ -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) {

View file

@ -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",
` <li>a</li>`,
)
}