fix(engine): prevent Files.Lines panic on empty file

Files.Lines guards against a nil entry but an empty file inside a
chart is stored as a non-nil zero-length byte slice, so the trailing
newline check indexes s[-1] and panics. The engine recovers the panic
into a render error, making every template/install/upgrade/lint that
references the file fail.

Extend the guard to len(f[path]) == 0 and return an empty slice,
matching the behaviour for missing files.

Fixes #32279

Signed-off-by: Mahesh Sadupalli <mahesh.sadupalli@gmail.com>
pull/32290/head
Mahesh Sadupalli 5 days ago
parent 543b94d673
commit 143631f735

@ -154,7 +154,7 @@ func (f files) AsSecrets() string {
// {{ range .Files.Lines "foo/bar.html" }}
// {{ . }}{{ end }}
func (f files) Lines(path string) []string {
if f == nil || f[path] == nil {
if f == nil || len(f[path]) == 0 {
return []string{}
}
s := string(f[path])

@ -30,6 +30,8 @@ var cases = []struct {
{"story/author.txt", "Joseph Conrad"},
{"multiline/test.txt", "bar\nfoo\n"},
{"multiline/test_with_blank_lines.txt", "bar\nfoo\n\n\n"},
{"empty/empty.txt", ""},
{"empty/newline_only.txt", "\n"},
}
func getTestFiles() files {
@ -109,3 +111,31 @@ func TestBlankLines(t *testing.T) {
as.Equal("bar", out[0])
as.Empty(out[3])
}
func TestLinesEmptyFile(t *testing.T) {
as := assert.New(t)
f := getTestFiles()
out := f.Lines("empty/empty.txt")
as.Empty(out)
}
func TestLinesNewlineOnlyFile(t *testing.T) {
as := assert.New(t)
f := getTestFiles()
out := f.Lines("empty/newline_only.txt")
as.Len(out, 1)
as.Empty(out[0])
}
func TestLinesMissingFile(t *testing.T) {
as := assert.New(t)
f := getTestFiles()
out := f.Lines("nonexistent.txt")
as.Empty(out)
}

Loading…
Cancel
Save