// WARNING: locking bug in try_to_grab_pending
// https://syzkaller.appspot.com/bug?id=86c7f0dd3bfa4cd651bb37a04da2cfcabd860225
// status:open
// autogenerated by syzkaller (https://github.com/google/syzkaller)

#define _GNU_SOURCE

#include <arpa/inet.h>
#include <dirent.h>
#include <endian.h>
#include <errno.h>
#include <fcntl.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <netinet/in.h>
#include <pthread.h>
#include <sched.h>
#include <setjmp.h>
#include <signal.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mount.h>
#include <sys/prctl.h>
#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>

#include <linux/futex.h>
#include <linux/genetlink.h>
#include <linux/if_addr.h>
#include <linux/if_ether.h>
#include <linux/if_link.h>
#include <linux/if_tun.h>
#include <linux/in6.h>
#include <linux/ip.h>
#include <linux/neighbour.h>
#include <linux/net.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/tcp.h>
#include <linux/veth.h>

unsigned long long procid;

static __thread int skip_segv;
static __thread jmp_buf segv_env;

static void segv_handler(int sig, siginfo_t* info, void* ctx)
{
  uintptr_t addr = (uintptr_t)info->si_addr;
  const uintptr_t prog_start = 1 << 20;
  const uintptr_t prog_end = 100 << 20;
  if (__atomic_load_n(&skip_segv, __ATOMIC_RELAXED) &&
      (addr < prog_start || addr > prog_end)) {
    _longjmp(segv_env, 1);
  }
  exit(sig);
}

static void install_segv_handler(void)
{
  struct sigaction sa;
  memset(&sa, 0, sizeof(sa));
  sa.sa_handler = SIG_IGN;
  syscall(SYS_rt_sigaction, 0x20, &sa, NULL, 8);
  syscall(SYS_rt_sigaction, 0x21, &sa, NULL, 8);
  memset(&sa, 0, sizeof(sa));
  sa.sa_sigaction = segv_handler;
  sa.sa_flags = SA_NODEFER | SA_SIGINFO;
  sigaction(SIGSEGV, &sa, NULL);
  sigaction(SIGBUS, &sa, NULL);
}

#define NONFAILING(...)                                                        \
  {                                                                            \
    __atomic_fetch_add(&skip_segv, 1, __ATOMIC_SEQ_CST);                       \
    if (_setjmp(segv_env) == 0) {                                              \
      __VA_ARGS__;                                                             \
    }                                                                          \
    __atomic_fetch_sub(&skip_segv, 1, __ATOMIC_SEQ_CST);                       \
  }

static void sleep_ms(uint64_t ms)
{
  usleep(ms * 1000);
}

static uint64_t current_time_ms(void)
{
  struct timespec ts;
  if (clock_gettime(CLOCK_MONOTONIC, &ts))
    exit(1);
  return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
}

static void use_temporary_dir(void)
{
  char tmpdir_template[] = "./syzkaller.XXXXXX";
  char* tmpdir = mkdtemp(tmpdir_template);
  if (!tmpdir)
    exit(1);
  if (chmod(tmpdir, 0777))
    exit(1);
  if (chdir(tmpdir))
    exit(1);
}

static void thread_start(void* (*fn)(void*), void* arg)
{
  pthread_t th;
  pthread_attr_t attr;
  pthread_attr_init(&attr);
  pthread_attr_setstacksize(&attr, 128 << 10);
  int i;
  for (i = 0; i < 100; i++) {
    if (pthread_create(&th, &attr, fn, arg) == 0) {
      pthread_attr_destroy(&attr);
      return;
    }
    if (errno == EAGAIN) {
      usleep(50);
      continue;
    }
    break;
  }
  exit(1);
}

typedef struct {
  int state;
} event_t;

static void event_init(event_t* ev)
{
  ev->state = 0;
}

static void event_reset(event_t* ev)
{
  ev->state = 0;
}

static void event_set(event_t* ev)
{
  if (ev->state)
    exit(1);
  __atomic_store_n(&ev->state, 1, __ATOMIC_RELEASE);
  syscall(SYS_futex, &ev->state, FUTEX_WAKE | FUTEX_PRIVATE_FLAG);
}

static void event_wait(event_t* ev)
{
  while (!__atomic_load_n(&ev->state, __ATOMIC_ACQUIRE))
    syscall(SYS_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, 0);
}

static int event_isset(event_t* ev)
{
  return __atomic_load_n(&ev->state, __ATOMIC_ACQUIRE);
}

static int event_timedwait(event_t* ev, uint64_t timeout)
{
  uint64_t start = current_time_ms();
  uint64_t now = start;
  for (;;) {
    uint64_t remain = timeout - (now - start);
    struct timespec ts;
    ts.tv_sec = remain / 1000;
    ts.tv_nsec = (remain % 1000) * 1000 * 1000;
    syscall(SYS_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, &ts);
    if (__atomic_load_n(&ev->state, __ATOMIC_RELAXED))
      return 1;
    now = current_time_ms();
    if (now - start > timeout)
      return 0;
  }
}

static bool write_file(const char* file, const char* what, ...)
{
  char buf[1024];
  va_list args;
  va_start(args, what);
  vsnprintf(buf, sizeof(buf), what, args);
  va_end(args);
  buf[sizeof(buf) - 1] = 0;
  int len = strlen(buf);
  int fd = open(file, O_WRONLY | O_CLOEXEC);
  if (fd == -1)
    return false;
  if (write(fd, buf, len) != len) {
    int err = errno;
    close(fd);
    errno = err;
    return false;
  }
  close(fd);
  return true;
}

static struct {
  char* pos;
  int nesting;
  struct nlattr* nested[8];
  char buf[1024];
} nlmsg;

static void netlink_init(int typ, int flags, const void* data, int size)
{
  memset(&nlmsg, 0, sizeof(nlmsg));
  struct nlmsghdr* hdr = (struct nlmsghdr*)nlmsg.buf;
  hdr->nlmsg_type = typ;
  hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK | flags;
  memcpy(hdr + 1, data, size);
  nlmsg.pos = (char*)(hdr + 1) + NLMSG_ALIGN(size);
}

static void netlink_attr(int typ, const void* data, int size)
{
  struct nlattr* attr = (struct nlattr*)nlmsg.pos;
  attr->nla_len = sizeof(*attr) + size;
  attr->nla_type = typ;
  memcpy(attr + 1, data, size);
  nlmsg.pos += NLMSG_ALIGN(attr->nla_len);
}

static void netlink_nest(int typ)
{
  struct nlattr* attr = (struct nlattr*)nlmsg.pos;
  attr->nla_type = typ;
  nlmsg.pos += sizeof(*attr);
  nlmsg.nested[nlmsg.nesting++] = attr;
}

static void netlink_done(void)
{
  struct nlattr* attr = nlmsg.nested[--nlmsg.nesting];
  attr->nla_len = nlmsg.pos - (char*)attr;
}

static int netlink_send(int sock)
{
  if (nlmsg.pos > nlmsg.buf + sizeof(nlmsg.buf) || nlmsg.nesting)
    exit(1);
  struct nlmsghdr* hdr = (struct nlmsghdr*)nlmsg.buf;
  hdr->nlmsg_len = nlmsg.pos - nlmsg.buf;
  struct sockaddr_nl addr;
  memset(&addr, 0, sizeof(addr));
  addr.nl_family = AF_NETLINK;
  unsigned n = sendto(sock, nlmsg.buf, hdr->nlmsg_len, 0,
                      (struct sockaddr*)&addr, sizeof(addr));
  if (n != hdr->nlmsg_len)
    exit(1);
  n = recv(sock, nlmsg.buf, sizeof(nlmsg.buf), 0);
  if (n < sizeof(struct nlmsghdr) + sizeof(struct nlmsgerr))
    exit(1);
  if (hdr->nlmsg_type != NLMSG_ERROR)
    exit(1);
  return -((struct nlmsgerr*)(hdr + 1))->error;
}

static void netlink_add_device_impl(const char* type, const char* name)
{
  struct ifinfomsg hdr;
  memset(&hdr, 0, sizeof(hdr));
  netlink_init(RTM_NEWLINK, NLM_F_EXCL | NLM_F_CREATE, &hdr, sizeof(hdr));
  if (name)
    netlink_attr(IFLA_IFNAME, name, strlen(name));
  netlink_nest(IFLA_LINKINFO);
  netlink_attr(IFLA_INFO_KIND, type, strlen(type));
}

static void netlink_add_device(int sock, const char* type, const char* name)
{
  netlink_add_device_impl(type, name);
  netlink_done();
  int err = netlink_send(sock);
  (void)err;
}

static void netlink_add_veth(int sock, const char* name, const char* peer)
{
  netlink_add_device_impl("veth", name);
  netlink_nest(IFLA_INFO_DATA);
  netlink_nest(VETH_INFO_PEER);
  nlmsg.pos += sizeof(struct ifinfomsg);
  netlink_attr(IFLA_IFNAME, peer, strlen(peer));
  netlink_done();
  netlink_done();
  netlink_done();
  int err = netlink_send(sock);
  (void)err;
}

static void netlink_add_hsr(int sock, const char* name, const char* slave1,
                            const char* slave2)
{
  netlink_add_device_impl("hsr", name);
  netlink_nest(IFLA_INFO_DATA);
  int ifindex1 = if_nametoindex(slave1);
  netlink_attr(IFLA_HSR_SLAVE1, &ifindex1, sizeof(ifindex1));
  int ifindex2 = if_nametoindex(slave2);
  netlink_attr(IFLA_HSR_SLAVE2, &ifindex2, sizeof(ifindex2));
  netlink_done();
  netlink_done();
  int err = netlink_send(sock);
  (void)err;
}

static void netlink_device_change(int sock, const char* name, bool up,
                                  const char* master, const void* mac,
                                  int macsize)
{
  struct ifinfomsg hdr;
  memset(&hdr, 0, sizeof(hdr));
  if (up)
    hdr.ifi_flags = hdr.ifi_change = IFF_UP;
  netlink_init(RTM_NEWLINK, 0, &hdr, sizeof(hdr));
  netlink_attr(IFLA_IFNAME, name, strlen(name));
  if (master) {
    int ifindex = if_nametoindex(master);
    netlink_attr(IFLA_MASTER, &ifindex, sizeof(ifindex));
  }
  if (macsize)
    netlink_attr(IFLA_ADDRESS, mac, macsize);
  int err = netlink_send(sock);
  (void)err;
}

static int netlink_add_addr(int sock, const char* dev, const void* addr,
                            int addrsize)
{
  struct ifaddrmsg hdr;
  memset(&hdr, 0, sizeof(hdr));
  hdr.ifa_family = addrsize == 4 ? AF_INET : AF_INET6;
  hdr.ifa_prefixlen = addrsize == 4 ? 24 : 120;
  hdr.ifa_scope = RT_SCOPE_UNIVERSE;
  hdr.ifa_index = if_nametoindex(dev);
  netlink_init(RTM_NEWADDR, NLM_F_CREATE | NLM_F_REPLACE, &hdr, sizeof(hdr));
  netlink_attr(IFA_LOCAL, addr, addrsize);
  netlink_attr(IFA_ADDRESS, addr, addrsize);
  return netlink_send(sock);
}

static void netlink_add_addr4(int sock, const char* dev, const char* addr)
{
  struct in_addr in_addr;
  inet_pton(AF_INET, addr, &in_addr);
  int err = netlink_add_addr(sock, dev, &in_addr, sizeof(in_addr));
  (void)err;
}

static void netlink_add_addr6(int sock, const char* dev, const char* addr)
{
  struct in6_addr in6_addr;
  inet_pton(AF_INET6, addr, &in6_addr);
  int err = netlink_add_addr(sock, dev, &in6_addr, sizeof(in6_addr));
  (void)err;
}

static void netlink_add_neigh(int sock, const char* name, const void* addr,
                              int addrsize, const void* mac, int macsize)
{
  struct ndmsg hdr;
  memset(&hdr, 0, sizeof(hdr));
  hdr.ndm_family = addrsize == 4 ? AF_INET : AF_INET6;
  hdr.ndm_ifindex = if_nametoindex(name);
  hdr.ndm_state = NUD_PERMANENT;
  netlink_init(RTM_NEWNEIGH, NLM_F_EXCL | NLM_F_CREATE, &hdr, sizeof(hdr));
  netlink_attr(NDA_DST, addr, addrsize);
  netlink_attr(NDA_LLADDR, mac, macsize);
  int err = netlink_send(sock);
  (void)err;
}

static int tunfd = -1;
static int tun_frags_enabled;
#define SYZ_TUN_MAX_PACKET_SIZE 1000

#define TUN_IFACE "syz_tun"

#define LOCAL_MAC 0xaaaaaaaaaaaa
#define REMOTE_MAC 0xaaaaaaaaaabb

#define LOCAL_IPV4 "172.20.20.170"
#define REMOTE_IPV4 "172.20.20.187"

#define LOCAL_IPV6 "fe80::aa"
#define REMOTE_IPV6 "fe80::bb"

#define IFF_NAPI 0x0010
#define IFF_NAPI_FRAGS 0x0020

static void initialize_tun(void)
{
  tunfd = open("/dev/net/tun", O_RDWR | O_NONBLOCK);
  if (tunfd == -1) {
    printf("tun: can't open /dev/net/tun: please enable CONFIG_TUN=y\n");
    printf("otherwise fuzzing or reproducing might not work as intended\n");
    return;
  }
  const int kTunFd = 240;
  if (dup2(tunfd, kTunFd) < 0)
    exit(1);
  close(tunfd);
  tunfd = kTunFd;
  struct ifreq ifr;
  memset(&ifr, 0, sizeof(ifr));
  strncpy(ifr.ifr_name, TUN_IFACE, IFNAMSIZ);
  ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_NAPI | IFF_NAPI_FRAGS;
  if (ioctl(tunfd, TUNSETIFF, (void*)&ifr) < 0) {
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
    if (ioctl(tunfd, TUNSETIFF, (void*)&ifr) < 0)
      exit(1);
  }
  if (ioctl(tunfd, TUNGETIFF, (void*)&ifr) < 0)
    exit(1);
  tun_frags_enabled = (ifr.ifr_flags & IFF_NAPI_FRAGS) != 0;
  char sysctl[64];
  sprintf(sysctl, "/proc/sys/net/ipv6/conf/%s/accept_dad", TUN_IFACE);
  write_file(sysctl, "0");
  sprintf(sysctl, "/proc/sys/net/ipv6/conf/%s/router_solicitations", TUN_IFACE);
  write_file(sysctl, "0");
  int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  if (sock == -1)
    exit(1);
  netlink_add_addr4(sock, TUN_IFACE, LOCAL_IPV4);
  netlink_add_addr6(sock, TUN_IFACE, LOCAL_IPV6);
  uint64_t macaddr = REMOTE_MAC;
  struct in_addr in_addr;
  inet_pton(AF_INET, REMOTE_IPV4, &in_addr);
  netlink_add_neigh(sock, TUN_IFACE, &in_addr, sizeof(in_addr), &macaddr,
                    ETH_ALEN);
  struct in6_addr in6_addr;
  inet_pton(AF_INET6, REMOTE_IPV6, &in6_addr);
  netlink_add_neigh(sock, TUN_IFACE, &in6_addr, sizeof(in6_addr), &macaddr,
                    ETH_ALEN);
  macaddr = LOCAL_MAC;
  netlink_device_change(sock, TUN_IFACE, true, 0, &macaddr, ETH_ALEN);
  close(sock);
}

#define DEV_IPV4 "172.20.20.%d"
#define DEV_IPV6 "fe80::%02hx"
#define DEV_MAC 0x00aaaaaaaaaa
static void initialize_netdevices(void)
{
  char netdevsim[16];
  sprintf(netdevsim, "netdevsim%d", (int)procid);
  struct {
    const char* type;
    const char* dev;
  } devtypes[] = {
      {"ip6gretap", "ip6gretap0"}, {"bridge", "bridge0"},
      {"vcan", "vcan0"},           {"bond", "bond0"},
      {"team", "team0"},           {"dummy", "dummy0"},
      {"nlmon", "nlmon0"},         {"caif", "caif0"},
      {"batadv", "batadv0"},       {"vxcan", "vxcan1"},
      {"netdevsim", netdevsim},    {"veth", 0},
  };
  const char* devmasters[] = {"bridge", "bond", "team"};
  struct {
    const char* name;
    int macsize;
    bool noipv6;
  } devices[] = {
      {"lo", ETH_ALEN},
      {"sit0", 0},
      {"bridge0", ETH_ALEN},
      {"vcan0", 0, true},
      {"tunl0", 0},
      {"gre0", 0},
      {"gretap0", ETH_ALEN},
      {"ip_vti0", 0},
      {"ip6_vti0", 0},
      {"ip6tnl0", 0},
      {"ip6gre0", 0},
      {"ip6gretap0", ETH_ALEN},
      {"erspan0", ETH_ALEN},
      {"bond0", ETH_ALEN},
      {"veth0", ETH_ALEN},
      {"veth1", ETH_ALEN},
      {"team0", ETH_ALEN},
      {"veth0_to_bridge", ETH_ALEN},
      {"veth1_to_bridge", ETH_ALEN},
      {"veth0_to_bond", ETH_ALEN},
      {"veth1_to_bond", ETH_ALEN},
      {"veth0_to_team", ETH_ALEN},
      {"veth1_to_team", ETH_ALEN},
      {"veth0_to_hsr", ETH_ALEN},
      {"veth1_to_hsr", ETH_ALEN},
      {"hsr0", 0},
      {"dummy0", ETH_ALEN},
      {"nlmon0", 0},
      {"vxcan1", 0, true},
      {"caif0", ETH_ALEN},
      {"batadv0", ETH_ALEN},
      {netdevsim, ETH_ALEN},
  };
  int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  if (sock == -1)
    exit(1);
  unsigned i;
  for (i = 0; i < sizeof(devtypes) / sizeof(devtypes[0]); i++)
    netlink_add_device(sock, devtypes[i].type, devtypes[i].dev);
  for (i = 0; i < sizeof(devmasters) / (sizeof(devmasters[0])); i++) {
    char master[32], slave0[32], veth0[32], slave1[32], veth1[32];
    sprintf(slave0, "%s_slave_0", devmasters[i]);
    sprintf(veth0, "veth0_to_%s", devmasters[i]);
    netlink_add_veth(sock, slave0, veth0);
    sprintf(slave1, "%s_slave_1", devmasters[i]);
    sprintf(veth1, "veth1_to_%s", devmasters[i]);
    netlink_add_veth(sock, slave1, veth1);
    sprintf(master, "%s0", devmasters[i]);
    netlink_device_change(sock, slave0, false, master, 0, 0);
    netlink_device_change(sock, slave1, false, master, 0, 0);
  }
  netlink_device_change(sock, "bridge_slave_0", true, 0, 0, 0);
  netlink_device_change(sock, "bridge_slave_1", true, 0, 0, 0);
  netlink_add_veth(sock, "hsr_slave_0", "veth0_to_hsr");
  netlink_add_veth(sock, "hsr_slave_1", "veth1_to_hsr");
  netlink_add_hsr(sock, "hsr0", "hsr_slave_0", "hsr_slave_1");
  netlink_device_change(sock, "hsr_slave_0", true, 0, 0, 0);
  netlink_device_change(sock, "hsr_slave_1", true, 0, 0, 0);
  for (i = 0; i < sizeof(devices) / (sizeof(devices[0])); i++) {
    char addr[32];
    sprintf(addr, DEV_IPV4, i + 10);
    netlink_add_addr4(sock, devices[i].name, addr);
    if (!devices[i].noipv6) {
      sprintf(addr, DEV_IPV6, i + 10);
      netlink_add_addr6(sock, devices[i].name, addr);
    }
    uint64_t macaddr = DEV_MAC + ((i + 10ull) << 40);
    netlink_device_change(sock, devices[i].name, true, 0, &macaddr,
                          devices[i].macsize);
  }
  close(sock);
}
static void initialize_netdevices_init(void)
{
  int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  if (sock == -1)
    exit(1);
  struct {
    const char* type;
    int macsize;
    bool noipv6;
    bool noup;
  } devtypes[] = {
      {"nr", 7, true},
      {"rose", 5, true, true},
  };
  unsigned i;
  for (i = 0; i < sizeof(devtypes) / sizeof(devtypes[0]); i++) {
    char dev[32], addr[32];
    sprintf(dev, "%s%d", devtypes[i].type, (int)procid);
    sprintf(addr, "172.30.%d.%d", i, (int)procid + 1);
    netlink_add_addr4(sock, dev, addr);
    if (!devtypes[i].noipv6) {
      sprintf(addr, "fe88::%02hx:%02hx", i, (int)procid + 1);
      netlink_add_addr6(sock, dev, addr);
    }
    int macsize = devtypes[i].macsize;
    uint64_t macaddr = 0xbbbbbb +
                       ((unsigned long long)i << (8 * (macsize - 2))) +
                       (procid << (8 * (macsize - 1)));
    netlink_device_change(sock, dev, !devtypes[i].noup, 0, &macaddr, macsize);
  }
  close(sock);
}

static int read_tun(char* data, int size)
{
  if (tunfd < 0)
    return -1;
  int rv = read(tunfd, data, size);
  if (rv < 0) {
    if (errno == EAGAIN)
      return -1;
    if (errno == EBADFD)
      return -1;
    exit(1);
  }
  return rv;
}

#define MAX_FRAGS 4
struct vnet_fragmentation {
  uint32_t full;
  uint32_t count;
  uint32_t frags[MAX_FRAGS];
};

static long syz_emit_ethernet(long a0, long a1, long a2)
{
  if (tunfd < 0)
    return (uintptr_t)-1;
  uint32_t length = a0;
  char* data = (char*)a1;
  struct vnet_fragmentation* frags = (struct vnet_fragmentation*)a2;
  struct iovec vecs[MAX_FRAGS + 1];
  uint32_t nfrags = 0;
  if (!tun_frags_enabled || frags == NULL) {
    vecs[nfrags].iov_base = data;
    vecs[nfrags].iov_len = length;
    nfrags++;
  } else {
    bool full = true;
    uint32_t i, count = 0;
    NONFAILING(full = frags->full);
    NONFAILING(count = frags->count);
    if (count > MAX_FRAGS)
      count = MAX_FRAGS;
    for (i = 0; i < count && length != 0; i++) {
      uint32_t size = 0;
      NONFAILING(size = frags->frags[i]);
      if (size > length)
        size = length;
      vecs[nfrags].iov_base = data;
      vecs[nfrags].iov_len = size;
      nfrags++;
      data += size;
      length -= size;
    }
    if (length != 0 && (full || nfrags == 0)) {
      vecs[nfrags].iov_base = data;
      vecs[nfrags].iov_len = length;
      nfrags++;
    }
  }
  return writev(tunfd, vecs, nfrags);
}

static void flush_tun()
{
  char data[SYZ_TUN_MAX_PACKET_SIZE];
  while (read_tun(&data[0], sizeof(data)) != -1) {
  }
}

static long syz_genetlink_get_family_id(long name)
{
  char buf[512] = {0};
  struct nlmsghdr* hdr = (struct nlmsghdr*)buf;
  struct genlmsghdr* genlhdr = (struct genlmsghdr*)NLMSG_DATA(hdr);
  struct nlattr* attr = (struct nlattr*)(genlhdr + 1);
  hdr->nlmsg_len =
      sizeof(*hdr) + sizeof(*genlhdr) + sizeof(*attr) + GENL_NAMSIZ;
  hdr->nlmsg_type = GENL_ID_CTRL;
  hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
  genlhdr->cmd = CTRL_CMD_GETFAMILY;
  attr->nla_type = CTRL_ATTR_FAMILY_NAME;
  attr->nla_len = sizeof(*attr) + GENL_NAMSIZ;
  NONFAILING(strncpy((char*)(attr + 1), (char*)name, GENL_NAMSIZ));
  struct iovec iov = {hdr, hdr->nlmsg_len};
  struct sockaddr_nl addr = {0};
  addr.nl_family = AF_NETLINK;
  int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC);
  if (fd == -1) {
    return -1;
  }
  struct msghdr msg = {&addr, sizeof(addr), &iov, 1, NULL, 0, 0};
  if (sendmsg(fd, &msg, 0) == -1) {
    close(fd);
    return -1;
  }
  ssize_t n = recv(fd, buf, sizeof(buf), 0);
  close(fd);
  if (n <= 0) {
    return -1;
  }
  if (hdr->nlmsg_type != GENL_ID_CTRL) {
    return -1;
  }
  for (; (char*)attr < buf + n;
       attr = (struct nlattr*)((char*)attr + NLMSG_ALIGN(attr->nla_len))) {
    if (attr->nla_type == CTRL_ATTR_FAMILY_ID)
      return *(uint16_t*)(attr + 1);
  }
  return -1;
}

#define XT_TABLE_SIZE 1536
#define XT_MAX_ENTRIES 10

struct xt_counters {
  uint64_t pcnt, bcnt;
};

struct ipt_getinfo {
  char name[32];
  unsigned int valid_hooks;
  unsigned int hook_entry[5];
  unsigned int underflow[5];
  unsigned int num_entries;
  unsigned int size;
};

struct ipt_get_entries {
  char name[32];
  unsigned int size;
  void* entrytable[XT_TABLE_SIZE / sizeof(void*)];
};

struct ipt_replace {
  char name[32];
  unsigned int valid_hooks;
  unsigned int num_entries;
  unsigned int size;
  unsigned int hook_entry[5];
  unsigned int underflow[5];
  unsigned int num_counters;
  struct xt_counters* counters;
  char entrytable[XT_TABLE_SIZE];
};

struct ipt_table_desc {
  const char* name;
  struct ipt_getinfo info;
  struct ipt_replace replace;
};

static struct ipt_table_desc ipv4_tables[] = {
    {.name = "filter"}, {.name = "nat"},      {.name = "mangle"},
    {.name = "raw"},    {.name = "security"},
};

static struct ipt_table_desc ipv6_tables[] = {
    {.name = "filter"}, {.name = "nat"},      {.name = "mangle"},
    {.name = "raw"},    {.name = "security"},
};

#define IPT_BASE_CTL 64
#define IPT_SO_SET_REPLACE (IPT_BASE_CTL)
#define IPT_SO_GET_INFO (IPT_BASE_CTL)
#define IPT_SO_GET_ENTRIES (IPT_BASE_CTL + 1)

struct arpt_getinfo {
  char name[32];
  unsigned int valid_hooks;
  unsigned int hook_entry[3];
  unsigned int underflow[3];
  unsigned int num_entries;
  unsigned int size;
};

struct arpt_get_entries {
  char name[32];
  unsigned int size;
  void* entrytable[XT_TABLE_SIZE / sizeof(void*)];
};

struct arpt_replace {
  char name[32];
  unsigned int valid_hooks;
  unsigned int num_entries;
  unsigned int size;
  unsigned int hook_entry[3];
  unsigned int underflow[3];
  unsigned int num_counters;
  struct xt_counters* counters;
  char entrytable[XT_TABLE_SIZE];
};

struct arpt_table_desc {
  const char* name;
  struct arpt_getinfo info;
  struct arpt_replace replace;
};

static struct arpt_table_desc arpt_tables[] = {
    {.name = "filter"},
};

#define ARPT_BASE_CTL 96
#define ARPT_SO_SET_REPLACE (ARPT_BASE_CTL)
#define ARPT_SO_GET_INFO (ARPT_BASE_CTL)
#define ARPT_SO_GET_ENTRIES (ARPT_BASE_CTL + 1)

static void checkpoint_iptables(struct ipt_table_desc* tables, int num_tables,
                                int family, int level)
{
  struct ipt_get_entries entries;
  socklen_t optlen;
  int fd, i;
  fd = socket(family, SOCK_STREAM, IPPROTO_TCP);
  if (fd == -1) {
    switch (errno) {
    case EAFNOSUPPORT:
    case ENOPROTOOPT:
      return;
    }
    exit(1);
  }
  for (i = 0; i < num_tables; i++) {
    struct ipt_table_desc* table = &tables[i];
    strcpy(table->info.name, table->name);
    strcpy(table->replace.name, table->name);
    optlen = sizeof(table->info);
    if (getsockopt(fd, level, IPT_SO_GET_INFO, &table->info, &optlen)) {
      switch (errno) {
      case EPERM:
      case ENOENT:
      case ENOPROTOOPT:
        continue;
      }
      exit(1);
    }
    if (table->info.size > sizeof(table->replace.entrytable))
      exit(1);
    if (table->info.num_entries > XT_MAX_ENTRIES)
      exit(1);
    memset(&entries, 0, sizeof(entries));
    strcpy(entries.name, table->name);
    entries.size = table->info.size;
    optlen = sizeof(entries) - sizeof(entries.entrytable) + table->info.size;
    if (getsockopt(fd, level, IPT_SO_GET_ENTRIES, &entries, &optlen))
      exit(1);
    table->replace.valid_hooks = table->info.valid_hooks;
    table->replace.num_entries = table->info.num_entries;
    table->replace.size = table->info.size;
    memcpy(table->replace.hook_entry, table->info.hook_entry,
           sizeof(table->replace.hook_entry));
    memcpy(table->replace.underflow, table->info.underflow,
           sizeof(table->replace.underflow));
    memcpy(table->replace.entrytable, entries.entrytable, table->info.size);
  }
  close(fd);
}

static void reset_iptables(struct ipt_table_desc* tables, int num_tables,
                           int family, int level)
{
  struct xt_counters counters[XT_MAX_ENTRIES];
  struct ipt_get_entries entries;
  struct ipt_getinfo info;
  socklen_t optlen;
  int fd, i;
  fd = socket(family, SOCK_STREAM, IPPROTO_TCP);
  if (fd == -1) {
    switch (errno) {
    case EAFNOSUPPORT:
    case ENOPROTOOPT:
      return;
    }
    exit(1);
  }
  for (i = 0; i < num_tables; i++) {
    struct ipt_table_desc* table = &tables[i];
    if (table->info.valid_hooks == 0)
      continue;
    memset(&info, 0, sizeof(info));
    strcpy(info.name, table->name);
    optlen = sizeof(info);
    if (getsockopt(fd, level, IPT_SO_GET_INFO, &info, &optlen))
      exit(1);
    if (memcmp(&table->info, &info, sizeof(table->info)) == 0) {
      memset(&entries, 0, sizeof(entries));
      strcpy(entries.name, table->name);
      entries.size = table->info.size;
      optlen = sizeof(entries) - sizeof(entries.entrytable) + entries.size;
      if (getsockopt(fd, level, IPT_SO_GET_ENTRIES, &entries, &optlen))
        exit(1);
      if (memcmp(table->replace.entrytable, entries.entrytable,
                 table->info.size) == 0)
        continue;
    }
    table->replace.num_counters = info.num_entries;
    table->replace.counters = counters;
    optlen = sizeof(table->replace) - sizeof(table->replace.entrytable) +
             table->replace.size;
    if (setsockopt(fd, level, IPT_SO_SET_REPLACE, &table->replace, optlen))
      exit(1);
  }
  close(fd);
}

static void checkpoint_arptables(void)
{
  struct arpt_get_entries entries;
  socklen_t optlen;
  unsigned i;
  int fd;
  fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (fd == -1) {
    switch (errno) {
    case EAFNOSUPPORT:
    case ENOPROTOOPT:
      return;
    }
    exit(1);
  }
  for (i = 0; i < sizeof(arpt_tables) / sizeof(arpt_tables[0]); i++) {
    struct arpt_table_desc* table = &arpt_tables[i];
    strcpy(table->info.name, table->name);
    strcpy(table->replace.name, table->name);
    optlen = sizeof(table->info);
    if (getsockopt(fd, SOL_IP, ARPT_SO_GET_INFO, &table->info, &optlen)) {
      switch (errno) {
      case EPERM:
      case ENOENT:
      case ENOPROTOOPT:
        continue;
      }
      exit(1);
    }
    if (table->info.size > sizeof(table->replace.entrytable))
      exit(1);
    if (table->info.num_entries > XT_MAX_ENTRIES)
      exit(1);
    memset(&entries, 0, sizeof(entries));
    strcpy(entries.name, table->name);
    entries.size = table->info.size;
    optlen = sizeof(entries) - sizeof(entries.entrytable) + table->info.size;
    if (getsockopt(fd, SOL_IP, ARPT_SO_GET_ENTRIES, &entries, &optlen))
      exit(1);
    table->replace.valid_hooks = table->info.valid_hooks;
    table->replace.num_entries = table->info.num_entries;
    table->replace.size = table->info.size;
    memcpy(table->replace.hook_entry, table->info.hook_entry,
           sizeof(table->replace.hook_entry));
    memcpy(table->replace.underflow, table->info.underflow,
           sizeof(table->replace.underflow));
    memcpy(table->replace.entrytable, entries.entrytable, table->info.size);
  }
  close(fd);
}

static void reset_arptables()
{
  struct xt_counters counters[XT_MAX_ENTRIES];
  struct arpt_get_entries entries;
  struct arpt_getinfo info;
  socklen_t optlen;
  unsigned i;
  int fd;
  fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (fd == -1) {
    switch (errno) {
    case EAFNOSUPPORT:
    case ENOPROTOOPT:
      return;
    }
    exit(1);
  }
  for (i = 0; i < sizeof(arpt_tables) / sizeof(arpt_tables[0]); i++) {
    struct arpt_table_desc* table = &arpt_tables[i];
    if (table->info.valid_hooks == 0)
      continue;
    memset(&info, 0, sizeof(info));
    strcpy(info.name, table->name);
    optlen = sizeof(info);
    if (getsockopt(fd, SOL_IP, ARPT_SO_GET_INFO, &info, &optlen))
      exit(1);
    if (memcmp(&table->info, &info, sizeof(table->info)) == 0) {
      memset(&entries, 0, sizeof(entries));
      strcpy(entries.name, table->name);
      entries.size = table->info.size;
      optlen = sizeof(entries) - sizeof(entries.entrytable) + entries.size;
      if (getsockopt(fd, SOL_IP, ARPT_SO_GET_ENTRIES, &entries, &optlen))
        exit(1);
      if (memcmp(table->replace.entrytable, entries.entrytable,
                 table->info.size) == 0)
        continue;
    } else {
    }
    table->replace.num_counters = info.num_entries;
    table->replace.counters = counters;
    optlen = sizeof(table->replace) - sizeof(table->replace.entrytable) +
             table->replace.size;
    if (setsockopt(fd, SOL_IP, ARPT_SO_SET_REPLACE, &table->replace, optlen))
      exit(1);
  }
  close(fd);
}

#define NF_BR_NUMHOOKS 6
#define EBT_TABLE_MAXNAMELEN 32
#define EBT_CHAIN_MAXNAMELEN 32
#define EBT_BASE_CTL 128
#define EBT_SO_SET_ENTRIES (EBT_BASE_CTL)
#define EBT_SO_GET_INFO (EBT_BASE_CTL)
#define EBT_SO_GET_ENTRIES (EBT_SO_GET_INFO + 1)
#define EBT_SO_GET_INIT_INFO (EBT_SO_GET_ENTRIES + 1)
#define EBT_SO_GET_INIT_ENTRIES (EBT_SO_GET_INIT_INFO + 1)

struct ebt_replace {
  char name[EBT_TABLE_MAXNAMELEN];
  unsigned int valid_hooks;
  unsigned int nentries;
  unsigned int entries_size;
  struct ebt_entries* hook_entry[NF_BR_NUMHOOKS];
  unsigned int num_counters;
  struct ebt_counter* counters;
  char* entries;
};

struct ebt_entries {
  unsigned int distinguisher;
  char name[EBT_CHAIN_MAXNAMELEN];
  unsigned int counter_offset;
  int policy;
  unsigned int nentries;
  char data[0] __attribute__((aligned(__alignof__(struct ebt_replace))));
};

struct ebt_table_desc {
  const char* name;
  struct ebt_replace replace;
  char entrytable[XT_TABLE_SIZE];
};

static struct ebt_table_desc ebt_tables[] = {
    {.name = "filter"},
    {.name = "nat"},
    {.name = "broute"},
};

static void checkpoint_ebtables(void)
{
  socklen_t optlen;
  unsigned i;
  int fd;
  fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (fd == -1) {
    switch (errno) {
    case EAFNOSUPPORT:
    case ENOPROTOOPT:
      return;
    }
    exit(1);
  }
  for (i = 0; i < sizeof(ebt_tables) / sizeof(ebt_tables[0]); i++) {
    struct ebt_table_desc* table = &ebt_tables[i];
    strcpy(table->replace.name, table->name);
    optlen = sizeof(table->replace);
    if (getsockopt(fd, SOL_IP, EBT_SO_GET_INIT_INFO, &table->replace,
                   &optlen)) {
      switch (errno) {
      case EPERM:
      case ENOENT:
      case ENOPROTOOPT:
        continue;
      }
      exit(1);
    }
    if (table->replace.entries_size > sizeof(table->entrytable))
      exit(1);
    table->replace.num_counters = 0;
    table->replace.entries = table->entrytable;
    optlen = sizeof(table->replace) + table->replace.entries_size;
    if (getsockopt(fd, SOL_IP, EBT_SO_GET_INIT_ENTRIES, &table->replace,
                   &optlen))
      exit(1);
  }
  close(fd);
}

static void reset_ebtables()
{
  struct ebt_replace replace;
  char entrytable[XT_TABLE_SIZE];
  socklen_t optlen;
  unsigned i, j, h;
  int fd;
  fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (fd == -1) {
    switch (errno) {
    case EAFNOSUPPORT:
    case ENOPROTOOPT:
      return;
    }
    exit(1);
  }
  for (i = 0; i < sizeof(ebt_tables) / sizeof(ebt_tables[0]); i++) {
    struct ebt_table_desc* table = &ebt_tables[i];
    if (table->replace.valid_hooks == 0)
      continue;
    memset(&replace, 0, sizeof(replace));
    strcpy(replace.name, table->name);
    optlen = sizeof(replace);
    if (getsockopt(fd, SOL_IP, EBT_SO_GET_INFO, &replace, &optlen))
      exit(1);
    replace.num_counters = 0;
    table->replace.entries = 0;
    for (h = 0; h < NF_BR_NUMHOOKS; h++)
      table->replace.hook_entry[h] = 0;
    if (memcmp(&table->replace, &replace, sizeof(table->replace)) == 0) {
      memset(&entrytable, 0, sizeof(entrytable));
      replace.entries = entrytable;
      optlen = sizeof(replace) + replace.entries_size;
      if (getsockopt(fd, SOL_IP, EBT_SO_GET_ENTRIES, &replace, &optlen))
        exit(1);
      if (memcmp(table->entrytable, entrytable, replace.entries_size) == 0)
        continue;
    }
    for (j = 0, h = 0; h < NF_BR_NUMHOOKS; h++) {
      if (table->replace.valid_hooks & (1 << h)) {
        table->replace.hook_entry[h] =
            (struct ebt_entries*)table->entrytable + j;
        j++;
      }
    }
    table->replace.entries = table->entrytable;
    optlen = sizeof(table->replace) + table->replace.entries_size;
    if (setsockopt(fd, SOL_IP, EBT_SO_SET_ENTRIES, &table->replace, optlen))
      exit(1);
  }
  close(fd);
}

static void checkpoint_net_namespace(void)
{
  checkpoint_ebtables();
  checkpoint_arptables();
  checkpoint_iptables(ipv4_tables, sizeof(ipv4_tables) / sizeof(ipv4_tables[0]),
                      AF_INET, SOL_IP);
  checkpoint_iptables(ipv6_tables, sizeof(ipv6_tables) / sizeof(ipv6_tables[0]),
                      AF_INET6, SOL_IPV6);
}

static void reset_net_namespace(void)
{
  reset_ebtables();
  reset_arptables();
  reset_iptables(ipv4_tables, sizeof(ipv4_tables) / sizeof(ipv4_tables[0]),
                 AF_INET, SOL_IP);
  reset_iptables(ipv6_tables, sizeof(ipv6_tables) / sizeof(ipv6_tables[0]),
                 AF_INET6, SOL_IPV6);
}

static void setup_cgroups()
{
  if (mkdir("/syzcgroup", 0777)) {
  }
  if (mkdir("/syzcgroup/unified", 0777)) {
  }
  if (mount("none", "/syzcgroup/unified", "cgroup2", 0, NULL)) {
  }
  if (chmod("/syzcgroup/unified", 0777)) {
  }
  write_file("/syzcgroup/unified/cgroup.subtree_control",
             "+cpu +memory +io +pids +rdma");
  if (mkdir("/syzcgroup/cpu", 0777)) {
  }
  if (mount("none", "/syzcgroup/cpu", "cgroup", 0,
            "cpuset,cpuacct,perf_event,hugetlb")) {
  }
  write_file("/syzcgroup/cpu/cgroup.clone_children", "1");
  if (chmod("/syzcgroup/cpu", 0777)) {
  }
  if (mkdir("/syzcgroup/net", 0777)) {
  }
  if (mount("none", "/syzcgroup/net", "cgroup", 0,
            "net_cls,net_prio,devices,freezer")) {
  }
  if (chmod("/syzcgroup/net", 0777)) {
  }
}
static void setup_binfmt_misc()
{
  if (mount(0, "/proc/sys/fs/binfmt_misc", "binfmt_misc", 0, 0)) {
  }
  write_file("/proc/sys/fs/binfmt_misc/register", ":syz0:M:0:\x01::./file0:");
  write_file("/proc/sys/fs/binfmt_misc/register",
             ":syz1:M:1:\x02::./file0:POC");
}

static void setup_common()
{
  if (mount(0, "/sys/fs/fuse/connections", "fusectl", 0, 0)) {
  }
  setup_cgroups();
  setup_binfmt_misc();
}

static void loop();

static void sandbox_common()
{
  prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
  setpgrp();
  setsid();
  struct rlimit rlim;
  rlim.rlim_cur = rlim.rlim_max = (200 << 20);
  setrlimit(RLIMIT_AS, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 32 << 20;
  setrlimit(RLIMIT_MEMLOCK, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 136 << 20;
  setrlimit(RLIMIT_FSIZE, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 1 << 20;
  setrlimit(RLIMIT_STACK, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 0;
  setrlimit(RLIMIT_CORE, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 256;
  setrlimit(RLIMIT_NOFILE, &rlim);
  if (unshare(CLONE_NEWNS)) {
  }
  if (unshare(CLONE_NEWIPC)) {
  }
  if (unshare(0x02000000)) {
  }
  if (unshare(CLONE_NEWUTS)) {
  }
  if (unshare(CLONE_SYSVSEM)) {
  }
  typedef struct {
    const char* name;
    const char* value;
  } sysctl_t;
  static const sysctl_t sysctls[] = {
      {"/proc/sys/kernel/shmmax", "16777216"},
      {"/proc/sys/kernel/shmall", "536870912"},
      {"/proc/sys/kernel/shmmni", "1024"},
      {"/proc/sys/kernel/msgmax", "8192"},
      {"/proc/sys/kernel/msgmni", "1024"},
      {"/proc/sys/kernel/msgmnb", "1024"},
      {"/proc/sys/kernel/sem", "1024 1048576 500 1024"},
  };
  unsigned i;
  for (i = 0; i < sizeof(sysctls) / sizeof(sysctls[0]); i++)
    write_file(sysctls[i].name, sysctls[i].value);
}

int wait_for_loop(int pid)
{
  if (pid < 0)
    exit(1);
  int status = 0;
  while (waitpid(-1, &status, __WALL) != pid) {
  }
  return WEXITSTATUS(status);
}

static int do_sandbox_none(void)
{
  if (unshare(CLONE_NEWPID)) {
  }
  int pid = fork();
  if (pid != 0)
    return wait_for_loop(pid);
  setup_common();
  sandbox_common();
  initialize_netdevices_init();
  if (unshare(CLONE_NEWNET)) {
  }
  initialize_tun();
  initialize_netdevices();
  loop();
  exit(1);
}

#define FS_IOC_SETFLAGS _IOW('f', 2, long)
static void remove_dir(const char* dir)
{
  DIR* dp;
  struct dirent* ep;
  int iter = 0;
retry:
  while (umount2(dir, MNT_DETACH) == 0) {
  }
  dp = opendir(dir);
  if (dp == NULL) {
    if (errno == EMFILE) {
      exit(1);
    }
    exit(1);
  }
  while ((ep = readdir(dp))) {
    if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0)
      continue;
    char filename[FILENAME_MAX];
    snprintf(filename, sizeof(filename), "%s/%s", dir, ep->d_name);
    while (umount2(filename, MNT_DETACH) == 0) {
    }
    struct stat st;
    if (lstat(filename, &st))
      exit(1);
    if (S_ISDIR(st.st_mode)) {
      remove_dir(filename);
      continue;
    }
    int i;
    for (i = 0;; i++) {
      if (unlink(filename) == 0)
        break;
      if (errno == EPERM) {
        int fd = open(filename, O_RDONLY);
        if (fd != -1) {
          long flags = 0;
          if (ioctl(fd, FS_IOC_SETFLAGS, &flags) == 0)
            close(fd);
          continue;
        }
      }
      if (errno == EROFS) {
        break;
      }
      if (errno != EBUSY || i > 100)
        exit(1);
      if (umount2(filename, MNT_DETACH))
        exit(1);
    }
  }
  closedir(dp);
  int i;
  for (i = 0;; i++) {
    if (rmdir(dir) == 0)
      break;
    if (i < 100) {
      if (errno == EPERM) {
        int fd = open(dir, O_RDONLY);
        if (fd != -1) {
          long flags = 0;
          if (ioctl(fd, FS_IOC_SETFLAGS, &flags) == 0)
            close(fd);
          continue;
        }
      }
      if (errno == EROFS) {
        break;
      }
      if (errno == EBUSY) {
        if (umount2(dir, MNT_DETACH))
          exit(1);
        continue;
      }
      if (errno == ENOTEMPTY) {
        if (iter < 100) {
          iter++;
          goto retry;
        }
      }
    }
    exit(1);
  }
}

static void kill_and_wait(int pid, int* status)
{
  kill(-pid, SIGKILL);
  kill(pid, SIGKILL);
  int i;
  for (i = 0; i < 100; i++) {
    if (waitpid(-1, status, WNOHANG | __WALL) == pid)
      return;
    usleep(1000);
  }
  DIR* dir = opendir("/sys/fs/fuse/connections");
  if (dir) {
    for (;;) {
      struct dirent* ent = readdir(dir);
      if (!ent)
        break;
      if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
        continue;
      char abort[300];
      snprintf(abort, sizeof(abort), "/sys/fs/fuse/connections/%s/abort",
               ent->d_name);
      int fd = open(abort, O_WRONLY);
      if (fd == -1) {
        continue;
      }
      if (write(fd, abort, 1) < 0) {
      }
      close(fd);
    }
    closedir(dir);
  } else {
  }
  while (waitpid(-1, status, __WALL) != pid) {
  }
}

#define SYZ_HAVE_SETUP_LOOP 1
static void setup_loop()
{
  int pid = getpid();
  char cgroupdir[64];
  char file[128];
  snprintf(cgroupdir, sizeof(cgroupdir), "/syzcgroup/unified/syz%llu", procid);
  if (mkdir(cgroupdir, 0777)) {
  }
  snprintf(file, sizeof(file), "%s/pids.max", cgroupdir);
  write_file(file, "32");
  snprintf(file, sizeof(file), "%s/memory.low", cgroupdir);
  write_file(file, "%d", 298 << 20);
  snprintf(file, sizeof(file), "%s/memory.high", cgroupdir);
  write_file(file, "%d", 299 << 20);
  snprintf(file, sizeof(file), "%s/memory.max", cgroupdir);
  write_file(file, "%d", 300 << 20);
  snprintf(file, sizeof(file), "%s/cgroup.procs", cgroupdir);
  write_file(file, "%d", pid);
  snprintf(cgroupdir, sizeof(cgroupdir), "/syzcgroup/cpu/syz%llu", procid);
  if (mkdir(cgroupdir, 0777)) {
  }
  snprintf(file, sizeof(file), "%s/cgroup.procs", cgroupdir);
  write_file(file, "%d", pid);
  snprintf(cgroupdir, sizeof(cgroupdir), "/syzcgroup/net/syz%llu", procid);
  if (mkdir(cgroupdir, 0777)) {
  }
  snprintf(file, sizeof(file), "%s/cgroup.procs", cgroupdir);
  write_file(file, "%d", pid);
  checkpoint_net_namespace();
}

#define SYZ_HAVE_RESET_LOOP 1
static void reset_loop()
{
  reset_net_namespace();
}

#define SYZ_HAVE_SETUP_TEST 1
static void setup_test()
{
  prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
  setpgrp();
  char cgroupdir[64];
  snprintf(cgroupdir, sizeof(cgroupdir), "/syzcgroup/unified/syz%llu", procid);
  if (symlink(cgroupdir, "./cgroup")) {
  }
  snprintf(cgroupdir, sizeof(cgroupdir), "/syzcgroup/cpu/syz%llu", procid);
  if (symlink(cgroupdir, "./cgroup.cpu")) {
  }
  snprintf(cgroupdir, sizeof(cgroupdir), "/syzcgroup/net/syz%llu", procid);
  if (symlink(cgroupdir, "./cgroup.net")) {
  }
  write_file("/proc/self/oom_score_adj", "1000");
  flush_tun();
}

#define SYZ_HAVE_RESET_TEST 1
static void reset_test()
{
  int fd;
  for (fd = 3; fd < 30; fd++)
    close(fd);
}

struct thread_t {
  int created, call;
  event_t ready, done;
};

static struct thread_t threads[16];
static void execute_call(int call);
static int running;

static void* thr(void* arg)
{
  struct thread_t* th = (struct thread_t*)arg;
  for (;;) {
    event_wait(&th->ready);
    event_reset(&th->ready);
    execute_call(th->call);
    __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
    event_set(&th->done);
  }
  return 0;
}

static void execute_one(void)
{
  int i, call, thread;
  int collide = 0;
again:
  for (call = 0; call < 159; call++) {
    for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0]));
         thread++) {
      struct thread_t* th = &threads[thread];
      if (!th->created) {
        th->created = 1;
        event_init(&th->ready);
        event_init(&th->done);
        event_set(&th->done);
        thread_start(thr, th);
      }
      if (!event_isset(&th->done))
        continue;
      event_reset(&th->done);
      th->call = call;
      __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
      event_set(&th->ready);
      if (collide && (call % 2) == 0)
        break;
      event_timedwait(&th->done, 45);
      break;
    }
  }
  for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++)
    sleep_ms(1);
  if (!collide) {
    collide = 1;
    goto again;
  }
}

static void execute_one(void);

#define WAIT_FLAGS __WALL

static void loop(void)
{
  setup_loop();
  int iter;
  for (iter = 0;; iter++) {
    char cwdbuf[32];
    sprintf(cwdbuf, "./%d", iter);
    if (mkdir(cwdbuf, 0777))
      exit(1);
    reset_loop();
    int pid = fork();
    if (pid < 0)
      exit(1);
    if (pid == 0) {
      if (chdir(cwdbuf))
        exit(1);
      setup_test();
      execute_one();
      reset_test();
      exit(0);
    }
    int status = 0;
    uint64_t start = current_time_ms();
    for (;;) {
      if (waitpid(-1, &status, WNOHANG | WAIT_FLAGS) == pid)
        break;
      sleep_ms(1);
      if (current_time_ms() - start < 5 * 1000)
        continue;
      kill_and_wait(pid, &status);
      break;
    }
    remove_dir(cwdbuf);
  }
}

uint64_t r[39] = {0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0x0,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff,
                  0xffffffffffffffff};

void execute_call(int call)
{
  long res;
  switch (call) {
  case 0:
    res = syscall(__NR_socket, 0x11, 3, 0);
    if (res != -1)
      r[0] = res;
    break;
  case 1:
    NONFAILING(*(uint64_t*)0x20000440 = 0x200000c0);
    NONFAILING(*(uint16_t*)0x200000c0 = 0x103);
    NONFAILING(*(uint32_t*)0x200000c4 = 0x14);
    NONFAILING(*(uint32_t*)0x200000c8 = 0);
    NONFAILING(*(uint32_t*)0x200000cc = 0);
    NONFAILING(*(uint32_t*)0x20000448 = 0x80);
    NONFAILING(*(uint64_t*)0x20000450 = 0x20000200);
    NONFAILING(*(uint64_t*)0x20000200 = 0);
    NONFAILING(*(uint64_t*)0x20000208 = 0);
    NONFAILING(*(uint64_t*)0x20000458 = 1);
    NONFAILING(*(uint64_t*)0x20000460 = 0);
    NONFAILING(*(uint64_t*)0x20000468 = 0);
    NONFAILING(*(uint32_t*)0x20000470 = 0);
    syscall(__NR_sendmsg, r[0], 0x20000440, 0);
    break;
  case 2:
    res = syscall(__NR_socket, 0xa, 5, 0x84);
    if (res != -1)
      r[1] = res;
    break;
  case 3:
    NONFAILING(*(uint16_t*)0x200001c0 = 0xff0f);
    NONFAILING(*(uint16_t*)0x200001c2 = 0);
    NONFAILING(*(uint32_t*)0x200001c4 = 0);
    NONFAILING(*(uint32_t*)0x200001c8 = 0);
    NONFAILING(*(uint32_t*)0x200001cc = 0);
    NONFAILING(*(uint32_t*)0x20000200 = 0x10);
    syscall(__NR_getsockopt, r[1], 0x84, 0x7d, 0x200001c0, 0x20000200);
    break;
  case 4:
    NONFAILING(memcpy((void*)0x20000040,
                      "\x0a\xf5\x1f\x02\x3c\x12\x3f\x31\x88\xa0\x70", 11));
    syscall(__NR_ioctl, -1, 0x1000008912, 0x20000040);
    break;
  case 5:
    NONFAILING(*(uint16_t*)0x20000140 = 0x26);
    NONFAILING(memcpy((void*)0x20000142,
                      "hash\000\000\000\000\000\000\000\000\000\000", 14));
    NONFAILING(*(uint32_t*)0x20000150 = 0);
    NONFAILING(*(uint32_t*)0x20000154 = 0);
    NONFAILING(
        memcpy((void*)0x20000158,
               "vmac64(aes-generic)"
               "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
               "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
               "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
               64));
    syscall(__NR_bind, -1, 0x20000140, 0x58);
    break;
  case 6:
    NONFAILING(memcpy(
        (void*)0x20000000,
        "\x28\x54\x74\xda\xe6\xba\xdf\x3a\xb8\x5f\x04\x00\x00\x00\xd2\xeb",
        16));
    syscall(__NR_setsockopt, -1, 0x117, 1, 0x20000000, 0x10);
    break;
  case 7:
    res = syscall(__NR_accept, -1, 0, 0);
    if (res != -1)
      r[2] = res;
    break;
  case 8:
    NONFAILING(*(uint64_t*)0x20000100 = 0);
    NONFAILING(*(uint32_t*)0x20000108 = 0);
    NONFAILING(*(uint64_t*)0x20000110 = 0x200000c0);
    NONFAILING(*(uint64_t*)0x200000c0 = 0x20000080);
    NONFAILING(memcpy(
        (void*)0x20000080,
        "\x37\x38\x4b\xad\x0f\x9a\x26\x5d\xb4\x1f\x24\xc0\xf0\xa5\x7a\xc5\x2e"
        "\x05\x75\x68\x11\xce\x7c\xed\x93\xb1\x00\xc0\x93\x01\xc9\x63",
        32));
    NONFAILING(*(uint64_t*)0x200000c8 = 0x20);
    NONFAILING(*(uint64_t*)0x20000118 = 1);
    NONFAILING(*(uint64_t*)0x20000120 = 0);
    NONFAILING(*(uint64_t*)0x20000128 = 0);
    NONFAILING(*(uint32_t*)0x20000130 = 0);
    syscall(__NR_sendmsg, r[2], 0x20000100, 0x8090);
    break;
  case 9:
    syscall(__NR_sendto, r[2], 0x20000340, 0, 0x8000, 0, 0);
    break;
  case 10:
    NONFAILING(*(uint64_t*)0x20003f00 = 0);
    NONFAILING(*(uint32_t*)0x20003f08 = 0);
    NONFAILING(*(uint64_t*)0x20003f10 = 0);
    NONFAILING(*(uint64_t*)0x20003f18 = 0);
    NONFAILING(*(uint64_t*)0x20003f20 = 0);
    NONFAILING(*(uint64_t*)0x20003f28 = 0);
    NONFAILING(*(uint32_t*)0x20003f30 = 0);
    NONFAILING(*(uint64_t*)0x20003f38 = 0);
    NONFAILING(*(uint32_t*)0x20003f40 = 0);
    NONFAILING(*(uint64_t*)0x20003f48 = 0);
    NONFAILING(*(uint64_t*)0x20003f50 = 0);
    NONFAILING(*(uint64_t*)0x20003f58 = 0);
    NONFAILING(*(uint64_t*)0x20003f60 = 0);
    NONFAILING(*(uint32_t*)0x20003f68 = 0x40);
    syscall(__NR_sendmmsg, r[2], 0x20003f00, 2, 0);
    break;
  case 11:
    res = syscall(__NR_socket, 0xa, 5, 0x84);
    if (res != -1)
      r[3] = res;
    break;
  case 12:
    NONFAILING(*(uint16_t*)0x200001c0 = 0xff0f);
    NONFAILING(*(uint16_t*)0x200001c2 = 0);
    NONFAILING(*(uint32_t*)0x200001c4 = 0);
    NONFAILING(*(uint32_t*)0x200001c8 = 0);
    NONFAILING(*(uint32_t*)0x200001cc = 0);
    NONFAILING(*(uint32_t*)0x20000200 = 0x10);
    syscall(__NR_getsockopt, r[3], 0x84, 0x7d, 0x200001c0, 0x20000200);
    break;
  case 13:
    res = syscall(__NR_socket, 2, 2, 0x88);
    if (res != -1)
      r[4] = res;
    break;
  case 14:
    NONFAILING(memcpy((void*)0x20000040,
                      "\x0a\xf5\x1f\x02\x3c\x12\x3f\x31\x88\xa0\x70", 11));
    syscall(__NR_ioctl, r[4], 0x1000008912, 0x20000040);
    break;
  case 15:
    syscall(__NR_setsockopt, -1, 0x117, 1, 0, 0);
    break;
  case 16:
    res = syscall(__NR_accept, -1, 0, 0);
    if (res != -1)
      r[5] = res;
    break;
  case 17:
    NONFAILING(*(uint64_t*)0x20000100 = 0);
    NONFAILING(*(uint32_t*)0x20000108 = 0);
    NONFAILING(*(uint64_t*)0x20000110 = 0x200000c0);
    NONFAILING(*(uint64_t*)0x200000c0 = 0x20000080);
    NONFAILING(*(uint64_t*)0x200000c8 = 0);
    NONFAILING(*(uint64_t*)0x20000118 = 1);
    NONFAILING(*(uint64_t*)0x20000120 = 0);
    NONFAILING(*(uint64_t*)0x20000128 = 0);
    NONFAILING(*(uint32_t*)0x20000130 = 0);
    syscall(__NR_sendmsg, r[5], 0x20000100, 0x8090);
    break;
  case 18:
    NONFAILING(memcpy(
        (void*)0x20000340,
        "\x4d\xad\x02\x69\x54\xa3\xb3\x11\xff\x38\x4b\x8b\xc4\x6e\x2b\x1a\x13"
        "\x07\x1c\xc8\xb9\xe9\x95\xf3\xa7\x70\xdf\xe7\xe9\xd1\x01\x5b\xe1\xdf"
        "\x34\x3a\x3f\x2c\xf6\xb6\xc6\x80\x3c\x5a\xe5\xa5\xc1\xbd\x8f\x2b\x8b"
        "\x36\x58\x32\xc6\x73\xb7\x1a\x5c\xc7\x1d\x02\x70\x0d\x67\x5a\x68\x6c"
        "\x3d\xab\x35\xa5\xc6\x18\x73\x67\x9f\x5c\x7f\xf8\x48\xac\xbc\x1d\x27"
        "\x5c\xee\xae\x61\xfb\x51\x9d\x0d\x7a\x7d\x33\x25\xee\xa6\x3e\xf6\x68"
        "\xc8\x8e\x33\x97\xcf\x76\x42\xe6\x52\x02\xb9",
        113));
    syscall(__NR_sendto, r[5], 0x20000340, 0x71, 0x8000, 0, 0);
    break;
  case 19:
    NONFAILING(*(uint64_t*)0x20003f00 = 0);
    NONFAILING(*(uint32_t*)0x20003f08 = 0);
    NONFAILING(*(uint64_t*)0x20003f10 = 0);
    NONFAILING(*(uint64_t*)0x20003f18 = 0);
    NONFAILING(*(uint64_t*)0x20003f20 = 0);
    NONFAILING(*(uint64_t*)0x20003f28 = 0);
    NONFAILING(*(uint32_t*)0x20003f30 = 0);
    NONFAILING(*(uint64_t*)0x20003f38 = 0);
    NONFAILING(*(uint32_t*)0x20003f40 = 0);
    NONFAILING(*(uint64_t*)0x20003f48 = 0);
    NONFAILING(*(uint64_t*)0x20003f50 = 0);
    NONFAILING(*(uint64_t*)0x20003f58 = 0);
    NONFAILING(*(uint64_t*)0x20003f60 = 0);
    NONFAILING(*(uint32_t*)0x20003f68 = 0x40);
    syscall(__NR_sendmmsg, r[5], 0x20003f00, 2, 0);
    break;
  case 20:
    syscall(__NR_mmap, 0x20000000, 0xff5000, 4, 0x5c832, -1, 0);
    break;
  case 21:
    NONFAILING(memcpy((void*)0x200000c0, "memory.events\000", 14));
    syscall(__NR_openat, 0xffffff9c, 0x200000c0, 0x26e1, 0);
    break;
  case 22:
    syscall(__NR_ioctl, -1, 0x1000008912, 0x20000040);
    break;
  case 23:
    syscall(__NR_socket, 0xf, 3, 2);
    break;
  case 24:
    res = syscall(__NR_socket, 0xa, 3, 1);
    if (res != -1)
      r[6] = res;
    break;
  case 25:
    NONFAILING(memcpy(
        (void*)0x20000380,
        "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
        16));
    NONFAILING(*(uint8_t*)0x20000390 = 0xfe);
    NONFAILING(*(uint8_t*)0x20000391 = 0x80);
    NONFAILING(*(uint8_t*)0x20000392 = 0);
    NONFAILING(*(uint8_t*)0x20000393 = 0);
    NONFAILING(*(uint8_t*)0x20000394 = 0);
    NONFAILING(*(uint8_t*)0x20000395 = 0);
    NONFAILING(*(uint8_t*)0x20000396 = 0);
    NONFAILING(*(uint8_t*)0x20000397 = 0);
    NONFAILING(*(uint8_t*)0x20000398 = 0);
    NONFAILING(*(uint8_t*)0x20000399 = 0);
    NONFAILING(*(uint8_t*)0x2000039a = 0);
    NONFAILING(*(uint8_t*)0x2000039b = 0);
    NONFAILING(*(uint8_t*)0x2000039c = 0);
    NONFAILING(*(uint8_t*)0x2000039d = 0);
    NONFAILING(*(uint8_t*)0x2000039e = 0);
    NONFAILING(*(uint8_t*)0x2000039f = 0xaa);
    NONFAILING(*(uint16_t*)0x200003a0 = htobe16(0));
    NONFAILING(*(uint16_t*)0x200003a2 = htobe16(0));
    NONFAILING(*(uint16_t*)0x200003a4 = htobe16(0));
    NONFAILING(*(uint16_t*)0x200003a6 = htobe16(0));
    NONFAILING(*(uint16_t*)0x200003a8 = 0xa);
    NONFAILING(*(uint8_t*)0x200003aa = 0);
    NONFAILING(*(uint8_t*)0x200003ab = 0);
    NONFAILING(*(uint8_t*)0x200003ac = 0);
    NONFAILING(*(uint32_t*)0x200003b0 = 0);
    NONFAILING(*(uint32_t*)0x200003b4 = 0);
    NONFAILING(*(uint64_t*)0x200003b8 = 0);
    NONFAILING(*(uint64_t*)0x200003c0 = 0);
    NONFAILING(*(uint64_t*)0x200003c8 = 0);
    NONFAILING(*(uint64_t*)0x200003d0 = 0);
    NONFAILING(*(uint64_t*)0x200003d8 = 0);
    NONFAILING(*(uint64_t*)0x200003e0 = 0);
    NONFAILING(*(uint64_t*)0x200003e8 = 0);
    NONFAILING(*(uint64_t*)0x200003f0 = 0);
    NONFAILING(*(uint64_t*)0x200003f8 = 0);
    NONFAILING(*(uint64_t*)0x20000400 = 0);
    NONFAILING(*(uint64_t*)0x20000408 = 0);
    NONFAILING(*(uint64_t*)0x20000410 = 0);
    NONFAILING(*(uint32_t*)0x20000418 = 0);
    NONFAILING(*(uint32_t*)0x2000041c = 0);
    NONFAILING(*(uint8_t*)0x20000420 = 1);
    NONFAILING(*(uint8_t*)0x20000421 = 0);
    NONFAILING(*(uint8_t*)0x20000422 = 0);
    NONFAILING(*(uint8_t*)0x20000423 = 0);
    NONFAILING(*(uint32_t*)0x20000428 = htobe32(0x7f000001));
    NONFAILING(*(uint32_t*)0x20000438 = htobe32(0));
    NONFAILING(*(uint8_t*)0x2000043c = 0x33);
    NONFAILING(*(uint16_t*)0x20000440 = 0);
    NONFAILING(*(uint8_t*)0x20000444 = 0xfe);
    NONFAILING(*(uint8_t*)0x20000445 = 0x80);
    NONFAILING(*(uint8_t*)0x20000446 = 0);
    NONFAILING(*(uint8_t*)0x20000447 = 0);
    NONFAILING(*(uint8_t*)0x20000448 = 0);
    NONFAILING(*(uint8_t*)0x20000449 = 0);
    NONFAILING(*(uint8_t*)0x2000044a = 0);
    NONFAILING(*(uint8_t*)0x2000044b = 0);
    NONFAILING(*(uint8_t*)0x2000044c = 0);
    NONFAILING(*(uint8_t*)0x2000044d = 0);
    NONFAILING(*(uint8_t*)0x2000044e = 0);
    NONFAILING(*(uint8_t*)0x2000044f = 0);
    NONFAILING(*(uint8_t*)0x20000450 = 0);
    NONFAILING(*(uint8_t*)0x20000451 = 0);
    NONFAILING(*(uint8_t*)0x20000452 = 0);
    NONFAILING(*(uint8_t*)0x20000453 = 0xaa);
    NONFAILING(*(uint32_t*)0x20000454 = 0);
    NONFAILING(*(uint8_t*)0x20000458 = 0);
    NONFAILING(*(uint8_t*)0x20000459 = 0);
    NONFAILING(*(uint8_t*)0x2000045a = 6);
    NONFAILING(*(uint32_t*)0x2000045c = 0);
    NONFAILING(*(uint32_t*)0x20000460 = 0);
    NONFAILING(*(uint32_t*)0x20000464 = 0);
    syscall(__NR_setsockopt, r[6], 0x29, 0x23, 0x20000380, 0xe8);
    break;
  case 26:
    syscall(__NR_connect, r[6], 0, 0);
    break;
  case 27:
    syscall(__NR_sendmmsg, r[6], 0x20007e00, 0xb2, 0);
    break;
  case 28:
    res = syscall(__NR_socket, 0x11, 3, 0);
    if (res != -1)
      r[7] = res;
    break;
  case 29:
    syscall(__NR_sendmsg, r[7], 0, 0);
    break;
  case 30:
    res = syscall(__NR_socket, 0x26, 5, 0);
    if (res != -1)
      r[8] = res;
    break;
  case 31:
    NONFAILING(*(uint16_t*)0x20000140 = 0x26);
    NONFAILING(memcpy((void*)0x20000142,
                      "hash\000\000\000\000\000\000\000\000\000\000", 14));
    NONFAILING(*(uint32_t*)0x20000150 = 0);
    NONFAILING(*(uint32_t*)0x20000154 = 0);
    NONFAILING(
        memcpy((void*)0x20000158,
               "vmac64(aes-generic)"
               "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
               "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
               "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",
               64));
    syscall(__NR_bind, r[8], 0x20000140, 0x58);
    break;
  case 32:
    NONFAILING(memcpy(
        (void*)0x20000000,
        "\x28\x54\x74\xda\xe6\xba\xdf\x3a\xb8\x5f\x04\x00\x00\x00\xd2\xeb",
        16));
    syscall(__NR_setsockopt, r[8], 0x117, 1, 0x20000000, 0x10);
    break;
  case 33:
    res = syscall(__NR_accept, r[8], 0, 0);
    if (res != -1)
      r[9] = res;
    break;
  case 34:
    NONFAILING(*(uint64_t*)0x20000100 = 0);
    NONFAILING(*(uint32_t*)0x20000108 = 0);
    NONFAILING(*(uint64_t*)0x20000110 = 0x200000c0);
    NONFAILING(*(uint64_t*)0x200000c0 = 0x20000080);
    NONFAILING(memcpy(
        (void*)0x20000080,
        "\x37\x38\x4b\xad\x0f\x9a\x26\x5d\xb4\x1f\x24\xc0\xf0\xa5\x7a\xc5\x2e"
        "\x05\x75\x68\x11\xce\x7c\xed\x93\xb1\x00\xc0\x93\x01\xc9\x63",
        32));
    NONFAILING(*(uint64_t*)0x200000c8 = 0x20);
    NONFAILING(*(uint64_t*)0x20000118 = 1);
    NONFAILING(*(uint64_t*)0x20000120 = 0);
    NONFAILING(*(uint64_t*)0x20000128 = 0);
    NONFAILING(*(uint32_t*)0x20000130 = 0);
    syscall(__NR_sendmsg, r[9], 0x20000100, 0x8090);
    break;
  case 35:
    NONFAILING(memcpy(
        (void*)0x20000340,
        "\x4d\xad\x02\x69\x54\xa3\xb3\x11\xff\x38\x4b\x8b\xc4\x6e\x2b\x1a\x13"
        "\x07\x1c\xc8\xb9\xe9\x95\xf3\xa7\x70\xdf\xe7\xe9\xd1\x01\x5b\xe1\xdf"
        "\x34\x3a\x3f\x2c\xf6\xb6\xc6\x80\x3c\x5a\xe5\xa5\xc1\xbd\x8f\x2b\x8b"
        "\x36\x58\x32\xc6\x73\xb7\x1a\x5c\xc7\x1d\x02\x70\x0d\x67\x5a\x68\x6c"
        "\x3d\xab\x35\xa5\xc6\x18\x73\x67\x9f\x5c\x7f\xf8\x48\xac\xbc\x1d\x27"
        "\x5c\xee\xae\x61\xfb\x51\x9d\x0d\x7a\x7d\x33\x25\xee\xa6\x3e\xf6\x68"
        "\xc8\x8e\x33\x97\xcf\x76\x42\xe6\x52\x02\xb9",
        113));
    syscall(__NR_sendto, r[9], 0x20000340, 0x71, 0x8000, 0, 0);
    break;
  case 36:
    syscall(__NR_socket, 2, 2, 0x88);
    break;
  case 37:
    res = syscall(__NR_socket, 0x26, 5, 0);
    if (res != -1)
      r[10] = res;
    break;
  case 38:
    syscall(__NR_setsockopt, r[10], 0x117, 1, 0, 0);
    break;
  case 39:
    syscall(__NR_sendto, -1, 0, 0, 0x8000, 0, 0);
    break;
  case 40:
    res = syscall(__NR_socket, 0x10, 3, 0x10);
    if (res != -1)
      r[11] = res;
    break;
  case 41:
    NONFAILING(memcpy((void*)0x20000040, "TIPCv2\000", 7));
    res = syz_genetlink_get_family_id(0x20000040);
    if (res != -1)
      r[12] = res;
    break;
  case 42:
    NONFAILING(*(uint64_t*)0x20000000 = 0);
    NONFAILING(*(uint32_t*)0x20000008 = 0);
    NONFAILING(*(uint64_t*)0x20000010 = 0x200000c0);
    NONFAILING(*(uint64_t*)0x200000c0 = 0x20000100);
    NONFAILING(*(uint32_t*)0x20000100 = 0x8c);
    NONFAILING(*(uint16_t*)0x20000104 = r[12]);
    NONFAILING(*(uint16_t*)0x20000106 = 1);
    NONFAILING(*(uint32_t*)0x20000108 = 0);
    NONFAILING(*(uint32_t*)0x2000010c = 0);
    NONFAILING(*(uint8_t*)0x20000110 = 3);
    NONFAILING(*(uint8_t*)0x20000111 = 0);
    NONFAILING(*(uint16_t*)0x20000112 = 0);
    NONFAILING(*(uint16_t*)0x20000114 = 0x78);
    NONFAILING(*(uint16_t*)0x20000116 = 1);
    NONFAILING(*(uint16_t*)0x20000118 = 0x38);
    NONFAILING(*(uint16_t*)0x2000011a = 4);
    NONFAILING(*(uint16_t*)0x2000011c = 0x14);
    NONFAILING(*(uint16_t*)0x2000011e = 1);
    NONFAILING(*(uint16_t*)0x20000120 = 2);
    NONFAILING(*(uint16_t*)0x20000122 = htobe16(0x4e23));
    NONFAILING(*(uint32_t*)0x20000124 = htobe32(-1));
    NONFAILING(*(uint16_t*)0x20000130 = 0x20);
    NONFAILING(*(uint16_t*)0x20000132 = 2);
    NONFAILING(*(uint16_t*)0x20000134 = 0xa);
    NONFAILING(*(uint16_t*)0x20000136 = htobe16(0x4e21));
    NONFAILING(*(uint32_t*)0x20000138 = htobe32(0xf51));
    NONFAILING(*(uint8_t*)0x2000013c = -1);
    NONFAILING(*(uint8_t*)0x2000013d = 1);
    NONFAILING(*(uint8_t*)0x2000013e = 0);
    NONFAILING(*(uint8_t*)0x2000013f = 0);
    NONFAILING(*(uint8_t*)0x20000140 = 0);
    NONFAILING(*(uint8_t*)0x20000141 = 0);
    NONFAILING(*(uint8_t*)0x20000142 = 0);
    NONFAILING(*(uint8_t*)0x20000143 = 0);
    NONFAILING(*(uint8_t*)0x20000144 = 0);
    NONFAILING(*(uint8_t*)0x20000145 = 0);
    NONFAILING(*(uint8_t*)0x20000146 = 0);
    NONFAILING(*(uint8_t*)0x20000147 = 0);
    NONFAILING(*(uint8_t*)0x20000148 = 0);
    NONFAILING(*(uint8_t*)0x20000149 = 0);
    NONFAILING(*(uint8_t*)0x2000014a = 0);
    NONFAILING(*(uint8_t*)0x2000014b = 1);
    NONFAILING(*(uint32_t*)0x2000014c = 3);
    NONFAILING(*(uint16_t*)0x20000150 = 0x10);
    NONFAILING(*(uint16_t*)0x20000152 = 1);
    NONFAILING(memcpy((void*)0x20000154, "udp:syz0\000", 9));
    NONFAILING(*(uint16_t*)0x20000160 = 0x2c);
    NONFAILING(*(uint16_t*)0x20000162 = 4);
    NONFAILING(*(uint16_t*)0x20000164 = 0x14);
    NONFAILING(*(uint16_t*)0x20000166 = 1);
    NONFAILING(*(uint16_t*)0x20000168 = 2);
    NONFAILING(*(uint16_t*)0x2000016a = htobe16(0x4e20));
    NONFAILING(*(uint32_t*)0x2000016c = htobe32(0x7f000001));
    NONFAILING(*(uint16_t*)0x20000178 = 0x14);
    NONFAILING(*(uint16_t*)0x2000017a = 2);
    NONFAILING(*(uint16_t*)0x2000017c = 2);
    NONFAILING(*(uint16_t*)0x2000017e = htobe16(0x4e21));
    NONFAILING(*(uint32_t*)0x20000180 = htobe32(0xe0000001));
    NONFAILING(*(uint64_t*)0x200000c8 = 0x8c);
    NONFAILING(*(uint64_t*)0x20000018 = 1);
    NONFAILING(*(uint64_t*)0x20000020 = 0);
    NONFAILING(*(uint64_t*)0x20000028 = 0);
    NONFAILING(*(uint32_t*)0x20000030 = 0);
    syscall(__NR_sendmsg, r[11], 0x20000000, 4);
    break;
  case 43:
    res = syscall(__NR_socketpair, 1, 5, 0, 0x20000180);
    if (res != -1)
      NONFAILING(r[13] = *(uint32_t*)0x20000184);
    break;
  case 44:
    NONFAILING(*(uint16_t*)0x200000c0 = 2);
    NONFAILING(*(uint64_t*)0x200000c8 = 0x20000140);
    NONFAILING(*(uint16_t*)0x20000140 = 0x50);
    NONFAILING(*(uint8_t*)0x20000142 = 0);
    NONFAILING(*(uint8_t*)0x20000143 = 0);
    NONFAILING(*(uint32_t*)0x20000144 = 0x6e17);
    NONFAILING(*(uint16_t*)0x20000148 = 6);
    NONFAILING(*(uint8_t*)0x2000014a = 0);
    NONFAILING(*(uint8_t*)0x2000014b = 0);
    NONFAILING(*(uint32_t*)0x2000014c = 0);
    syscall(__NR_setsockopt, r[13], 1, 0x1a, 0x200000c0, 0x10);
    break;
  case 45:
    syscall(__NR_socket, 0x10, 3, 0x10);
    break;
  case 46:
    NONFAILING(memcpy((void*)0x20000040, "TIPCv2\000", 7));
    syz_genetlink_get_family_id(0x20000040);
    break;
  case 47:
    NONFAILING(memcpy((void*)0x20000040, "TIPCv2\000", 7));
    syz_genetlink_get_family_id(0x20000040);
    break;
  case 48:
    NONFAILING(*(uint64_t*)0x20000000 = 0);
    NONFAILING(*(uint32_t*)0x20000008 = 0);
    NONFAILING(*(uint64_t*)0x20000010 = 0x200000c0);
    NONFAILING(*(uint64_t*)0x200000c0 = 0);
    NONFAILING(*(uint64_t*)0x200000c8 = 0);
    NONFAILING(*(uint64_t*)0x20000018 = 1);
    NONFAILING(*(uint64_t*)0x20000020 = 0);
    NONFAILING(*(uint64_t*)0x20000028 = 0);
    NONFAILING(*(uint32_t*)0x20000030 = 0);
    syscall(__NR_sendmsg, -1, 0x20000000, 4);
    break;
  case 49:
    NONFAILING(*(uint64_t*)0x20002a40 = 0);
    NONFAILING(*(uint32_t*)0x20002a48 = 0);
    NONFAILING(*(uint64_t*)0x20002a50 = 0x20001700);
    NONFAILING(*(uint64_t*)0x20001700 = 0);
    NONFAILING(*(uint64_t*)0x20001708 = 0);
    NONFAILING(*(uint64_t*)0x20002a58 = 1);
    NONFAILING(*(uint64_t*)0x20002a60 = 0);
    NONFAILING(*(uint64_t*)0x20002a68 = 0);
    NONFAILING(*(uint32_t*)0x20002a70 = 0);
    NONFAILING(*(uint32_t*)0x20002a78 = 0);
    syscall(__NR_recvmmsg, -1, 0x20002a40, 1, 0, 0);
    break;
  case 50:
    res = syscall(__NR_socket, 2, 1, 0);
    if (res != -1)
      r[14] = res;
    break;
  case 51:
    NONFAILING(*(uint32_t*)0x200000c0 = 0x25);
    syscall(__NR_getsockopt, r[14], 6, 0, 0x20000080, 0x200000c0);
    break;
  case 52:
    NONFAILING(memcpy((void*)0x20000000, "./cgroup\000", 9));
    res = syscall(__NR_openat, 0xffffffffffffff9c, 0x20000000, 0x200002, 0);
    if (res != -1)
      r[15] = res;
    break;
  case 53:
    res = syscall(__NR_openat, r[15], 0, 2, 0);
    if (res != -1)
      r[16] = res;
    break;
  case 54:
    syscall(__NR_writev, r[16], 0x20000700, 0x1000000000000110);
    break;
  case 55:
    res = syscall(__NR_socket, 0x26, 5, 0);
    if (res != -1)
      r[17] = res;
    break;
  case 56:
    NONFAILING(memcpy(
        (void*)0x20000080,
        "\xb7\xf2\x28\x8a\x91\x19\x93\xf0\x26\x5d\xf5\xcf\x1c\xdd\x8b\x55",
        16));
    syscall(__NR_setsockopt, r[17], 0x117, 1, 0x20000080, 0x10);
    break;
  case 57:
    res = syscall(__NR_accept, r[17], 0, 0);
    if (res != -1)
      r[18] = res;
    break;
  case 58:
    NONFAILING(sprintf((char*)0x20000000, "0x%016llx", (long long)-1));
    syscall(__NR_write, r[18], 0x20000000, 0xff34);
    break;
  case 59:
    NONFAILING(*(uint64_t*)0x20001180 = 0);
    NONFAILING(*(uint32_t*)0x20001188 = 0);
    NONFAILING(*(uint64_t*)0x20001190 = 0x20000640);
    NONFAILING(*(uint64_t*)0x20000640 = 0x200002c0);
    NONFAILING(*(uint64_t*)0x20000648 = 0xfd40);
    NONFAILING(*(uint64_t*)0x20001198 = 1);
    NONFAILING(*(uint64_t*)0x200011a0 = 0);
    NONFAILING(*(uint64_t*)0x200011a8 = 0);
    NONFAILING(*(uint32_t*)0x200011b0 = 0);
    NONFAILING(*(uint32_t*)0x200011b8 = 0);
    syscall(__NR_recvmmsg, r[18], 0x20001180, 1, 0, 0);
    break;
  case 60:
    res = syscall(__NR_socket, 0xa, 2, 0);
    if (res != -1)
      r[19] = res;
    break;
  case 61:
    NONFAILING(*(uint16_t*)0x20000100 = 0xa);
    NONFAILING(*(uint16_t*)0x20000102 = htobe16(0));
    NONFAILING(*(uint32_t*)0x20000104 = htobe32(0));
    NONFAILING(*(uint8_t*)0x20000108 = 0xfe);
    NONFAILING(*(uint8_t*)0x20000109 = 0x80);
    NONFAILING(*(uint8_t*)0x2000010a = 0);
    NONFAILING(*(uint8_t*)0x2000010b = 0);
    NONFAILING(*(uint8_t*)0x2000010c = 0);
    NONFAILING(*(uint8_t*)0x2000010d = 0);
    NONFAILING(*(uint8_t*)0x2000010e = 0);
    NONFAILING(*(uint8_t*)0x2000010f = 0);
    NONFAILING(*(uint8_t*)0x20000110 = 0);
    NONFAILING(*(uint8_t*)0x20000111 = 0);
    NONFAILING(*(uint8_t*)0x20000112 = 0);
    NONFAILING(*(uint8_t*)0x20000113 = 0);
    NONFAILING(*(uint8_t*)0x20000114 = 0);
    NONFAILING(*(uint8_t*)0x20000115 = 0);
    NONFAILING(*(uint8_t*)0x20000116 = 0);
    NONFAILING(*(uint8_t*)0x20000117 = 0);
    NONFAILING(*(uint32_t*)0x20000118 = 4);
    syscall(__NR_connect, r[19], 0x20000100, 0x1c);
    break;
  case 62:
    NONFAILING(*(uint16_t*)0x20000280 = 0xa);
    NONFAILING(*(uint16_t*)0x20000282 = htobe16(0x4e24));
    NONFAILING(*(uint32_t*)0x20000284 = htobe32(0));
    NONFAILING(*(uint8_t*)0x20000288 = 0);
    NONFAILING(*(uint8_t*)0x20000289 = 0);
    NONFAILING(*(uint8_t*)0x2000028a = 0);
    NONFAILING(*(uint8_t*)0x2000028b = 0);
    NONFAILING(*(uint8_t*)0x2000028c = 0);
    NONFAILING(*(uint8_t*)0x2000028d = 0);
    NONFAILING(*(uint8_t*)0x2000028e = 0);
    NONFAILING(*(uint8_t*)0x2000028f = 0);
    NONFAILING(*(uint8_t*)0x20000290 = 0);
    NONFAILING(*(uint8_t*)0x20000291 = 0);
    NONFAILING(*(uint8_t*)0x20000292 = -1);
    NONFAILING(*(uint8_t*)0x20000293 = -1);
    NONFAILING(*(uint32_t*)0x20000294 = htobe32(0xe0000002));
    NONFAILING(*(uint32_t*)0x20000298 = 0);
    syscall(__NR_connect, r[19], 0x20000280, 0x1c);
    break;
  case 63:
    res = syscall(__NR_socket, 2, 1, 0);
    if (res != -1)
      r[20] = res;
    break;
  case 64:
    NONFAILING(*(uint32_t*)0x200000c0 = 0x25);
    syscall(__NR_getsockopt, r[20], 6, 0, 0x20000080, 0x200000c0);
    break;
  case 65:
    NONFAILING(memcpy((void*)0x20000000, "./cgroup\000", 9));
    res = syscall(__NR_openat, 0xffffffffffffff9c, 0x20000000, 0x200002, 0);
    if (res != -1)
      r[21] = res;
    break;
  case 66:
    NONFAILING(memcpy((void*)0x20000040, "memory.high\000", 12));
    syscall(__NR_openat, r[21], 0x20000040, 2, 0);
    break;
  case 67:
    res = syscall(__NR_socket, 0xa, 1, 0x84);
    if (res != -1)
      r[22] = res;
    break;
  case 68:
    NONFAILING(*(uint16_t*)0x20ef8cfd = 0xa);
    NONFAILING(*(uint16_t*)0x20ef8cff = htobe16(0x4e23));
    NONFAILING(*(uint32_t*)0x20ef8d01 = htobe32(0));
    NONFAILING(*(uint64_t*)0x20ef8d05 = htobe64(0));
    NONFAILING(*(uint64_t*)0x20ef8d0d = htobe64(1));
    NONFAILING(*(uint32_t*)0x20ef8d15 = 0);
    syscall(__NR_bind, r[22], 0x20ef8cfd, 0x1c);
    break;
  case 69:
    syscall(__NR_listen, r[22], 5);
    break;
  case 70:
    syscall(__NR_socket, 0xa, 2, 0x88);
    break;
  case 71:
    res = syscall(__NR_socket, 0xa, 3, 0x87);
    if (res != -1)
      r[23] = res;
    break;
  case 72:
    syscall(__NR_socket, 0x10, 3, 6);
    break;
  case 73:
    syscall(__NR_accept, r[23], 0, 0);
    break;
  case 74:
    syscall(__NR_getsockopt, -1, 0x84, 0x20, 0, 0);
    break;
  case 75:
    res = syscall(__NR_socket, 2, 0x4000000000000001, 0);
    if (res != -1)
      r[24] = res;
    break;
  case 76:
    NONFAILING(*(uint16_t*)0x20000000 = 2);
    NONFAILING(*(uint16_t*)0x20000002 = htobe16(0x4e23));
    NONFAILING(*(uint32_t*)0x20000004 = htobe32(0xe0000001));
    syscall(__NR_bind, r[24], 0x20000000, 0x10);
    break;
  case 77:
    syscall(__NR_sendto, r[24], 0, 0, 0x200007fd, 0, 0);
    break;
  case 78:
    syscall(__NR_setsockopt, -1, 1, 0, 0, 0);
    break;
  case 79:
    syscall(__NR_socket, 0x11, 0, 0x300);
    break;
  case 80:
    syscall(__NR_setsockopt, -1, 1, 0x1a, 0, 0);
    break;
  case 81:
    syz_emit_ethernet(0, 0, 0);
    break;
  case 82:
    syscall(__NR_getsockopt, -1, 0x84, 0x1f, 0, 0);
    break;
  case 83:
    syscall(__NR_getsockopt, -1, 0x84, 0x10, 0, 0);
    break;
  case 84:
    syscall(__NR_sendmsg, -1, 0, 0);
    break;
  case 85:
    syscall(__NR_getsockopt, -1, 0x11b, 7, 0, 0);
    break;
  case 86:
    syscall(__NR_sendto, -1, 0, 0, 0, 0, 0);
    break;
  case 87:
    NONFAILING(*(uint64_t*)0x20000240 = 0x20000040);
    NONFAILING(*(uint32_t*)0x20000248 = 0x80);
    NONFAILING(*(uint64_t*)0x20000250 = 0x20000180);
    NONFAILING(*(uint64_t*)0x20000180 = 0x20003ac0);
    NONFAILING(*(uint64_t*)0x20000188 = 0x1000);
    NONFAILING(*(uint64_t*)0x20000258 = 1);
    NONFAILING(*(uint64_t*)0x20000260 = 0);
    NONFAILING(*(uint64_t*)0x20000268 = 0);
    NONFAILING(*(uint32_t*)0x20000270 = 0);
    syscall(__NR_recvmsg, r[24], 0x20000240, 0);
    break;
  case 88:
    syscall(__NR_socket, 0x10, 0, 0);
    break;
  case 89:
    syscall(__NR_sendmsg, -1, 0, 0);
    break;
  case 90:
    NONFAILING(*(uint64_t*)0x20002300 = -1);
    syscall(__NR_write, r[24], 0x20002300, 0x1000001bd);
    break;
  case 91:
    res = syscall(__NR_socket, 0x2b, 1, 0);
    if (res != -1)
      r[25] = res;
    break;
  case 92:
    NONFAILING(*(uint32_t*)0x20000200 = 0);
    NONFAILING(*(uint16_t*)0x20000208 = 2);
    NONFAILING(*(uint16_t*)0x2000020a = htobe16(0));
    NONFAILING(*(uint32_t*)0x2000020c = htobe32(0xe0000002));
    syscall(__NR_setsockopt, r[25], 0, 0x2a, 0x20000200, 0x88);
    break;
  case 93:
    res = syscall(__NR_socket, 0xa, 1, 0x84);
    if (res != -1)
      r[26] = res;
    break;
  case 94:
    NONFAILING(*(uint16_t*)0x20ef8cfd = 0xa);
    NONFAILING(*(uint16_t*)0x20ef8cff = htobe16(0x4e23));
    NONFAILING(*(uint32_t*)0x20ef8d01 = htobe32(0));
    NONFAILING(*(uint64_t*)0x20ef8d05 = htobe64(0));
    NONFAILING(*(uint64_t*)0x20ef8d0d = htobe64(1));
    NONFAILING(*(uint32_t*)0x20ef8d15 = 0);
    syscall(__NR_bind, r[26], 0x20ef8cfd, 0x1c);
    break;
  case 95:
    syscall(__NR_listen, r[26], 5);
    break;
  case 96:
    res = syscall(__NR_socket, 0xa, 2, 0x88);
    if (res != -1)
      r[27] = res;
    break;
  case 97:
    NONFAILING(memcpy((void*)0x20000500,
                      "\x0a\x5c\x2d\x02\x40\x31\x62\x22\xb4\x9a\x19\x98\xe9\x44"
                      "\x0d\x85\x71\x70\x70",
                      19));
    syscall(__NR_ioctl, r[27], 0x20000000008912, 0x20000500);
    break;
  case 98:
    res = syscall(__NR_socket, 0xa, 3, 0x87);
    if (res != -1)
      r[28] = res;
    break;
  case 99:
    syscall(__NR_socket, 0x10, 3, 6);
    break;
  case 100:
    syscall(__NR_accept, r[28], 0, 0);
    break;
  case 101:
    res = syscall(__NR_socket, 2, 0x4000000000000001, 0);
    if (res != -1)
      r[29] = res;
    break;
  case 102:
    NONFAILING(*(uint16_t*)0x20000280 = 2);
    NONFAILING(*(uint16_t*)0x20000282 = htobe16(0));
    NONFAILING(*(uint8_t*)0x20000284 = 0xac);
    NONFAILING(*(uint8_t*)0x20000285 = 0x14);
    NONFAILING(*(uint8_t*)0x20000286 = 0x14);
    NONFAILING(*(uint8_t*)0x20000287 = 0xaa);
    NONFAILING(*(uint16_t*)0x20000300 = 0);
    NONFAILING(*(uint16_t*)0x20000302 = 2);
    NONFAILING(*(uint32_t*)0x20000304 = 2);
    NONFAILING(memcpy(
        (void*)0x20000308,
        "\xa7\x77\x60\xf5\xa7\x64\x5b\xc4\x3c\x24\x1d\x69\x91\x2d\xda\x0c\x63"
        "\xc2\xa6\x67\x26\xf8\xcf\xaf\xd6\xc8\xfe\x2c\x98\xde\x7b\xa4\x49\x47"
        "\xa7\x90\x15\xf0\xfe\x57\x91\x7c\xb6\x2a\x93\x98\x7a\x93\x8f\xde\xdf"
        "\xce\x7b\xbb\xa4\xfe\xc2\xd8\xa0\x9c\x41\xfb\x23\x32\x45\xf2\x60\x4b"
        "\x9e\x07\xb8\xab\x79\xec\x15\xef\x28\x18\xa1\x79",
        80));
    syscall(__NR_setsockopt, r[29], 6, 0xe, 0x20000280, 0xd8);
    break;
  case 103:
    NONFAILING(*(uint16_t*)0x20000000 = 2);
    NONFAILING(*(uint16_t*)0x20000002 = htobe16(0x4e23));
    NONFAILING(*(uint32_t*)0x20000004 = htobe32(0xe0000001));
    syscall(__NR_bind, r[29], 0x20000000, 0x10);
    break;
  case 104:
    NONFAILING(*(uint16_t*)0x200008c0 = 2);
    NONFAILING(*(uint16_t*)0x200008c2 = htobe16(0x4e23));
    NONFAILING(*(uint8_t*)0x200008c4 = 0xac);
    NONFAILING(*(uint8_t*)0x200008c5 = 0x14);
    NONFAILING(*(uint8_t*)0x200008c6 = 0x14);
    NONFAILING(*(uint8_t*)0x200008c7 = 0xaa);
    syscall(__NR_sendto, r[29], 0, 0, 0x200007fd, 0x200008c0, 0x10);
    break;
  case 105:
    syscall(__NR_setsockopt, -1, 1, 0, 0, 0);
    break;
  case 106:
    syscall(__NR_accept, -1, 0, 0);
    break;
  case 107:
    syscall(__NR_socket, 0x11, 0, 0x300);
    break;
  case 108:
    syscall(__NR_setsockopt, -1, 1, 0x1a, 0, 0);
    break;
  case 109:
    syz_emit_ethernet(0, 0, 0);
    break;
  case 110:
    syscall(__NR_getsockopt, -1, 0x84, 0x1f, 0, 0);
    break;
  case 111:
    syscall(__NR_getsockopt, -1, 0x84, 0x10, 0, 0);
    break;
  case 112:
    syscall(__NR_getsockopt, -1, 0x11b, 7, 0, 0);
    break;
  case 113:
    syscall(__NR_sendto, -1, 0, 0, 0, 0, 0);
    break;
  case 114:
    syscall(__NR_socket, 0x10, 3, 0xc);
    break;
  case 115:
    syscall(__NR_setsockopt, -1, 0x114, 3, 0, 0);
    break;
  case 116:
    NONFAILING(*(uint64_t*)0x20000240 = 0x20000040);
    NONFAILING(*(uint32_t*)0x20000248 = 0x80);
    NONFAILING(*(uint64_t*)0x20000250 = 0x20000180);
    NONFAILING(*(uint64_t*)0x20000180 = 0x20003ac0);
    NONFAILING(*(uint64_t*)0x20000188 = 0x1000);
    NONFAILING(*(uint64_t*)0x20000258 = 1);
    NONFAILING(*(uint64_t*)0x20000260 = 0);
    NONFAILING(*(uint64_t*)0x20000268 = 0);
    NONFAILING(*(uint32_t*)0x20000270 = 0);
    syscall(__NR_recvmsg, r[29], 0x20000240, 0);
    break;
  case 117:
    syscall(__NR_socket, 0x10, 0, 0);
    break;
  case 118:
    syscall(__NR_sendmsg, -1, 0, 0);
    break;
  case 119:
    NONFAILING(*(uint64_t*)0x20002300 = -1);
    syscall(__NR_write, r[29], 0x20002300, 0x1000001bd);
    break;
  case 120:
    res = syscall(__NR_socket, 0x2b, 1, 0);
    if (res != -1)
      r[30] = res;
    break;
  case 121:
    NONFAILING(*(uint32_t*)0x20000200 = 0);
    NONFAILING(*(uint16_t*)0x20000208 = 2);
    NONFAILING(*(uint16_t*)0x2000020a = htobe16(0));
    NONFAILING(*(uint32_t*)0x2000020c = htobe32(0xe0000002));
    syscall(__NR_setsockopt, r[30], 0, 0x2a, 0x20000200, 0x88);
    break;
  case 122:
    syscall(__NR_socket, 2, 2, 0x88);
    break;
  case 123:
    res = syscall(__NR_socket, 0x10, 0x4000000002, 0);
    if (res != -1)
      r[31] = res;
    break;
  case 124:
    syscall(__NR_sendmsg, r[31], 0, 0);
    break;
  case 125:
    res = syscall(__NR_socket, 0xa, 1, 0x84);
    if (res != -1)
      r[32] = res;
    break;
  case 126:
    syscall(__NR_bind, r[32], 0, 0);
    break;
  case 127:
    syscall(__NR_listen, r[32], 5);
    break;
  case 128:
    res = syscall(__NR_socket, 0xa, 2, 0x88);
    if (res != -1)
      r[33] = res;
    break;
  case 129:
    NONFAILING(memcpy((void*)0x20000500,
                      "\x0a\x5c\x2d\x02\x40\x31\x62\x22\xb4\x9a\x19\x98\xe9\x44"
                      "\x0d\x85\x71\x70\x70",
                      19));
    syscall(__NR_ioctl, r[33], 0x20000000008912, 0x20000500);
    break;
  case 130:
    res = syscall(__NR_socket, 0xa, 3, 0x87);
    if (res != -1)
      r[34] = res;
    break;
  case 131:
    syscall(__NR_socket, 0x10, 3, 6);
    break;
  case 132:
    syscall(__NR_accept, r[34], 0, 0);
    break;
  case 133:
    syscall(__NR_getsockopt, -1, 0x84, 0x20, 0, 0);
    break;
  case 134:
    res = syscall(__NR_socket, 2, 0x4000000000000001, 0);
    if (res != -1)
      r[35] = res;
    break;
  case 135:
    NONFAILING(*(uint16_t*)0x20000000 = 2);
    NONFAILING(*(uint16_t*)0x20000002 = htobe16(0x4e23));
    NONFAILING(*(uint32_t*)0x20000004 = htobe32(0xe0000001));
    syscall(__NR_bind, r[35], 0x20000000, 0x10);
    break;
  case 136:
    NONFAILING(*(uint16_t*)0x200008c0 = 2);
    NONFAILING(*(uint16_t*)0x200008c2 = htobe16(0x4e23));
    NONFAILING(*(uint8_t*)0x200008c4 = 0xac);
    NONFAILING(*(uint8_t*)0x200008c5 = 0x14);
    NONFAILING(*(uint8_t*)0x200008c6 = 0x14);
    NONFAILING(*(uint8_t*)0x200008c7 = 0xaa);
    syscall(__NR_sendto, r[35], 0, 0, 0x200007fd, 0x200008c0, 0x10);
    break;
  case 137:
    syscall(__NR_accept, -1, 0, 0);
    break;
  case 138:
    syz_genetlink_get_family_id(0);
    break;
  case 139:
    syscall(__NR_setsockopt, -1, 1, 0x1a, 0, 0);
    break;
  case 140:
    syz_emit_ethernet(0, 0, 0);
    break;
  case 141:
    syscall(__NR_getsockopt, -1, 0x84, 0x1f, 0, 0);
    break;
  case 142:
    syscall(__NR_getsockopt, -1, 0x84, 0x10, 0, 0);
    break;
  case 143:
    syscall(__NR_sendmsg, -1, 0, 0);
    break;
  case 144:
    syscall(__NR_getsockopt, -1, 0x11b, 7, 0, 0);
    break;
  case 145:
    syscall(__NR_sendto, -1, 0, 0, 0, 0, 0);
    break;
  case 146:
    syscall(__NR_socket, 0x10, 3, 0xc);
    break;
  case 147:
    syscall(__NR_setsockopt, -1, 0x114, 3, 0, 0);
    break;
  case 148:
    NONFAILING(*(uint64_t*)0x20000240 = 0x20000040);
    NONFAILING(*(uint32_t*)0x20000248 = 0x80);
    NONFAILING(*(uint64_t*)0x20000250 = 0x20000180);
    NONFAILING(*(uint64_t*)0x20000180 = 0x20003ac0);
    NONFAILING(*(uint64_t*)0x20000188 = 0xdc00);
    NONFAILING(*(uint64_t*)0x20000258 = 1);
    NONFAILING(*(uint64_t*)0x20000260 = 0x20000200);
    NONFAILING(*(uint64_t*)0x20000268 = 0x14);
    NONFAILING(*(uint32_t*)0x20000270 = 0);
    syscall(__NR_recvmsg, r[35], 0x20000240, 0);
    break;
  case 149:
    syscall(__NR_sendmsg, -1, 0, 0);
    break;
  case 150:
    NONFAILING(*(uint64_t*)0x20002300 = -1);
    syscall(__NR_write, r[35], 0x20002300, 0x1000001bd);
    break;
  case 151:
    res = syscall(__NR_socket, 2, 2, 0x88);
    if (res != -1)
      r[36] = res;
    break;
  case 152:
    NONFAILING(memcpy((void*)0x20000000,
                      "\x0a\xdc\x1f\x02\x3c\x12\x3f\x31\x88\xa0\x70", 11));
    syscall(__NR_ioctl, r[36], 0x1000008912, 0x20000000);
    break;
  case 153:
    res = syscall(__NR_socket, 0x10, 0x4000000002, 0);
    if (res != -1)
      r[37] = res;
    break;
  case 154:
    NONFAILING(*(uint64_t*)0x200000c0 = 0);
    NONFAILING(*(uint32_t*)0x200000c8 = 0);
    NONFAILING(*(uint64_t*)0x200000d0 = 0);
    NONFAILING(*(uint64_t*)0x200000d8 = 0);
    NONFAILING(*(uint64_t*)0x200000e0 = 0);
    NONFAILING(*(uint64_t*)0x200000e8 = 0);
    NONFAILING(*(uint32_t*)0x200000f0 = 0);
    syscall(__NR_sendmsg, r[37], 0x200000c0, 0);
    break;
  case 155:
    res = syscall(__NR_socket, 0xa, 2, 0);
    if (res != -1)
      r[38] = res;
    break;
  case 156:
    NONFAILING(*(uint16_t*)0x20000100 = 0xa);
    NONFAILING(*(uint16_t*)0x20000102 = htobe16(0));
    NONFAILING(*(uint32_t*)0x20000104 = htobe32(0));
    NONFAILING(*(uint8_t*)0x20000108 = 0xfe);
    NONFAILING(*(uint8_t*)0x20000109 = 0x80);
    NONFAILING(*(uint8_t*)0x2000010a = 0);
    NONFAILING(*(uint8_t*)0x2000010b = 0);
    NONFAILING(*(uint8_t*)0x2000010c = 0);
    NONFAILING(*(uint8_t*)0x2000010d = 0);
    NONFAILING(*(uint8_t*)0x2000010e = 0);
    NONFAILING(*(uint8_t*)0x2000010f = 0);
    NONFAILING(*(uint8_t*)0x20000110 = 0);
    NONFAILING(*(uint8_t*)0x20000111 = 0);
    NONFAILING(*(uint8_t*)0x20000112 = 0);
    NONFAILING(*(uint8_t*)0x20000113 = 0);
    NONFAILING(*(uint8_t*)0x20000114 = 0);
    NONFAILING(*(uint8_t*)0x20000115 = 0);
    NONFAILING(*(uint8_t*)0x20000116 = 0);
    NONFAILING(*(uint8_t*)0x20000117 = 0);
    NONFAILING(*(uint32_t*)0x20000118 = 4);
    syscall(__NR_connect, r[38], 0x20000100, 0x1c);
    break;
  case 157:
    NONFAILING(*(uint16_t*)0x20000280 = 0xa);
    NONFAILING(*(uint16_t*)0x20000282 = htobe16(0x4e24));
    NONFAILING(*(uint32_t*)0x20000284 = htobe32(0));
    NONFAILING(*(uint8_t*)0x20000288 = 0);
    NONFAILING(*(uint8_t*)0x20000289 = 0);
    NONFAILING(*(uint8_t*)0x2000028a = 0);
    NONFAILING(*(uint8_t*)0x2000028b = 0);
    NONFAILING(*(uint8_t*)0x2000028c = 0);
    NONFAILING(*(uint8_t*)0x2000028d = 0);
    NONFAILING(*(uint8_t*)0x2000028e = 0);
    NONFAILING(*(uint8_t*)0x2000028f = 0);
    NONFAILING(*(uint8_t*)0x20000290 = 0);
    NONFAILING(*(uint8_t*)0x20000291 = 0);
    NONFAILING(*(uint8_t*)0x20000292 = -1);
    NONFAILING(*(uint8_t*)0x20000293 = -1);
    NONFAILING(*(uint32_t*)0x20000294 = htobe32(0xe0000002));
    NONFAILING(*(uint32_t*)0x20000298 = 0);
    syscall(__NR_connect, r[38], 0x20000280, 0x1c);
    break;
  case 158:
    syscall(__NR_sendmmsg, r[38], 0x200092c0, 0x4ff, 0);
    break;
  }
}
int main(void)
{
  syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
  install_segv_handler();
  for (procid = 0; procid < 6; procid++) {
    if (fork() == 0) {
      use_temporary_dir();
      do_sandbox_none();
    }
  }
  sleep(1000000);
  return 0;
}
