diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2022-09-28 16:58:20 +0000 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2022-10-04 11:03:59 +0200 |
| commit | 978d1f191b7f89d799122c5639b01b30d57ca25a (patch) | |
| tree | 50a37ffd853360931b0b6955e60c31f0264786a4 | |
| parent | 37f7ec75a3672de8b3280d0b59ef2d4c97e5097d (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.go | 12 | ||||
| -rw-r--r-- | syz-manager/manager.go | 38 |
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 { |
