From ecc726d47d5bbd5847ed472fb01ca9e87079c6a9 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 21 Feb 2024 15:33:28 +0100 Subject: syz-manager: truncate repro logs before reporting Until we have figured out a way to solve #4495, let's just truncate repro logs before sending them over the dashboard API. --- pkg/report/report.go | 21 +++++++++++++++++++++ pkg/report/report_test.go | 15 +++++++++++++++ syz-manager/manager.go | 33 +++++++++++++++++++-------------- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/pkg/report/report.go b/pkg/report/report.go index 4bf0adead..750ceed14 100644 --- a/pkg/report/report.go +++ b/pkg/report/report.go @@ -742,6 +742,27 @@ func replace(where []byte, start, end int, what []byte) []byte { return where } +// Truncate leaves up to `begin` bytes at the beginning of log and +// up to `end` bytes at the end of the log. +func Truncate(log []byte, begin, end int) []byte { + if begin+end >= len(log) { + return log + } + var b bytes.Buffer + b.Write(log[:begin]) + if begin > 0 { + b.WriteString("\n\n") + } + fmt.Fprintf(&b, "<>", + len(log)-begin-end, + ) + if end > 0 { + b.WriteString("\n\n") + } + b.Write(log[len(log)-end:]) + return b.Bytes() +} + var ( filenameRe = regexp.MustCompile(`([a-zA-Z0-9_\-\./]*[a-zA-Z0-9_\-]+\.(c|h)):[0-9]+`) reportFrameRe = regexp.MustCompile(`.* in ([a-zA-Z0-9_]+)`) diff --git a/pkg/report/report_test.go b/pkg/report/report_test.go index ba41735a5..934d4552e 100644 --- a/pkg/report/report_test.go +++ b/pkg/report/report_test.go @@ -21,6 +21,7 @@ import ( "github.com/google/syzkaller/pkg/report/crash" "github.com/google/syzkaller/pkg/testutil" "github.com/google/syzkaller/sys/targets" + "github.com/stretchr/testify/assert" ) var flagUpdate = flag.Bool("update", false, "update test files accordingly to current results") @@ -430,3 +431,17 @@ func TestFuzz(t *testing.T) { Fuzz([]byte(data)[:len(data):len(data)]) } } + +func TestTruncate(t *testing.T) { + assert.Equal(t, []byte(`01234 + +<>`), Truncate([]byte(`0123456789ABCDEF`), 5, 0)) + assert.Equal(t, []byte(`<> + +BCDEF`), Truncate([]byte(`0123456789ABCDEF`), 0, 5)) + assert.Equal(t, []byte(`0123 + +<> + +DEF`), Truncate([]byte(`0123456789ABCDEF`), 4, 3)) +} diff --git a/syz-manager/manager.go b/syz-manager/manager.go index 40de4a50d..3c09e9a0b 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -1036,6 +1036,12 @@ func (mgr *Manager) needRepro(crash *Crash) bool { return needRepro } +func truncateReproLog(log []byte) []byte { + // Repro logs can get quite large and we have trouble sending large API requests (see #4495). + // Let's truncate the log to a 512KB prefix and 512KB suffix. + return report.Truncate(log, 512000, 512000) +} + func (mgr *Manager) saveFailedRepro(rep *report.Report, stats *repro.Stats) { reproLog := fullReproLog(stats) if mgr.dash != nil { @@ -1051,7 +1057,7 @@ func (mgr *Manager) saveFailedRepro(rep *report.Report, stats *repro.Stats) { Corrupted: rep.Corrupted, Suppressed: rep.Suppressed, MayBeMissing: rep.Type == crash_pkg.MemoryLeak, - ReproLog: reproLog, + ReproLog: truncateReproLog(reproLog), } if err := mgr.dash.ReportFailedRepro(cid); err != nil { log.Logf(0, "failed to report failed repro to dashboard (log size %d): %v", @@ -1119,19 +1125,18 @@ func (mgr *Manager) saveRepro(res *ReproResult) { } dc := &dashapi.Crash{ - BuildID: mgr.cfg.Tag, - Title: report.Title, - AltTitles: report.AltTitles, - Suppressed: report.Suppressed, - Recipients: report.Recipients.ToDash(), - Log: output, - Flags: crashFlags, - Report: report.Report, - ReproOpts: repro.Opts.Serialize(), - ReproSyz: progText, - ReproC: cprogText, - // Paused because of #4495. - // ReproLog: fullReproLog(res.stats), + BuildID: mgr.cfg.Tag, + Title: report.Title, + AltTitles: report.AltTitles, + Suppressed: report.Suppressed, + Recipients: report.Recipients.ToDash(), + Log: output, + Flags: crashFlags, + Report: report.Report, + ReproOpts: repro.Opts.Serialize(), + ReproSyz: progText, + ReproC: cprogText, + ReproLog: truncateReproLog(fullReproLog(res.stats)), Assets: mgr.uploadReproAssets(repro), OriginalTitle: res.originalTitle, } -- cgit mrf-deployment