// Copyright 2015 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. // +build linux package host import ( "runtime" "syscall" "testing" "github.com/google/syzkaller/prog" _ "github.com/google/syzkaller/sys" ) func TestLog(t *testing.T) { t.Parallel() target, err := prog.GetTarget("linux", runtime.GOARCH) if err != nil { t.Fatal(err) } // Dump for manual inspection. supp, err := DetectSupportedSyscalls(target) if err != nil { t.Skipf("skipping: %v", err) } t.Logf("unsupported:") for _, c := range target.Syscalls { s, ok := supp[c] if ok && !s { t.Fatalf("map contains false value") } if !s { t.Logf("\t%v", c.Name) } } trans := target.TransitivelyEnabledCalls(supp) t.Logf("transitively unsupported:") for _, c := range target.Syscalls { s, ok := trans[c] if ok && !s { t.Fatalf("map contains false value") } if !s && supp[c] { t.Logf("\t%v", c.Name) } } } func TestSupportedSyscalls(t *testing.T) { t.Parallel() target, err := prog.GetTarget("linux", runtime.GOARCH) if err != nil { t.Fatal(err) } supp, err := DetectSupportedSyscalls(target) if err != nil { t.Skipf("skipping: %v", err) } // These are safe to execute with invalid arguments. safe := []string{ "memfd_create", "sendfile", "bpf$MAP_CREATE", "open", "openat", "read", "write", "stat", } for _, name := range safe { c := target.SyscallMap[name] if c == nil { t.Fatalf("can't find syscall '%v'", name) } a := ^uintptr(0) - 4097 // hopefully invalid _, _, err := syscall.Syscall6(uintptr(c.NR), a, a, a, a, a, a) if err == 0 { t.Fatalf("%v did not fail", name) } if ok := err != syscall.ENOSYS; ok != supp[c] { t.Fatalf("syscall %v: perse=%v kallsyms=%v", name, ok, supp[c]) } } }