diff options
| -rw-r--r-- | pkg/manager/crash.go | 4 | ||||
| -rw-r--r-- | pkg/report/report.go | 15 | ||||
| -rw-r--r-- | pkg/report/report_test.go | 35 | ||||
| -rw-r--r-- | syz-manager/manager.go | 20 |
4 files changed, 63 insertions, 11 deletions
diff --git a/pkg/manager/crash.go b/pkg/manager/crash.go index 44df6e63e..cc36db721 100644 --- a/pkg/manager/crash.go +++ b/pkg/manager/crash.go @@ -17,6 +17,7 @@ import ( "github.com/google/syzkaller/pkg/log" "github.com/google/syzkaller/pkg/mgrconfig" "github.com/google/syzkaller/pkg/osutil" + "github.com/google/syzkaller/pkg/report" "github.com/google/syzkaller/prog" ) @@ -85,9 +86,10 @@ func (cs *CrashStore) SaveCrash(crash *Crash) (bool, error) { } osutil.WriteFile(filename, data) } + reps := append([]*report.Report{crash.Report}, crash.TailReports...) writeOrRemove("log", crash.Output) writeOrRemove("tag", []byte(cs.Tag)) - writeOrRemove("report", crash.Report.Report) + writeOrRemove("report", report.MergeReportBytes(reps)) writeOrRemove("machineInfo", crash.MachineInfo) return first, nil diff --git a/pkg/report/report.go b/pkg/report/report.go index 088f8c089..b4f93e3ac 100644 --- a/pkg/report/report.go +++ b/pkg/report/report.go @@ -943,3 +943,18 @@ func TitleToCrashType(title string) crash.Type { } return crash.UnknownType } + +const reportSeparator = "\n<<<<<<<<<<<<<<< tail report >>>>>>>>>>>>>>>\n\n" + +func MergeReportBytes(reps []*Report) []byte { + var res []byte + for _, rep := range reps { + res = append(res, rep.Report...) + res = append(res, []byte(reportSeparator)...) + } + return res +} + +func SplitReportBytes(data []byte) [][]byte { + return bytes.Split(data, []byte(reportSeparator)) +} diff --git a/pkg/report/report_test.go b/pkg/report/report_test.go index 2184cd411..8c863fe8d 100644 --- a/pkg/report/report_test.go +++ b/pkg/report/report_test.go @@ -510,3 +510,38 @@ BCDEF`), Truncate([]byte(`0123456789ABCDEF`), 0, 5)) DEF`), Truncate([]byte(`0123456789ABCDEF`), 4, 3)) } + +func TestSplitReportBytes(t *testing.T) { + tests := []struct { + name string + input []byte + wantFirst string + }{ + { + name: "empty", + input: nil, + wantFirst: "", + }, + { + name: "single", + input: []byte("report1"), + wantFirst: "report1", + }, + { + name: "split in the middle", + input: []byte("report1" + reportSeparator + "report2"), + wantFirst: "report1", + }, + { + name: "split in the middle, save new line", + input: []byte("report1\n" + reportSeparator + "report2"), + wantFirst: "report1\n", + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + splitted := SplitReportBytes(test.input) + assert.Equal(t, test.wantFirst, string(splitted[0])) + }) + } +} diff --git a/syz-manager/manager.go b/syz-manager/manager.go index 6446275f4..3f94bd23a 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -753,7 +753,7 @@ func (mgr *Manager) saveCrash(crash *manager.Crash) bool { Suppressed: crash.Suppressed, Recipients: crash.Recipients.ToDash(), Log: crash.Output, - Report: crash.Report.Report, + Report: report.SplitReportBytes(crash.Report.Report)[0], MachineInfo: crash.MachineInfo, } setGuiltyFiles(dc, crash.Report) @@ -885,27 +885,27 @@ func (mgr *Manager) saveRepro(res *manager.ReproResult) { // so maybe corrupted report detection is broken. // 3. Reproduction is expensive so it's good to persist the result. - report := repro.Report - output := report.Output + reproReport := repro.Report + output := reproReport.Output var crashFlags dashapi.CrashFlags if res.Strace != nil { // If syzkaller managed to successfully run the repro with strace, send // the report and the output generated under strace. - report = res.Strace.Report + reproReport = res.Strace.Report output = res.Strace.Output crashFlags = dashapi.CrashUnderStrace } dc := &dashapi.Crash{ BuildID: mgr.cfg.Tag, - Title: report.Title, - AltTitles: report.AltTitles, - Suppressed: report.Suppressed, - Recipients: report.Recipients.ToDash(), + Title: reproReport.Title, + AltTitles: reproReport.AltTitles, + Suppressed: reproReport.Suppressed, + Recipients: reproReport.Recipients.ToDash(), Log: output, Flags: crashFlags, - Report: report.Report, + Report: report.SplitReportBytes(reproReport.Report)[0], ReproOpts: repro.Opts.Serialize(), ReproSyz: progText, ReproC: cprogText, @@ -913,7 +913,7 @@ func (mgr *Manager) saveRepro(res *manager.ReproResult) { Assets: mgr.uploadReproAssets(repro), OriginalTitle: res.Crash.Title, } - setGuiltyFiles(dc, report) + setGuiltyFiles(dc, reproReport) if _, err := mgr.dash.ReportCrash(dc); err != nil { log.Logf(0, "failed to report repro to dashboard: %v", err) } else { |
