sys/netbsd: add support for fault injection (#1817)

This commit is contained in:
m00nbsd 2020-06-11 23:16:52 +02:00 committed by GitHub
parent 1ffa7b1e77
commit 0f23e882fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 109 additions and 2 deletions

View File

@ -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)
{

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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 ""
}