From 60c07b259e398e044faa48742d034bfb96a0bc87 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Fri, 30 Aug 2019 10:36:31 +0100 Subject: [PATCH] lib/ignore: Don't crash in partial #include line (ref #5985) (#5986) If the line is just "#include" with nothing following it we would crash with an index out of bounds error. Now it's a little more careful. --- lib/ignore/ignore.go | 13 ++++++++++++- lib/ignore/ignore_test.go | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/ignore/ignore.go b/lib/ignore/ignore.go index 74d35c1e..81ee8f24 100644 --- a/lib/ignore/ignore.go +++ b/lib/ignore/ignore.go @@ -461,7 +461,18 @@ func parseIgnoreFile(fs fs.Filesystem, fd io.Reader, currentFile string, cd Chan line = filepath.ToSlash(line) switch { case strings.HasPrefix(line, "#include"): - includeRel := strings.TrimSpace(line[len("#include "):]) + fields := strings.SplitN(line, " ", 2) + if len(fields) != 2 { + err = fmt.Errorf("failed to parse #include line: no file?") + break + } + + includeRel := strings.TrimSpace(fields[1]) + if includeRel == "" { + err = fmt.Errorf("failed to parse #include line: no file?") + break + } + includeFile := filepath.Join(filepath.Dir(currentFile), includeRel) var includePatterns []Pattern if includePatterns, err = loadParseIncludeFile(fs, includeFile, cd, linesSeen); err == nil { diff --git a/lib/ignore/ignore_test.go b/lib/ignore/ignore_test.go index 18ff24e9..93a72c5d 100644 --- a/lib/ignore/ignore_test.go +++ b/lib/ignore/ignore_test.go @@ -1079,3 +1079,22 @@ func TestSpecialChars(t *testing.T) { } } } + +func TestPartialIncludeLine(t *testing.T) { + // Loading a partial #include line (no file mentioned) should error but not crash. + + pats := New(fs.NewFilesystem(fs.FilesystemTypeBasic, "."), WithCache(true)) + cases := []string{ + "#include", + "#include\n", + "#include ", + "#include \n", + "#include \n\n\n", + } + + for _, tc := range cases { + if err := pats.Parse(bytes.NewBufferString(tc), ".stignore"); err == nil { + t.Fatal("should error out") + } + } +}