Skip to content

Commit 9c2f3e9

Browse files
Fix self referencing anchors should cause error (#132)
1 parent 67f0e3d commit 9c2f3e9

2 files changed

Lines changed: 23 additions & 4 deletions

File tree

pkg/model/anchors.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,33 @@ import (
66
"gopkg.in/yaml.v3"
77
)
88

9-
// Assumes there is no cycle ensured via test TestVerifyCycleIsInvalid
10-
func resolveAliases(node *yaml.Node) error {
9+
func resolveAliasesExt(node *yaml.Node, path map[*yaml.Node]bool, skipCheck bool) error {
10+
if !skipCheck && path[node] {
11+
return errors.New("circular alias")
12+
}
1113
switch node.Kind {
1214
case yaml.AliasNode:
1315
aliasTarget := node.Alias
1416
if aliasTarget == nil {
1517
return errors.New("unresolved alias node")
1618
}
19+
path[node] = true
1720
*node = *aliasTarget
18-
if err := resolveAliases(node); err != nil {
21+
if err := resolveAliasesExt(node, path, true); err != nil {
1922
return err
2023
}
24+
delete(path, aliasTarget)
2125

2226
case yaml.DocumentNode, yaml.MappingNode, yaml.SequenceNode:
2327
for _, child := range node.Content {
24-
if err := resolveAliases(child); err != nil {
28+
if err := resolveAliasesExt(child, path, false); err != nil {
2529
return err
2630
}
2731
}
2832
}
2933
return nil
3034
}
35+
36+
func resolveAliases(node *yaml.Node) error {
37+
return resolveAliasesExt(node, map[*yaml.Node]bool{}, false)
38+
}

pkg/model/anchors_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@ b: &b
1919
assert.Error(t, err)
2020
}
2121

22+
func TestVerifyCycleIsInvalid2(t *testing.T) {
23+
var node yaml.Node
24+
err := yaml.Unmarshal([]byte(`
25+
a: &a
26+
ref: *a
27+
`), &node)
28+
assert.NoError(t, err)
29+
err = resolveAliases(&node)
30+
assert.Error(t, err)
31+
}
32+
2233
func TestVerifyNilAliasError(t *testing.T) {
2334
var node yaml.Node
2435
err := yaml.Unmarshal([]byte(`

0 commit comments

Comments
 (0)