From 95fb739d94b72da3b728ad393e565233c23e0df7 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Mon, 19 Oct 2015 12:47:37 +0200 Subject: aggregate vm params into a single struct (for ease of extension) --- fuzzer/fuzzer.go | 3 ++- manager/main.go | 16 +++++++++++----- manager/manager.go | 2 +- vm/kvm/kvm.go | 14 +++++++------- vm/local/local.go | 21 +++++++-------------- vm/qemu/qemu.go | 14 +++++++------- vm/vm.go | 13 ++++++++++--- 7 files changed, 45 insertions(+), 38 deletions(-) diff --git a/fuzzer/fuzzer.go b/fuzzer/fuzzer.go index c7a5b6757..1da15ccfe 100644 --- a/fuzzer/fuzzer.go +++ b/fuzzer/fuzzer.go @@ -35,7 +35,8 @@ var ( flagStrace = flag.Bool("strace", false, "run executor under strace") flagSaveProg = flag.Bool("saveprog", false, "save programs into local file before executing") flagSyscalls = flag.String("calls", "", "comma-delimited list of enabled syscall IDs (empty string for all syscalls)") - flagV = flag.Int("v", 0, "verbosity") + + flagV = flag.Int("v", 0, "verbosity") ) const ( diff --git a/manager/main.go b/manager/main.go index 079055b0b..84b8b7af4 100644 --- a/manager/main.go +++ b/manager/main.go @@ -39,13 +39,19 @@ type Config struct { func main() { flag.Parse() cfg, syscalls := parseConfig() + params, err := json.Marshal(cfg.Params) + if err != nil { + fatalf("failed to marshal config params: %v", err) + } + vmCfg := &vm.Config{ + Workdir: cfg.Workdir, + ManagerPort: cfg.Port, + Params: params, + Syscalls: syscalls, + } var instances []vm.Instance for i := 0; i < cfg.Count; i++ { - params, err := json.Marshal(cfg.Params) - if err != nil { - fatalf("failed to marshal config params: %v", err) - } - inst, err := vm.Create(cfg.Type, cfg.Workdir, syscalls, cfg.Port, i, params) + inst, err := vm.Create(cfg.Type, vmCfg, i) if err != nil { fatalf("failed to create an instance: %v", err) } diff --git a/manager/manager.go b/manager/manager.go index eb1ca8a3b..ab0372eab 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -142,7 +142,7 @@ func (mgr *Manager) pollMaster() { } func (mgr *Manager) minimizeCorpus() { - if len(mgr.corpus) != 0 { + if !mgr.cfg.Nocover && len(mgr.corpus) != 0 { // First, sort corpus per call. type Call struct { inputs []RpcInput diff --git a/vm/kvm/kvm.go b/vm/kvm/kvm.go index c95d63a7e..1370a23b6 100644 --- a/vm/kvm/kvm.go +++ b/vm/kvm/kvm.go @@ -46,9 +46,9 @@ type params struct { Mem int } -func ctor(workdir string, syscalls map[int]bool, port, index int, paramsData []byte) (vm.Instance, error) { +func ctor(cfg *vm.Config, index int) (vm.Instance, error) { p := new(params) - if err := json.Unmarshal(paramsData, p); err != nil { + if err := json.Unmarshal(cfg.Params, p); err != nil { return nil, fmt.Errorf("failed to unmarshal kvm params: %v", err) } if _, err := os.Stat(p.Kernel); err != nil { @@ -70,10 +70,10 @@ func ctor(workdir string, syscalls map[int]bool, port, index int, paramsData []b return nil, fmt.Errorf("bad kvm mem: %v, want [128-1048576]", p.Mem) } - crashdir := filepath.Join(workdir, "crashes") + crashdir := filepath.Join(cfg.Workdir, "crashes") os.MkdirAll(crashdir, 0770) - workdir = filepath.Join(workdir, "kvm") + workdir := filepath.Join(cfg.Workdir, "kvm") os.MkdirAll(workdir, 0770) vm := &kvm{ @@ -81,12 +81,12 @@ func ctor(workdir string, syscalls map[int]bool, port, index int, paramsData []b workdir: workdir, crashdir: crashdir, id: index, - mgrPort: port, + mgrPort: cfg.ManagerPort, } - if len(syscalls) != 0 { + if len(cfg.Syscalls) != 0 { buf := new(bytes.Buffer) - for c := range syscalls { + for c := range cfg.Syscalls { fmt.Fprintf(buf, ",%v", c) } vm.callsFlag = "-calls=" + buf.String()[1:] diff --git a/vm/local/local.go b/vm/local/local.go index 3966771d0..2cf18276d 100644 --- a/vm/local/local.go +++ b/vm/local/local.go @@ -31,12 +31,11 @@ type local struct { type params struct { Fuzzer string Executor string - Parallel int } -func ctor(workdir string, syscalls map[int]bool, port, index int, paramsData []byte) (vm.Instance, error) { +func ctor(cfg *vm.Config, index int) (vm.Instance, error) { p := new(params) - if err := json.Unmarshal(paramsData, p); err != nil { + if err := json.Unmarshal(cfg.Params, p); err != nil { return nil, fmt.Errorf("failed to unmarshal local params: %v", err) } if _, err := os.Stat(p.Fuzzer); err != nil { @@ -45,14 +44,8 @@ func ctor(workdir string, syscalls map[int]bool, port, index int, paramsData []b if _, err := os.Stat(p.Executor); err != nil { return nil, fmt.Errorf("executor binary '%v' does not exist: %v", p.Executor, err) } - if p.Parallel == 0 { - p.Parallel = 1 - } - if p.Parallel <= 0 || p.Parallel > 100 { - return nil, fmt.Errorf("bad parallel param: %v, want [1-100]", p.Parallel) - } - os.MkdirAll(workdir, 0770) + os.MkdirAll(cfg.Workdir, 0770) // Disable annoying segfault dmesg messages, fuzzer is going to crash a lot. etrace, err := os.Open("/proc/sys/debug/exception-trace") @@ -66,10 +59,10 @@ func ctor(workdir string, syscalls map[int]bool, port, index int, paramsData []b loc := &local{ params: *p, - workdir: workdir, - syscalls: syscalls, + workdir: cfg.Workdir, + syscalls: cfg.Syscalls, id: index, - mgrPort: port, + mgrPort: cfg.ManagerPort, } return loc, nil } @@ -79,7 +72,7 @@ func (loc *local) Run() { log.Printf("%v: started\n", name) for run := 0; ; run++ { cmd := exec.Command(loc.Fuzzer, "-name", name, "-saveprog", "-executor", loc.Executor, - "-manager", fmt.Sprintf("localhost:%v", loc.mgrPort), "-parallel", fmt.Sprintf("%v", loc.Parallel)) + "-manager", fmt.Sprintf("localhost:%v", loc.mgrPort)) if len(loc.syscalls) != 0 { buf := new(bytes.Buffer) for c := range loc.syscalls { diff --git a/vm/qemu/qemu.go b/vm/qemu/qemu.go index 050109ee8..b0c17404d 100644 --- a/vm/qemu/qemu.go +++ b/vm/qemu/qemu.go @@ -51,9 +51,9 @@ type params struct { Mem int } -func ctor(workdir string, syscalls map[int]bool, port, index int, paramsData []byte) (vm.Instance, error) { +func ctor(cfg *vm.Config, index int) (vm.Instance, error) { p := new(params) - if err := json.Unmarshal(paramsData, p); err != nil { + if err := json.Unmarshal(cfg.Params, p); err != nil { return nil, fmt.Errorf("failed to unmarshal qemu params: %v", err) } if _, err := os.Stat(p.Image); err != nil { @@ -82,10 +82,10 @@ func ctor(workdir string, syscalls map[int]bool, port, index int, paramsData []b return nil, fmt.Errorf("bad qemu mem: %v, want [128-1048576]", p.Mem) } - crashdir := filepath.Join(workdir, "crashes") + crashdir := filepath.Join(cfg.Workdir, "crashes") os.MkdirAll(crashdir, 0770) - workdir = filepath.Join(workdir, "qemu") + workdir := filepath.Join(cfg.Workdir, "qemu") os.MkdirAll(workdir, 0770) q := &qemu{ @@ -93,12 +93,12 @@ func ctor(workdir string, syscalls map[int]bool, port, index int, paramsData []b workdir: workdir, crashdir: crashdir, id: index, - mgrPort: port, + mgrPort: cfg.ManagerPort, } - if len(syscalls) != 0 { + if len(cfg.Syscalls) != 0 { buf := new(bytes.Buffer) - for c := range syscalls { + for c := range cfg.Syscalls { fmt.Fprintf(buf, ",%v", c) } q.callsFlag = "-calls=" + buf.String()[1:] diff --git a/vm/vm.go b/vm/vm.go index b9eded0c8..cb42e36fd 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -11,7 +11,14 @@ type Instance interface { Run() } -type ctorFunc func(workdir string, syscalls map[int]bool, port, index int, params []byte) (Instance, error) +type Config struct { + Workdir string + ManagerPort int + Params []byte + Syscalls map[int]bool +} + +type ctorFunc func(cfg *Config, index int) (Instance, error) var ctors = make(map[string]ctorFunc) @@ -19,10 +26,10 @@ func Register(typ string, ctor ctorFunc) { ctors[typ] = ctor } -func Create(typ string, workdir string, syscalls map[int]bool, port, index int, params []byte) (Instance, error) { +func Create(typ string, cfg *Config, index int) (Instance, error) { ctor := ctors[typ] if ctor == nil { return nil, fmt.Errorf("unknown instance type '%v'", typ) } - return ctor(workdir, syscalls, port, index, params) + return ctor(cfg, index) } -- cgit mrf-deployment