aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/manager/crash.go4
-rw-r--r--pkg/report/report.go15
-rw-r--r--pkg/report/report_test.go35
-rw-r--r--syz-manager/manager.go20
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 {