From 7c72d9f04aad8b853c7584c0a07ac850f46bdd24 Mon Sep 17 00:00:00 2001 From: Bence Ferdinandy Date: Fri, 24 Jan 2025 00:19:20 +0100 Subject: [PATCH] walkpaths: fix messageParser not closing files Using defer to close the file in general was a smart move, but I did not consider that all the parsing happens within the same function, thus leaving all the defer statements to after all the files have been opened. Create an emlParser in analogue to the mboxParser, opening each file in an individual function call to make use of defer. Make the messageParser logic a bit cleaner in the process. Reported-by: Federico Ferri Fixes: 7e0f2bb9b5b8ab94eecad51d581e7b9c041cdffc Closes: #14 --- parseMail.go | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/parseMail.go b/parseMail.go index 3b3dffa..249a5a5 100644 --- a/parseMail.go +++ b/parseMail.go @@ -40,32 +40,38 @@ func mboxParser(path string, headers chan<- *mail.Header) error { return nil } +func emlParser(path string, headers chan<- *mail.Header) error { + f, err := os.Open(path) + defer f.Close() + if err != nil { + fmt.Fprintln(os.Stderr, err) + return err + } + r, err := mail.CreateReader(f) + if err != nil { + return err + } + h := &mail.Header{Header: r.Header.Header} + headers <- h + return nil +} + func messageParser( paths chan string, headers chan<- *mail.Header, ) { for path := range paths { - f, err := os.Open(path) - defer f.Close() - if err != nil { - fmt.Fprintln(os.Stderr, err) - continue - } - r, err := mail.CreateReader(f) + err := emlParser(path, headers) if err != nil { mboxerr := mboxParser(path, headers) if mboxerr == nil { - continue - } - if utf8.ValidString(err.Error()) { + // do nothing + } else if utf8.ValidString(err.Error()) { fmt.Fprintln(os.Stderr, path, err) } else { fmt.Fprintln(os.Stderr, path, "mail reader error, probably tried reading binary") } - continue } - h := &mail.Header{Header: r.Header.Header} - headers <- h } }