mirror of
https://github.com/reactos/syzkaller.git
synced 2024-11-24 03:49:45 +00:00
sys/netbsd: add support for fault injection (#1817)
This commit is contained in:
parent
1ffa7b1e77
commit
0f23e882fa
@ -221,7 +221,7 @@ static void remove_dir(const char* dir)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !GOOS_linux
|
||||
#if !GOOS_linux && !GOOS_netbsd
|
||||
#if SYZ_EXECUTOR
|
||||
static int inject_fault(int nth)
|
||||
{
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#if GOOS_netbsd
|
||||
|
||||
#if SYZ_EXECUTOR || __NR_syz_usb_connect
|
||||
#include "common_usb_netbsd.h"
|
||||
#endif
|
||||
@ -22,6 +23,54 @@ static void setup_usb(void)
|
||||
fail("failed to chmod /dev/vhci");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SYZ_EXECUTOR || SYZ_FAULT
|
||||
#include <fcntl.h>
|
||||
#include <sys/fault.h>
|
||||
static void setup_fault(void)
|
||||
{
|
||||
if (chmod("/dev/fault", 0666))
|
||||
fail("failed to chmod /dev/fault");
|
||||
}
|
||||
static int inject_fault(int nth)
|
||||
{
|
||||
struct fault_ioc_enable en;
|
||||
int fd;
|
||||
|
||||
fd = open("/dev/fault", O_RDWR);
|
||||
if (fd == -1)
|
||||
fail("failed to open /dev/fault");
|
||||
|
||||
en.scope = FAULT_SCOPE_LWP;
|
||||
en.mode = FAULT_MODE_NTH;
|
||||
en.nth = nth;
|
||||
if (ioctl(fd, FAULT_IOC_ENABLE, &en) != 0)
|
||||
fail("FAULT_IOC_ENABLE failed with nth=%d", nth);
|
||||
|
||||
return fd;
|
||||
}
|
||||
#endif
|
||||
#if SYZ_EXECUTOR
|
||||
static int fault_injected(int fd)
|
||||
{
|
||||
struct fault_ioc_getinfo info;
|
||||
struct fault_ioc_disable dis;
|
||||
int res;
|
||||
|
||||
if (ioctl(fd, FAULT_IOC_GETINFO, &info) != 0)
|
||||
fail("FAULT_IOC_GETINFO failed");
|
||||
res = (info.nfaults > 0);
|
||||
|
||||
dis.scope = FAULT_SCOPE_LWP;
|
||||
if (ioctl(fd, FAULT_IOC_DISABLE, &dis) != 0)
|
||||
fail("FAULT_IOC_DISABLE failed");
|
||||
|
||||
close(fd);
|
||||
|
||||
return res;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if GOOS_openbsd
|
||||
|
@ -172,6 +172,7 @@ static bool cover_check(uint64 pc)
|
||||
#define SYZ_HAVE_FEATURES 1
|
||||
static feature_t features[] = {
|
||||
{"usb", setup_usb},
|
||||
{"fault", setup_fault},
|
||||
};
|
||||
|
||||
static void setup_machine(void)
|
||||
|
@ -206,7 +206,7 @@ static void remove_dir(const char* dir)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !GOOS_linux
|
||||
#if !GOOS_linux && !GOOS_netbsd
|
||||
#if SYZ_EXECUTOR
|
||||
static int inject_fault(int nth)
|
||||
{
|
||||
@ -410,6 +410,7 @@ void child()
|
||||
#include <sys/syscall.h>
|
||||
|
||||
#if GOOS_netbsd
|
||||
|
||||
#if SYZ_EXECUTOR || __NR_syz_usb_connect
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
@ -1568,6 +1569,54 @@ static void setup_usb(void)
|
||||
fail("failed to chmod /dev/vhci");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SYZ_EXECUTOR || SYZ_FAULT
|
||||
#include <fcntl.h>
|
||||
#include <sys/fault.h>
|
||||
static void setup_fault(void)
|
||||
{
|
||||
if (chmod("/dev/fault", 0666))
|
||||
fail("failed to chmod /dev/fault");
|
||||
}
|
||||
static int inject_fault(int nth)
|
||||
{
|
||||
struct fault_ioc_enable en;
|
||||
int fd;
|
||||
|
||||
fd = open("/dev/fault", O_RDWR);
|
||||
if (fd == -1)
|
||||
fail("failed to open /dev/fault");
|
||||
|
||||
en.scope = FAULT_SCOPE_LWP;
|
||||
en.mode = FAULT_MODE_NTH;
|
||||
en.nth = nth;
|
||||
if (ioctl(fd, FAULT_IOC_ENABLE, &en) != 0)
|
||||
fail("FAULT_IOC_ENABLE failed with nth=%d", nth);
|
||||
|
||||
return fd;
|
||||
}
|
||||
#endif
|
||||
#if SYZ_EXECUTOR
|
||||
static int fault_injected(int fd)
|
||||
{
|
||||
struct fault_ioc_getinfo info;
|
||||
struct fault_ioc_disable dis;
|
||||
int res;
|
||||
|
||||
if (ioctl(fd, FAULT_IOC_GETINFO, &info) != 0)
|
||||
fail("FAULT_IOC_GETINFO failed");
|
||||
res = (info.nfaults > 0);
|
||||
|
||||
dis.scope = FAULT_SCOPE_LWP;
|
||||
if (ioctl(fd, FAULT_IOC_DISABLE, &dis) != 0)
|
||||
fail("FAULT_IOC_DISABLE failed");
|
||||
|
||||
close(fd);
|
||||
|
||||
return res;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if GOOS_openbsd
|
||||
|
@ -23,6 +23,7 @@ func init() {
|
||||
checkFeature[FeatureComparisons] = unconditionallyEnabled
|
||||
checkFeature[FeatureUSBEmulation] = checkUSBEmulation
|
||||
checkFeature[FeatureExtraCoverage] = checkUSBEmulation
|
||||
checkFeature[FeatureFault] = checkFault
|
||||
}
|
||||
|
||||
func checkUSBEmulation() string {
|
||||
@ -31,3 +32,10 @@ func checkUSBEmulation() string {
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func checkFault() string {
|
||||
if err := osutil.IsAccessible("/dev/fault"); err != nil {
|
||||
return err.Error()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user