diff --git a/internal/model/fuzz_test.go b/internal/model/fuzz_test.go index d60ad93..bd44844 100644 --- a/internal/model/fuzz_test.go +++ b/internal/model/fuzz_test.go @@ -26,6 +26,7 @@ func FuzzParseBytes(f *testing.F) { []byte("job:\n stage: test\n image:\n name: golang:1.21\n entrypoint: ['']\n parallel:\n matrix:\n - PLATFORM: [linux, darwin]\n script: go build\n"), []byte("default:\n retry: 2\n timeout: 1h30m\nvariables:\n ENV: production\nstages: [build, test, deploy]\n"), []byte("&anchor\n script: [echo ok]\njob:\n <<: *anchor\n stage: build\n"), + []byte("?"), // null/empty YAML key — must error, not produce an empty-named job } for _, s := range seeds { f.Add(s) diff --git a/internal/model/parser.go b/internal/model/parser.go index 586de2c..dc2255e 100644 --- a/internal/model/parser.go +++ b/internal/model/parser.go @@ -57,6 +57,9 @@ func ParseBytes(data []byte) (*Pipeline, error) { keyNode := root.Content[i] valNode := root.Content[i+1] key := keyNode.Value + if key == "" { + return nil, fmt.Errorf("job name cannot be empty (null or missing YAML key)") + } if ReservedKeys[key] { continue } diff --git a/internal/model/parser_test.go b/internal/model/parser_test.go index b0d166c..004811a 100644 --- a/internal/model/parser_test.go +++ b/internal/model/parser_test.go @@ -88,6 +88,12 @@ func TestParseBytes_EdgeCases(t *testing.T) { if err == nil { t.Error("wrong field type: expected error from ParseBytes (stage must be string)") } + + // Null/empty YAML key (e.g. bare "?"): job name cannot be empty. + _, err = ParseBytes([]byte("?")) + if err == nil { + t.Error("null key: expected error from ParseBytes (job name cannot be empty)") + } } // TestParse_ParseBytesError exercises the Parse → ParseBytes error path (line 18). diff --git a/internal/model/testdata/fuzz/FuzzParseBytes/c18522695dec4f60 b/internal/model/testdata/fuzz/FuzzParseBytes/c18522695dec4f60 new file mode 100644 index 0000000..29ee1be --- /dev/null +++ b/internal/model/testdata/fuzz/FuzzParseBytes/c18522695dec4f60 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("?")