aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2022-09-28 16:58:20 +0000
committerAleksandr Nogikh <wp32pw@gmail.com>2022-10-04 11:03:59 +0200
commit978d1f191b7f89d799122c5639b01b30d57ca25a (patch)
tree50a37ffd853360931b0b6955e60c31f0264786a4
parent37f7ec75a3672de8b3280d0b59ef2d4c97e5097d (diff)
syz-manager: upload mounted images from repros
Collect mounted images from repros and upload them to the asset storage. Report the resulting download URLs to the dashboard.
-rw-r--r--pkg/asset/storage.go12
-rw-r--r--syz-manager/manager.go38
2 files changed, 50 insertions, 0 deletions
diff --git a/pkg/asset/storage.go b/pkg/asset/storage.go
index 0b008b744..6905b0a07 100644
--- a/pkg/asset/storage.go
+++ b/pkg/asset/storage.go
@@ -182,6 +182,18 @@ func (storage *Storage) ReportBuildAssets(build *dashapi.Build, assets ...dashap
})
}
+func (storage *Storage) UploadCrashAsset(reader io.Reader, fileName string, assetType dashapi.AssetType,
+ extra *ExtraUploadArg) (dashapi.NewAsset, error) {
+ url, err := storage.uploadFileStream(reader, assetType, fileName, extra)
+ if err != nil {
+ return dashapi.NewAsset{}, err
+ }
+ return dashapi.NewAsset{
+ Type: assetType,
+ DownloadURL: url,
+ }, nil
+}
+
var ErrAssetDoesNotExist = errors.New("the asset did not exist")
type FileExistsError struct {
diff --git a/syz-manager/manager.go b/syz-manager/manager.go
index 4f12d3a4c..1e645b670 100644
--- a/syz-manager/manager.go
+++ b/syz-manager/manager.go
@@ -1056,6 +1056,7 @@ func (mgr *Manager) saveRepro(res *ReproResult) {
output = res.strace.Output
crashFlags = dashapi.CrashUnderStrace
}
+
dc := &dashapi.Crash{
BuildID: mgr.cfg.Tag,
Title: report.Title,
@@ -1068,6 +1069,7 @@ func (mgr *Manager) saveRepro(res *ReproResult) {
ReproOpts: repro.Opts.Serialize(),
ReproSyz: repro.Prog.Serialize(),
ReproC: cprogText,
+ Assets: mgr.uploadReproAssets(repro),
}
if _, err := mgr.dash.ReportCrash(dc); err != nil {
log.Logf(0, "failed to report repro to dashboard: %v", err)
@@ -1114,6 +1116,42 @@ func (mgr *Manager) saveRepro(res *ReproResult) {
saveReproStats(filepath.Join(dir, "repro.stats"), res.stats)
}
+func (mgr *Manager) uploadReproAssets(repro *repro.Result) []dashapi.NewAsset {
+ ret := []dashapi.NewAsset{}
+ if mgr.assetStorage == nil {
+ return ret
+ }
+
+ for _, asset := range repro.Prog.ExtractAssets() {
+ if asset.Reader == nil {
+ // Skip empty assets.
+ continue
+ }
+ newAsset, err := mgr.uploadReproAsset(asset)
+ if err != nil {
+ log.Logf(1, "processing of the asset #%d,%v failed: %s",
+ asset.Call, asset.Type, err)
+ continue
+ }
+ ret = append(ret, newAsset)
+ }
+ return ret
+}
+
+func (mgr *Manager) uploadReproAsset(asset *prog.ExtractedAsset) (dashapi.NewAsset, error) {
+ if asset.Error != nil {
+ return dashapi.NewAsset{}, fmt.Errorf("failed to extract: %w", asset.Error)
+ }
+ switch asset.Type {
+ case prog.MountInRepro:
+ name := fmt.Sprintf("mount_%d", asset.Call)
+ return mgr.assetStorage.UploadCrashAsset(asset.Reader, name,
+ dashapi.MountInRepro, nil)
+ default:
+ panic("unknown extracted prog asset")
+ }
+}
+
func saveReproAsset(dir string, asset *prog.ExtractedAsset) {
path := ""
switch asset.Type {