aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-02-21 15:33:28 +0100
committerAleksandr Nogikh <nogikh@google.com>2024-02-21 14:45:26 +0000
commitecc726d47d5bbd5847ed472fb01ca9e87079c6a9 (patch)
tree17c8ee1f073422da0b45a0d53cfdd4ef18680b61
parent3af7dd651dc78ce0784bef793d14dd2f72d07138 (diff)
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.
-rw-r--r--pkg/report/report.go21
-rw-r--r--pkg/report/report_test.go15
-rw-r--r--syz-manager/manager.go33
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, "<<cut %d bytes out>>",
+ 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
+
+<<cut 11 bytes out>>`), Truncate([]byte(`0123456789ABCDEF`), 5, 0))
+ assert.Equal(t, []byte(`<<cut 11 bytes out>>
+
+BCDEF`), Truncate([]byte(`0123456789ABCDEF`), 0, 5))
+ assert.Equal(t, []byte(`0123
+
+<<cut 9 bytes out>>
+
+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,
}