Skip to content

Commit

Permalink
syz-manager: extract fs images from reproducers
Browse files Browse the repository at this point in the history
  • Loading branch information
a-nogikh committed Sep 27, 2022
1 parent 2b420c9 commit 75c7824
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
14 changes: 14 additions & 0 deletions pkg/osutil/osutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ package osutil

import (
"bytes"
"compress/gzip"
"context"
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
Expand Down Expand Up @@ -269,6 +271,18 @@ func WriteFile(filename string, data []byte) error {
return ioutil.WriteFile(filename, data, DefaultFilePerm)
}

func WriteGzipStream(filename string, reader io.Reader) error {
f, err := os.Create(filename)
if err != nil {
return err
}
defer f.Close()
gz := gzip.NewWriter(f)
defer gz.Close()
_, err = io.Copy(gz, reader)
return err
}

func WriteExecFile(filename string, data []byte) error {
os.Remove(filename)
return ioutil.WriteFile(filename, data, DefaultExecPerm)
Expand Down
22 changes: 22 additions & 0 deletions syz-manager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -1084,6 +1084,9 @@ func (mgr *Manager) saveRepro(res *ReproResult) {
if len(cprogText) > 0 {
osutil.WriteFile(filepath.Join(dir, "repro.cprog"), cprogText)
}
for _, asset := range repro.Prog.ExtractAssets() {
saveReproAsset(dir, asset)
}
if res.strace != nil {
// Unlike dashboard reporting, we save strace output separately from the original log.
if res.strace.Error != nil {
Expand All @@ -1097,6 +1100,25 @@ func (mgr *Manager) saveRepro(res *ReproResult) {
saveReproStats(filepath.Join(dir, "repro.stats"), res.stats)
}

func saveReproAsset(dir string, asset *prog.ExtractedAsset) {
path := ""
switch asset.Type {
case prog.MountInRepro:
path = filepath.Join(dir, fmt.Sprintf("repro.mount%d", asset.Call))
default:
panic("unknown extracted prog asset")
}
var err error
if asset.Error != nil {
err = osutil.WriteFile(path+".error", []byte(asset.Error.Error()))
} else if asset.Reader != nil {
err = osutil.WriteGzipStream(path+".gz", asset.Reader)
}
if err != nil {
log.Logf(0, "failed to write crash asset: type %d, write error %v", asset.Type, err)
}
}

func saveReproStats(filename string, stats *repro.Stats) {
text := ""
if stats != nil {
Expand Down

0 comments on commit 75c7824

Please sign in to comment.