Add recursive directory search with depth limits

This commit is contained in:
2026-10-19 20:18:39 +00:00
parent 032679bf34
commit 77d97296ea
4 changed files with 285 additions and 44 deletions

View File

@@ -10,6 +10,8 @@ import (
const globReadBatch = 128
var errInvalidImportGlobPattern = errors.New("invalid import glob filename pattern")
type globCandidate struct {
absolute string
relative string
@@ -99,27 +101,21 @@ func (s *importTraversal) readGlobMatches(directory, pattern string, location Lo
return nil, []Diagnostic{importDiagnostic(CodeImportOutsideRoot, "glob directory could not be addressed inside the configuration root", &location)}
}
var matches []string
var problem *Diagnostic
err = s.access.readDirectory(canonical, func(entry fs.DirEntry) bool {
s.accounting.entries++
if s.accounting.entries > s.limits.entries {
value := importDiagnostic(CodeImportLimitExceeded, "glob traversal exceeds the directory-entry visit limit", &location)
problem = &value
return false
}
err = visitBoundedImportDirectory(s.access, canonical, s.limits.entries, s.accounting, func(entry fs.DirEntry) error {
matched, matchErr := path.Match(pattern, entry.Name())
if matchErr != nil {
value := importDiagnostic(CodeImportInvalid, "import glob pattern is invalid", &location)
problem = &value
return false
return errInvalidImportGlobPattern
}
if matched {
matches = append(matches, entry.Name())
}
return true
return nil
})
if problem != nil {
return nil, []Diagnostic{*problem}
if errors.Is(err, errImportDirectoryEntryLimit) {
return nil, []Diagnostic{importDiagnostic(CodeImportLimitExceeded, "glob traversal exceeds the directory-entry visit limit", &location)}
}
if errors.Is(err, errInvalidImportGlobPattern) {
return nil, []Diagnostic{importDiagnostic(CodeImportInvalid, "import glob pattern is invalid", &location)}
}
if errors.Is(err, fs.ErrNotExist) {
return nil, nil