diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-05-10 07:20:48 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-05-17 14:52:39 +0200 |
| commit | 4e1c0dbaeab92f02cef51524975f6cc447667b80 (patch) | |
| tree | d2cdd21d5f6a0700b48f112bce3a2f97d8b6331a /tools/syz-bisect | |
| parent | 6595937c34ea6357fb93780c3b5548ffc238526d (diff) | |
pkg/bisect: add bisection logic
Add first version of bisection package
(supports both bug and fix bisection).
And tools/syz-bisect wrapper for testing.
Update #501
Diffstat (limited to 'tools/syz-bisect')
| -rw-r--r-- | tools/syz-bisect/bisect.go | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/tools/syz-bisect/bisect.go b/tools/syz-bisect/bisect.go new file mode 100644 index 000000000..0f4657223 --- /dev/null +++ b/tools/syz-bisect/bisect.go @@ -0,0 +1,100 @@ +// Copyright 2018 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package main + +import ( + "encoding/json" + "flag" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "github.com/google/syzkaller/pkg/bisect" + "github.com/google/syzkaller/pkg/config" + "github.com/google/syzkaller/syz-manager/mgrconfig" +) + +var ( + flagConfig = flag.String("config", "", "bisect config file") + flagCrash = flag.String("crash", "", "dir with crash info") + flagFix = flag.Bool("fix", false, "search for crash fix") +) + +type Config struct { + BinDir string `json:"bin_dir"` + KernelRepo string `json:"kernel_repo"` + KernelBranch string `json:"kernel_branch"` + Compiler string `json:"compiler"` + Userspace string `json:"userspace"` + Sysctl string `json:"sysctl"` + Cmdline string `json:"cmdline"` + SyzkallerRepo string `json:"syzkaller_repo"` + Manager json.RawMessage `json:"manager"` +} + +func main() { + flag.Parse() + os.Setenv("SYZ_DISABLE_SANDBOXING", "yes") + mycfg := new(Config) + if err := config.LoadFile(*flagConfig, mycfg); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + mgrcfg, err := mgrconfig.LoadPartialData(mycfg.Manager) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + if mgrcfg.Workdir == "" { + mgrcfg.Workdir, err = ioutil.TempDir("", "syz-bisect") + if err != nil { + fmt.Fprintf(os.Stderr, "failed to create temp dir: %v\n", err) + os.Exit(1) + } + defer os.RemoveAll(mgrcfg.Workdir) + } + cfg := &bisect.Config{ + Trace: os.Stdout, + Fix: *flagFix, + BinDir: mycfg.BinDir, + DebugDir: *flagCrash, + Kernel: bisect.KernelConfig{ + Repo: mycfg.KernelRepo, + Branch: mycfg.KernelBranch, + Userspace: mycfg.Userspace, + Sysctl: mycfg.Sysctl, + Cmdline: mycfg.Cmdline, + }, + Syzkaller: bisect.SyzkallerConfig{ + Repo: mycfg.SyzkallerRepo, + }, + Manager: *mgrcfg, + } + loadString("syzkaller.commit", &cfg.Syzkaller.Commit) + loadString("kernel.commit", &cfg.Kernel.Commit) + loadFile("kernel.config", &cfg.Kernel.Config) + loadFile("repro.syz", &cfg.Repro.Syz) + loadFile("repro.opts", &cfg.Repro.Opts) + bisect.Run(cfg) +} + +func loadString(file string, dst *string) { + data, err := ioutil.ReadFile(filepath.Join(*flagCrash, file)) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + *dst = strings.TrimSpace(string(data)) +} + +func loadFile(file string, dst *[]byte) { + data, err := ioutil.ReadFile(filepath.Join(*flagCrash, file)) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + *dst = data +} |
