func main() { os.Args = append(append([]string{}, os.Args[0], "-v=10"), os.Args[1:]...) flag.Parse() cfg, _, err := config.Parse(*flagConfig) if err != nil { Fatalf("%v", err) } if *flagCount > 0 { cfg.Count = *flagCount } if cfg.Count > 4 { cfg.Count = 4 } if len(flag.Args()) != 1 { Fatalf("usage: syz-repro -config=config.file execution.log") } data, err := ioutil.ReadFile(flag.Args()[0]) if err != nil { Fatalf("failed to open log file: %v", err) } vmIndexes := make([]int, cfg.Count) for i := range vmIndexes { vmIndexes[i] = i } go func() { c := make(chan os.Signal, 2) signal.Notify(c, syscall.SIGINT) <-c close(vm.Shutdown) Logf(-1, "shutting down...") <-c Fatalf("terminating") }() res, err := repro.Run(data, cfg, vmIndexes) if err != nil { Logf(0, "reproduction failed: %v", err) } if res == nil { return } fmt.Printf("opts: %+v crepro: %v\n\n", res.Opts, res.CRepro) fmt.Printf("%s\n", res.Prog.Serialize()) if res.CRepro { src, err := csource.Write(res.Prog, res.Opts) if err != nil { Fatalf("failed to generate C repro: %v", err) } if formatted, err := csource.Format(src); err == nil { src = formatted } fmt.Printf("%s\n", src) } }
func main() { flag.Parse() cfg, syscalls, suppressions, err := config.Parse(*flagConfig) if err != nil { fatalf("%v", err) } if *flagDebug { cfg.Debug = true cfg.Count = 1 } RunManager(cfg, syscalls, suppressions) }
func main() { flag.Parse() EnableLogCaching(1000, 1<<20) cfg, syscalls, suppressions, err := config.Parse(*flagConfig) if err != nil { Fatalf("%v", err) } if *flagDebug { cfg.Debug = true cfg.Count = 1 } initAllCover(cfg.Vmlinux) RunManager(cfg, syscalls, suppressions) }
func main() { flag.Parse() cfg, _, err := config.Parse(*flagConfig) if err != nil { Fatalf("%v", err) } if len(flag.Args()) != 1 { Fatalf("usage: syz-crush -config=config.file execution.log") } Logf(0, "booting test machines...") var shutdown uint32 var wg sync.WaitGroup wg.Add(cfg.Count + 1) for i := 0; i < cfg.Count; i++ { i := i go func() { defer wg.Done() for { vmCfg, err := config.CreateVMConfig(cfg, i) if atomic.LoadUint32(&shutdown) != 0 { break } if err != nil { Fatalf("failed to create VM config: %v", err) } runInstance(cfg, vmCfg) if atomic.LoadUint32(&shutdown) != 0 { break } } }() } go func() { c := make(chan os.Signal, 2) signal.Notify(c, syscall.SIGINT) <-c wg.Done() atomic.StoreUint32(&shutdown, 1) close(vm.Shutdown) Logf(-1, "shutting down...") atomic.StoreUint32(&shutdown, 1) <-c Fatalf("terminating") }() wg.Wait() }
func main() { flag.Parse() cfg, _, _, err := config.Parse(*flagConfig) if err != nil { log.Fatalf("%v", err) } if *flagCount > 0 { cfg.Count = *flagCount } if len(flag.Args()) != 1 { log.Fatalf("usage: syz-repro -config=config.file execution.log") } data, err := ioutil.ReadFile(flag.Args()[0]) if err != nil { log.Fatalf("failed to open log file: %v", err) } entries := prog.ParseLog(data) log.Printf("parsed %v programs", len(entries)) crashLoc := vm.CrashRe.FindIndex(data) if crashLoc == nil { log.Fatalf("can't find crash message in the log") } log.Printf("target crash: '%s'", data[crashLoc[0]:crashLoc[1]]) instances = make(chan VM, cfg.Count) bootRequests = make(chan bool, cfg.Count) for i := 0; i < cfg.Count; i++ { bootRequests <- true go func() { for range bootRequests { vmCfg, err := config.CreateVMConfig(cfg) if err != nil { log.Fatalf("failed to create VM config: %v", err) } inst, err := vm.Create(cfg.Type, vmCfg) if err != nil { log.Fatalf("failed to create VM: %v", err) } execprogBin, err := inst.Copy(filepath.Join(cfg.Syzkaller, "bin/syz-execprog")) if err != nil { log.Fatalf("failed to copy to VM: %v", err) } executorBin, err := inst.Copy(filepath.Join(cfg.Syzkaller, "bin/syz-executor")) if err != nil { log.Fatalf("failed to copy to VM: %v", err) } instances <- VM{inst, execprogBin, executorBin} } }() } repro(cfg, entries, crashLoc) for { select { case inst := <-instances: inst.Close() default: return } } }
func main() { flag.Parse() cfg, _, _, err := config.Parse(*flagConfig) if err != nil { Fatalf("%v", err) } if *flagCount > 0 { cfg.Count = *flagCount } if _, err := os.Stat(filepath.Join(cfg.Syzkaller, "bin/syz-execprog")); err != nil { Fatalf("bin/syz-execprog is missing (run 'make execprog')") } if len(flag.Args()) != 1 { Fatalf("usage: syz-repro -config=config.file execution.log") } data, err := ioutil.ReadFile(flag.Args()[0]) if err != nil { Fatalf("failed to open log file: %v", err) } entries := prog.ParseLog(data) Logf(0, "parsed %v programs", len(entries)) crashDesc, _, crashStart, _ := report.Parse(data) if crashDesc == "" { crashStart = len(data) // assuming VM hanged } instances = make(chan VM, cfg.Count) bootRequests = make(chan int, cfg.Count) for i := 0; i < cfg.Count; i++ { bootRequests <- i go func() { for index := range bootRequests { vmCfg, err := config.CreateVMConfig(cfg, index) if err != nil { Fatalf("failed to create VM config: %v", err) } inst, err := vm.Create(cfg.Type, vmCfg) if err != nil { Fatalf("failed to create VM: %v", err) } execprogBin, err := inst.Copy(filepath.Join(cfg.Syzkaller, "bin/syz-execprog")) if err != nil { Fatalf("failed to copy to VM: %v", err) } executorBin, err := inst.Copy(filepath.Join(cfg.Syzkaller, "bin/syz-executor")) if err != nil { Fatalf("failed to copy to VM: %v", err) } instances <- VM{inst, index, execprogBin, executorBin} } }() } go func() { c := make(chan os.Signal, 2) signal.Notify(c, syscall.SIGINT) <-c close(shutdown) Logf(-1, "shutting down...") <-c Fatalf("terminating") }() repro(cfg, entries, crashStart) exit() }