aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2015-10-19 12:47:37 +0200
committerDmitry Vyukov <dvyukov@google.com>2015-10-20 15:46:04 +0200
commit95fb739d94b72da3b728ad393e565233c23e0df7 (patch)
tree8bd7cee56ba1245af442b66080781b4f781a675c
parent3f6daab6e49bb2554ad1d96115d2d3ec17ceaf58 (diff)
aggregate vm params into a single struct (for ease of extension)
-rw-r--r--fuzzer/fuzzer.go3
-rw-r--r--manager/main.go16
-rw-r--r--manager/manager.go2
-rw-r--r--vm/kvm/kvm.go14
-rw-r--r--vm/local/local.go21
-rw-r--r--vm/qemu/qemu.go14
-rw-r--r--vm/vm.go13
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)
}