aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2025-08-20 10:26:12 +0200
committerTaras Madan <tarasmadan@google.com>2025-08-28 11:36:44 +0000
commit3984c91733166d63d43fd5d4ca0a61a46e666a26 (patch)
tree02537be4a6f2745094839369eff74c36258f29a7 /pkg
parent6c8b90a1abc330c4e05307ddb268b084a02cd2a3 (diff)
pkg/manager: store tail reports
Send only the first report to dashboard.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/manager/crash.go4
-rw-r--r--pkg/report/report.go15
-rw-r--r--pkg/report/report_test.go35
3 files changed, 53 insertions, 1 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]))
+ })
+ }
+}