Skip to content

Commit a644435

Browse files
Merge pull request #103457 from codearky/fix-yaml-terminator-wcomment
Add YAML separator validation and avoid silent ignoration Kubernetes-commit: ace5482c9fd707a29f4626e7d78b4041b994b618
2 parents ff522ab + f1aad3e commit a644435

File tree

2 files changed

+49
-7
lines changed

2 files changed

+49
-7
lines changed

pkg/util/yaml/decoder.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,19 @@ func (r *YAMLReader) Read() ([]byte, error) {
291291
if i := bytes.Index(line, []byte(separator)); i == 0 {
292292
// We have a potential document terminator
293293
i += sep
294-
after := line[i:]
295-
if len(strings.TrimRightFunc(string(after), unicode.IsSpace)) == 0 {
296-
if buffer.Len() != 0 {
297-
return buffer.Bytes(), nil
298-
}
299-
if err == io.EOF {
300-
return nil, err
294+
trimmed := strings.TrimSpace(string(line[i:]))
295+
// We only allow comments and spaces following the yaml doc separator, otherwise we'll return an error
296+
if len(trimmed) > 0 && string(trimmed[0]) != "#" {
297+
return nil, YAMLSyntaxError{
298+
err: fmt.Errorf("invalid Yaml document separator: %s", trimmed),
301299
}
302300
}
301+
if buffer.Len() != 0 {
302+
return buffer.Bytes(), nil
303+
}
304+
if err == io.EOF {
305+
return nil, err
306+
}
303307
}
304308
if err == io.EOF {
305309
if buffer.Len() != 0 {

pkg/util/yaml/decoder_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,40 @@ stuff: 1
211211
}
212212
}
213213

214+
func TestDecodeYAMLSeparatorValidation(t *testing.T) {
215+
s := NewYAMLToJSONDecoder(bytes.NewReader([]byte(`---
216+
stuff: 1
217+
--- # Make sure termination happen with inline comment
218+
stuff: 2
219+
---
220+
stuff: 3
221+
--- Make sure uncommented content results YAMLSyntaxError
222+
223+
`)))
224+
obj := generic{}
225+
if err := s.Decode(&obj); err != nil {
226+
t.Fatalf("unexpected error: %v", err)
227+
}
228+
if fmt.Sprintf("%#v", obj) != `yaml.generic{"stuff":1}` {
229+
t.Errorf("unexpected object: %#v", obj)
230+
}
231+
obj = generic{}
232+
if err := s.Decode(&obj); err != nil {
233+
t.Fatalf("unexpected error: %v", err)
234+
}
235+
if fmt.Sprintf("%#v", obj) != `yaml.generic{"stuff":2}` {
236+
t.Errorf("unexpected object: %#v", obj)
237+
}
238+
obj = generic{}
239+
err := s.Decode(&obj)
240+
if err == nil {
241+
t.Fatalf("expected YamlSyntaxError, got nil instead")
242+
}
243+
if _, ok := err.(YAMLSyntaxError); !ok {
244+
t.Fatalf("unexpected error: %v", err)
245+
}
246+
}
247+
214248
func TestDecodeBrokenYAML(t *testing.T) {
215249
s := NewYAMLOrJSONDecoder(bytes.NewReader([]byte(`---
216250
stuff: 1
@@ -282,6 +316,10 @@ func TestYAMLOrJSONDecoder(t *testing.T) {
282316
{"foo": "bar"},
283317
{"baz": "biz"},
284318
}},
319+
{"---\nfoo: bar\n--- # with Comment\nbaz: biz", 100, false, false, []generic{
320+
{"foo": "bar"},
321+
{"baz": "biz"},
322+
}},
285323
{"foo: bar\n---\n", 100, false, false, []generic{
286324
{"foo": "bar"},
287325
}},

0 commit comments

Comments
 (0)