From d1f5f294b32edafd9707230e4d0cc8a7eba7d07d Mon Sep 17 00:00:00 2001 From: Gubarz <1037896+Gubarz@users.noreply.github.com> Date: Sat, 30 May 2026 22:49:09 -0600 Subject: [PATCH] fix(parser): skip reading files larger than 5MB to prevent memory exhaustion --- pkg/parser/parser.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go index c7e1166..42843e4 100644 --- a/pkg/parser/parser.go +++ b/pkg/parser/parser.go @@ -2,6 +2,7 @@ package parser import ( "bytes" + "fmt" "os" "path/filepath" "runtime" @@ -99,11 +100,13 @@ func parseFilesParallel(files []string) []parseResult { var localDuplicates []DuplicateExport for _, path := range fileChunk { - if data, err := os.ReadFile(path); err == nil && len(data) > 0 { - localParser.index = NewCheatIndex() - localParser.parseLines(path, data) - localCheats = append(localCheats, localParser.index.Cheats...) - localModules = mergeModules(localModules, &localDuplicates, localParser.index.Modules) + if info, err := os.Stat(path); err == nil && info.Size() <= 5*1024*1024 { + if data, err := os.ReadFile(path); err == nil && len(data) > 0 { + localParser.index = NewCheatIndex() + localParser.parseLines(path, data) + localCheats = append(localCheats, localParser.index.Cheats...) + localModules = mergeModules(localModules, &localDuplicates, localParser.index.Modules) + } } } resultChan <- parseResult{cheats: localCheats, modules: localModules, duplicates: localDuplicates, errors: localParser.index.Errors} @@ -163,6 +166,11 @@ func mergeModules(target map[string]*Module, duplicates *[]DuplicateExport, sour // ParseSingleFile parses a single markdown file func (p *Parser) ParseSingleFile(path string) (*CheatIndex, error) { p.index.Root = path + if info, err := os.Stat(path); err != nil { + return nil, err + } else if info.Size() > 5*1024*1024 { + return nil, fmt.Errorf("file exceeds 5MB size limit") + } data, err := os.ReadFile(path) if err != nil { return nil, err