aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-01-20 13:58:57 +0100
committerDmitry Vyukov <dvyukov@google.com>2016-01-20 13:58:57 +0100
commit8cff5843fb3bbbc1342cf3aafbff953f4477761f (patch)
tree4b0588bf60a8110f70cde42051a526021c496542
parentaa1b7fe3a884674848f5f5a8edb4a9ad981fcad2 (diff)
vm/adb: use a more reliable way to reboot devices
-rw-r--r--config/config.go1
-rw-r--r--executor/executor.cc7
-rw-r--r--syz-manager/manager.go4
-rw-r--r--vm/adb/adb.go9
-rw-r--r--vm/vm.go1
5 files changed, 17 insertions, 5 deletions
diff --git a/config/config.go b/config/config.go
index 71412fc68..a4f81ffa0 100644
--- a/config/config.go
+++ b/config/config.go
@@ -199,6 +199,7 @@ func CreateVMConfig(cfg *Config) (*vm.Config, error) {
Cmdline: cfg.Cmdline,
Image: cfg.Image,
Sshkey: cfg.Sshkey,
+ Executor: filepath.Join(cfg.Syzkaller, "bin", "syz-executor"),
ConsoleDev: cfg.ConsoleDev,
Cpu: cfg.Cpu,
Mem: cfg.Mem,
diff --git a/executor/executor.cc b/executor/executor.cc
index f3ab3cde9..2cefbf66c 100644
--- a/executor/executor.cc
+++ b/executor/executor.cc
@@ -131,8 +131,13 @@ void cover_reset(thread_t* th);
uintptr_t cover_read(thread_t* th);
uintptr_t cover_dedup(thread_t* th, uintptr_t n);
-int main()
+int main(int argc, char** argv)
{
+ if (argc == 2 && strcmp(argv[1], "reboot") == 0) {
+ reboot(LINUX_REBOOT_CMD_RESTART);
+ return 0;
+ }
+
if (mmap(&input_data[0], kMaxInput, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, kInFd, 0) != &input_data[0])
fail("mmap of input file failed");
if (mmap(&output_data[0], kMaxOutput, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, kOutFd, 0) != &output_data[0])
diff --git a/syz-manager/manager.go b/syz-manager/manager.go
index edcd04c24..c625e5a96 100644
--- a/syz-manager/manager.go
+++ b/syz-manager/manager.go
@@ -186,12 +186,12 @@ func (mgr *Manager) runInstance(vmCfg *vm.Config, first bool) bool {
logf(0, "failed to setup port forwarding: %v", err)
return false
}
- fuzzerBin, err := inst.Copy(filepath.Join(mgr.cfg.Syzkaller, "bin/syz-fuzzer"))
+ fuzzerBin, err := inst.Copy(filepath.Join(mgr.cfg.Syzkaller, "bin", "syz-fuzzer"))
if err != nil {
logf(0, "failed to copy binary: %v", err)
return false
}
- executorBin, err := inst.Copy(filepath.Join(mgr.cfg.Syzkaller, "bin/syz-executor"))
+ executorBin, err := inst.Copy(filepath.Join(mgr.cfg.Syzkaller, "bin", "syz-executor"))
if err != nil {
logf(0, "failed to copy binary: %v", err)
return false
diff --git a/vm/adb/adb.go b/vm/adb/adb.go
index 5fa3d17dd..5508667c0 100644
--- a/vm/adb/adb.go
+++ b/vm/adb/adb.go
@@ -74,9 +74,14 @@ func (inst *instance) adbOK() error {
}
func (inst *instance) adbReboot() error {
- if _, err := inst.adb("reboot"); err != nil {
- return fmt.Errorf("adb reboot failed: %v", err)
+ // adb reboot episodically hangs, so we use a more reliable way.
+ if _, err := inst.adb("push", inst.cfg.Executor, "/data/syz-executor"); err != nil {
+ return err
}
+ if _, err := inst.adb("shell", "/data/syz-executor", "reboot"); err != nil {
+ return err
+ }
+ time.Sleep(10 * time.Second)
for i := 0; i < 300; i++ {
time.Sleep(time.Second)
if inst.adbOK() == nil {
diff --git a/vm/vm.go b/vm/vm.go
index a3b077fd6..8ac190264 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -37,6 +37,7 @@ type Config struct {
Cmdline string
Image string
Sshkey string
+ Executor string
ConsoleDev string
Cpu int
Mem int