blob: c3ebf9f8569bdf6025dbb574d917992fb703162b [file] [log] [blame]
// Copyright 2017 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.
package main
import (
"net"
"github.com/google/syzkaller/pkg/host"
"github.com/google/syzkaller/pkg/ipc"
. "github.com/google/syzkaller/pkg/log"
"github.com/google/syzkaller/pkg/osutil"
"github.com/google/syzkaller/prog"
)
func testImage(hostAddr string, target *prog.Target) {
Logf(0, "connecting to host at %v", hostAddr)
conn, err := net.Dial("tcp", hostAddr)
if err != nil {
Fatalf("failed to connect: %v", err)
}
conn.Close()
Logf(0, "checking config...")
config, err := ipc.DefaultConfig()
if err != nil {
Fatalf("failed to create ipc config: %v", err)
}
if kcov, _ := checkCompsSupported(); !kcov && config.Flags&ipc.FlagSignal != 0 {
Fatalf("coverage is not supported by kernel")
}
if config.Flags&ipc.FlagSandboxNamespace != 0 && !osutil.IsExist("/proc/self/ns/user") {
Fatalf("/proc/self/ns/user is not present for namespace sandbox")
}
calls, err := host.DetectSupportedSyscalls(target)
if err != nil {
Fatalf("failed to detect supported syscalls: %v", err)
}
calls = target.TransitivelyEnabledCalls(calls)
Logf(0, "enabled syscalls: %v", len(calls))
if calls[target.SyscallMap["syz_emit_ethernet"]] ||
calls[target.SyscallMap["syz_extract_tcp_res"]] {
config.Flags |= ipc.FlagEnableTun
}
Logf(0, "testing simple program...")
env, err := ipc.MakeEnv(*flagExecutor, 0, config)
if err != nil {
Fatalf("failed to create ipc env: %v", err)
}
p := target.GenerateSimpleProg()
opts := &ipc.ExecOpts{}
output, info, failed, hanged, err := env.Exec(opts, p)
if err != nil {
Fatalf("execution failed: %v\n%s", err, output)
}
if hanged {
Fatalf("program hanged:\n%s", output)
}
if failed {
Fatalf("program failed:\n%s", output)
}
if len(info) == 0 {
Fatalf("no calls executed:\n%s", output)
}
if info[0].Errno != 0 {
Fatalf("simple call failed: %v\n%s", info[0].Errno, output)
}
if config.Flags&ipc.FlagSignal != 0 && len(info[0].Signal) == 0 {
Fatalf("got no coverage:\n%s", output)
}
}