Skip to content

Commit b0d7368

Browse files
kvapsclaude
andcommitted
fix: preserve parser error for malformed trailing YAML documents
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Andrei Kvapil <kvapss@gmail.com>
1 parent c80e6f0 commit b0d7368

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

validate.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"bytes"
55
"errors"
6+
"fmt"
67
"io"
78

89
"github.com/siderolabs/talos/pkg/machinery/resources/network"
@@ -28,8 +29,11 @@ func validateConfig(data []byte) error {
2829
return err
2930
}
3031

31-
if err := dec.Decode(new(any)); !errors.Is(err, io.EOF) {
32+
switch err := dec.Decode(new(any)); {
33+
case err == nil:
3234
return errors.New("unexpected extra YAML document")
35+
case !errors.Is(err, io.EOF):
36+
return fmt.Errorf("unexpected extra YAML document: %w", err)
3337
}
3438

3539
return nil

validate_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ func TestValidateConfigInvalid(t *testing.T) {
8383
{"bad enum value", "addresses:\n - address: 1.2.3.4/32\n family: inet5\n"},
8484
{"bad IP", "externalIPs:\n - not-an-ip\n"},
8585
{"extra document", validNetworkConfig + "---\nexternalIPs: []\n"},
86+
{"malformed extra document", validNetworkConfig + "---\nkey: [\ninvalid"},
8687
} {
8788
t.Run(tt.name, func(t *testing.T) {
8889
if err := validateConfig([]byte(tt.config)); err == nil {
@@ -102,3 +103,15 @@ func TestValidateConfigUnknownFieldError(t *testing.T) {
102103
t.Fatalf("error should mention the unknown field, got: %v", err)
103104
}
104105
}
106+
107+
func TestValidateConfigMalformedExtraDocumentError(t *testing.T) {
108+
err := validateConfig([]byte(validNetworkConfig + "---\nkey: [\ninvalid"))
109+
if err == nil {
110+
t.Fatal("expected error, got nil")
111+
}
112+
113+
// The underlying parser error must be preserved for diagnostics.
114+
if !strings.Contains(err.Error(), "yaml") {
115+
t.Fatalf("error should preserve the parser error, got: %v", err)
116+
}
117+
}

0 commit comments

Comments
 (0)