github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/pkg/email/lore/read.go (about) 1 // Copyright 2023 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package lore 5 6 import ( 7 "bytes" 8 "fmt" 9 "time" 10 11 "github.com/google/syzkaller/pkg/email" 12 "github.com/google/syzkaller/pkg/vcs" 13 ) 14 15 type EmailReader struct { 16 vcs.CommitShort 17 Read func() ([]byte, error) 18 } 19 20 // ReadArchive queries the parsed messages from a single LKML message archive. 21 func ReadArchive(repo vcs.Repo, afterCommit string, afterTime time.Time) ([]EmailReader, error) { 22 commits, err := repo.LatestCommits(afterCommit, afterTime) 23 if err != nil { 24 return nil, fmt.Errorf("failed to get recent commits: %w", err) 25 } 26 var ret []EmailReader 27 for _, iterCommit := range commits { 28 commit := iterCommit 29 ret = append(ret, EmailReader{ 30 CommitShort: commit, 31 Read: func() ([]byte, error) { 32 return repo.Object("m", commit.Hash) 33 }, 34 }) 35 } 36 return ret, nil 37 } 38 39 type Email struct { 40 *email.Email 41 HasPatch bool 42 } 43 44 func (er *EmailReader) Parse(emails, domains []string) (*Email, error) { 45 body, err := er.Read() 46 if err != nil { 47 return nil, err 48 } 49 return emailFromRaw(body, emails, domains) 50 } 51 52 func emailFromRaw(body []byte, emails, domains []string) (*Email, error) { 53 msg, err := email.Parse(bytes.NewReader(body), emails, nil, domains) 54 if err != nil { 55 return nil, err 56 } 57 ret := &Email{Email: msg, HasPatch: msg.Patch != ""} 58 // Keep memory consumption low. 59 ret.Body = "" 60 ret.Patch = "" 61 // TODO: If emails/domains are nil, we also don't need to parse the body at all. 62 return ret, nil 63 }