diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-09-15 10:15:00 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-09-15 16:02:37 +0200 |
| commit | 539e603206f427ff6549cde661fef0205a4c9034 (patch) | |
| tree | de4cd1db71fc293582ad495f4d8cc16f196c6827 /sys/syz-sysgen | |
| parent | 19f9bc13d374058b83b2712f119bb42559b35c0c (diff) | |
syz-manager, syz-fuzzer, executor: ensure that binaries are consistent
Check that manager/fuzzer/executor are build on the same git revision,
use the same syscall descriptions and the same target arch.
Update #336
Diffstat (limited to 'sys/syz-sysgen')
| -rw-r--r-- | sys/syz-sysgen/sysgen.go | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/sys/syz-sysgen/sysgen.go b/sys/syz-sysgen/sysgen.go index ce88cb539..ea3e3e110 100644 --- a/sys/syz-sysgen/sysgen.go +++ b/sys/syz-sysgen/sysgen.go @@ -21,6 +21,7 @@ import ( "github.com/google/syzkaller/pkg/ast" "github.com/google/syzkaller/pkg/compiler" + "github.com/google/syzkaller/pkg/hash" "github.com/google/syzkaller/pkg/serializer" "github.com/google/syzkaller/prog" "github.com/google/syzkaller/sys" @@ -79,9 +80,11 @@ func main() { sysFile := filepath.Join("sys", OS, job.Target.Arch+".go") out := new(bytes.Buffer) generate(job.Target, prog, consts, out) + rev := hash.String(out.Bytes()) + fmt.Fprintf(out, "const revision_%v = %q\n", job.Target.Arch, rev) writeSource(sysFile, out.Bytes()) - job.ArchData = generateExecutorSyscalls(job.Target, prog.Syscalls) + job.ArchData = generateExecutorSyscalls(job.Target, prog.Syscalls, rev) job.OK = true }() } @@ -132,8 +135,8 @@ func generate(target *sys.Target, prg *compiler.Prog, consts map[string]uint64, fmt.Fprintf(out, "import . \"github.com/google/syzkaller/prog\"\n\n") fmt.Fprintf(out, "func init() {\n") - fmt.Fprintf(out, "\tinitArch(syscalls_%v, resources_%v, structDescs_%v, consts_%v, %q, %v)\n", - target.Arch, target.Arch, target.Arch, target.Arch, target.Arch, target.PtrSize) + fmt.Fprintf(out, "\tinitArch(revision_%v, syscalls_%v, resources_%v, structDescs_%v, consts_%v, %q, %v)\n", + target.Arch, target.Arch, target.Arch, target.Arch, target.Arch, target.Arch, target.PtrSize) fmt.Fprintf(out, "}\n\n") fmt.Fprintf(out, "var resources_%v = ", target.Arch) @@ -157,21 +160,25 @@ func generate(target *sys.Target, prg *compiler.Prog, consts map[string]uint64, }) fmt.Fprintf(out, "var consts_%v = ", target.Arch) serializer.Write(out, constArr) - fmt.Fprintf(out, "\n") + fmt.Fprintf(out, "\n\n") } -func generateExecutorSyscalls(target *sys.Target, syscalls []*prog.Syscall) []byte { +func generateExecutorSyscalls(target *sys.Target, syscalls []*prog.Syscall, rev string) []byte { type SyscallData struct { Name string NR int32 } type ArchData struct { - CARCH []string - Calls []SyscallData - Fake []SyscallData + Revision string + GOARCH string + CARCH []string + Calls []SyscallData + Fake []SyscallData } data := ArchData{ - CARCH: target.CArch, + Revision: rev, + GOARCH: target.Arch, + CARCH: target.CArch, } fake := make(map[string]uint64) for _, c := range syscalls { @@ -247,6 +254,8 @@ struct call_t { var archTempl = template.Must(template.New("").Parse(` #if {{range $cdef := $.CARCH}}defined({{$cdef}}) || {{end}}0 +#define GOARCH "{{.GOARCH}}" +#define SYZ_REVISION "{{.Revision}}" {{range $c := $.Fake}}#define __NR_{{$c.Name}} {{$c.NR}} {{end}} static call_t syscalls[] = { |
