// WARNING: ODEBUG bug in xfrm_policy_destroy
// https://syzkaller.appspot.com/bug?id=2e4cbce8077ae08d8fd4e8bf9195b82d78854b5a
// 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_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/if.h>
#include <linux/if_ether.h>
#include <linux/if_tun.h>
#include <linux/ip.h>
#include <linux/net.h>
#include <linux/tcp.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);
  if (pthread_create(&th, &attr, fn, arg))
    exit(1);
  pthread_attr_destroy(&attr);
}

#define BITMASK_LEN(type, bf_len) (type)((1ull << (bf_len)) - 1)

#define BITMASK_LEN_OFF(type, bf_off, bf_len)                                  \
  (type)(BITMASK_LEN(type, (bf_len)) << (bf_off))

#define STORE_BY_BITMASK(type, addr, val, bf_off, bf_len)                      \
  if ((bf_off) == 0 && (bf_len) == 0) {                                        \
    *(type*)(addr) = (type)(val);                                              \
  } else {                                                                     \
    type new_val = *(type*)(addr);                                             \
    new_val &= ~BITMASK_LEN_OFF(type, (bf_off), (bf_len));                     \
    new_val |= ((type)(val)&BITMASK_LEN(type, (bf_len))) << (bf_off);          \
    *(type*)(addr) = new_val;                                                  \
  }

struct csum_inet {
  uint32_t acc;
};

static void csum_inet_init(struct csum_inet* csum)
{
  csum->acc = 0;
}

static void csum_inet_update(struct csum_inet* csum, const uint8_t* data,
                             size_t length)
{
  if (length == 0)
    return;
  size_t i;
  for (i = 0; i < length - 1; i += 2)
    csum->acc += *(uint16_t*)&data[i];
  if (length & 1)
    csum->acc += (uint16_t)data[length - 1];
  while (csum->acc > 0xffff)
    csum->acc = (csum->acc & 0xffff) + (csum->acc >> 16);
}

static uint16_t csum_inet_digest(struct csum_inet* csum)
{
  return ~csum->acc;
}

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 void vsnprintf_check(char* str, size_t size, const char* format,
                            va_list args)
{
  int rv;
  rv = vsnprintf(str, size, format, args);
  if (rv < 0)
    exit(1);
  if ((size_t)rv >= size)
    exit(1);
}

#define COMMAND_MAX_LEN 128
#define PATH_PREFIX                                                            \
  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin "
#define PATH_PREFIX_LEN (sizeof(PATH_PREFIX) - 1)

static void execute_command(bool panic, const char* format, ...)
{
  va_list args;
  char command[PATH_PREFIX_LEN + COMMAND_MAX_LEN];
  int rv;
  va_start(args, format);
  memcpy(command, PATH_PREFIX, PATH_PREFIX_LEN);
  vsnprintf_check(command + PATH_PREFIX_LEN, COMMAND_MAX_LEN, format, args);
  va_end(args);
  rv = system(command);
  if (rv) {
    if (panic)
      exit(1);
  }
}

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

#define TUN_IFACE "syz_tun"

#define LOCAL_MAC "aa:aa:aa:aa:aa:aa"
#define REMOTE_MAC "aa:aa:aa:aa:aa:bb"

#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;
  execute_command(0, "sysctl -w net.ipv6.conf.%s.accept_dad=0", TUN_IFACE);
  execute_command(0, "sysctl -w net.ipv6.conf.%s.router_solicitations=0",
                  TUN_IFACE);
  execute_command(1, "ip link set dev %s address %s", TUN_IFACE, LOCAL_MAC);
  execute_command(1, "ip addr add %s/24 dev %s", LOCAL_IPV4, TUN_IFACE);
  execute_command(1, "ip neigh add %s lladdr %s dev %s nud permanent",
                  REMOTE_IPV4, REMOTE_MAC, TUN_IFACE);
  execute_command(0, "ip -6 addr add %s/120 dev %s", LOCAL_IPV6, TUN_IFACE);
  execute_command(0, "ip -6 neigh add %s lladdr %s dev %s nud permanent",
                  REMOTE_IPV6, REMOTE_MAC, TUN_IFACE);
  execute_command(1, "ip link set dev %s up", TUN_IFACE);
}

#define DEV_IPV4 "172.20.20.%d"
#define DEV_IPV6 "fe80::%02hx"
#define DEV_MAC "aa:aa:aa:aa:aa:%02hx"

static void snprintf_check(char* str, size_t size, const char* format, ...)
{
  va_list args;
  va_start(args, format);
  vsnprintf_check(str, size, format, args);
  va_end(args);
}
static void initialize_netdevices(void)
{
  unsigned i;
  const char* devtypes[] = {"ip6gretap", "bridge", "vcan", "bond", "team"};
  const char* devnames[] = {"lo",
                            "sit0",
                            "bridge0",
                            "vcan0",
                            "tunl0",
                            "gre0",
                            "gretap0",
                            "ip_vti0",
                            "ip6_vti0",
                            "ip6tnl0",
                            "ip6gre0",
                            "ip6gretap0",
                            "erspan0",
                            "bond0",
                            "veth0",
                            "veth1",
                            "team0",
                            "veth0_to_bridge",
                            "veth1_to_bridge",
                            "veth0_to_bond",
                            "veth1_to_bond",
                            "veth0_to_team",
                            "veth1_to_team"};
  const char* devmasters[] = {"bridge", "bond", "team"};
  for (i = 0; i < sizeof(devtypes) / (sizeof(devtypes[0])); i++)
    execute_command(0, "ip link add dev %s0 type %s", devtypes[i], devtypes[i]);
  execute_command(0, "ip link add type veth");
  for (i = 0; i < sizeof(devmasters) / (sizeof(devmasters[0])); i++) {
    execute_command(
        0, "ip link add name %s_slave_0 type veth peer name veth0_to_%s",
        devmasters[i], devmasters[i]);
    execute_command(
        0, "ip link add name %s_slave_1 type veth peer name veth1_to_%s",
        devmasters[i], devmasters[i]);
    execute_command(0, "ip link set %s_slave_0 master %s0", devmasters[i],
                    devmasters[i]);
    execute_command(0, "ip link set %s_slave_1 master %s0", devmasters[i],
                    devmasters[i]);
    execute_command(0, "ip link set veth0_to_%s up", devmasters[i]);
    execute_command(0, "ip link set veth1_to_%s up", devmasters[i]);
  }
  execute_command(0, "ip link set bridge_slave_0 up");
  execute_command(0, "ip link set bridge_slave_1 up");
  for (i = 0; i < sizeof(devnames) / (sizeof(devnames[0])); i++) {
    char addr[32];
    snprintf_check(addr, sizeof(addr), DEV_IPV4, i + 10);
    execute_command(0, "ip -4 addr add %s/24 dev %s", addr, devnames[i]);
    snprintf_check(addr, sizeof(addr), DEV_IPV6, i + 10);
    execute_command(0, "ip -6 addr add %s/120 dev %s", addr, devnames[i]);
    snprintf_check(addr, sizeof(addr), DEV_MAC, i + 10);
    execute_command(0, "ip link set dev %s address %s", devnames[i], addr);
    execute_command(0, "ip link set dev %s up", devnames[i]);
  }
}

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 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;
}

#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)) {
  }
  if (!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")) {
  }
  if (!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)) {
  }
  if (!write_file("/proc/sys/fs/binfmt_misc/register",
                  ":syz0:M:0:\x01::./file0:")) {
  }
  if (!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)) {
  }
}

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();
  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);
  if (!write_file(file, "32")) {
  }
  snprintf(file, sizeof(file), "%s/memory.low", cgroupdir);
  if (!write_file(file, "%d", 298 << 20)) {
  }
  snprintf(file, sizeof(file), "%s/memory.high", cgroupdir);
  if (!write_file(file, "%d", 299 << 20)) {
  }
  snprintf(file, sizeof(file), "%s/memory.max", cgroupdir);
  if (!write_file(file, "%d", 300 << 20)) {
  }
  snprintf(file, sizeof(file), "%s/cgroup.procs", cgroupdir);
  if (!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);
  if (!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);
  if (!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")) {
  }
  if (!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 < 6; 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[2] = {0xffffffffffffffff, 0xffffffffffffffff};

void execute_call(int call)
{
  long res;
  switch (call) {
  case 0:
    res = syscall(__NR_inotify_init1, 0x800);
    if (res != -1)
      r[0] = res;
    break;
  case 1:
    syscall(__NR_fcntl, r[0], 9);
    break;
  case 2:
    res = syscall(__NR_socket, 2, 2, 0);
    if (res != -1)
      r[1] = res;
    break;
  case 3:
    NONFAILING(*(uint8_t*)0x200002c0 = 0);
    NONFAILING(*(uint8_t*)0x200002c1 = 0);
    NONFAILING(*(uint8_t*)0x200002c2 = 0);
    NONFAILING(*(uint8_t*)0x200002c3 = 0);
    NONFAILING(*(uint8_t*)0x200002c4 = 0);
    NONFAILING(*(uint8_t*)0x200002c5 = 0);
    NONFAILING(*(uint8_t*)0x200002c6 = 0);
    NONFAILING(*(uint8_t*)0x200002c7 = 0);
    NONFAILING(*(uint8_t*)0x200002c8 = 0);
    NONFAILING(*(uint8_t*)0x200002c9 = 0);
    NONFAILING(*(uint8_t*)0x200002ca = -1);
    NONFAILING(*(uint8_t*)0x200002cb = -1);
    NONFAILING(*(uint32_t*)0x200002cc = htobe32(0xe0000002));
    NONFAILING(*(uint8_t*)0x200002d0 = 0xac);
    NONFAILING(*(uint8_t*)0x200002d1 = 0x14);
    NONFAILING(*(uint8_t*)0x200002d2 = 0x14);
    NONFAILING(*(uint8_t*)0x200002d3 = 0xbb);
    NONFAILING(*(uint16_t*)0x200002e0 = htobe16(0));
    NONFAILING(*(uint16_t*)0x200002e2 = htobe16(0));
    NONFAILING(*(uint16_t*)0x200002e4 = htobe16(0));
    NONFAILING(*(uint16_t*)0x200002e6 = htobe16(0));
    NONFAILING(*(uint16_t*)0x200002e8 = 2);
    NONFAILING(*(uint8_t*)0x200002ea = 0);
    NONFAILING(*(uint8_t*)0x200002eb = 0);
    NONFAILING(*(uint8_t*)0x200002ec = 0);
    NONFAILING(*(uint32_t*)0x200002f0 = 0);
    NONFAILING(*(uint32_t*)0x200002f4 = 0);
    NONFAILING(*(uint64_t*)0x200002f8 = 0);
    NONFAILING(*(uint64_t*)0x20000300 = 0);
    NONFAILING(*(uint64_t*)0x20000308 = 0);
    NONFAILING(*(uint64_t*)0x20000310 = 0);
    NONFAILING(*(uint64_t*)0x20000318 = 0);
    NONFAILING(*(uint64_t*)0x20000320 = 0);
    NONFAILING(*(uint64_t*)0x20000328 = 0);
    NONFAILING(*(uint64_t*)0x20000330 = 0);
    NONFAILING(*(uint64_t*)0x20000338 = 0);
    NONFAILING(*(uint64_t*)0x20000340 = 0);
    NONFAILING(*(uint64_t*)0x20000348 = 0);
    NONFAILING(*(uint64_t*)0x20000350 = 0);
    NONFAILING(*(uint32_t*)0x20000358 = 0);
    NONFAILING(*(uint32_t*)0x2000035c = 0);
    NONFAILING(*(uint8_t*)0x20000360 = 0);
    NONFAILING(*(uint8_t*)0x20000361 = 0);
    NONFAILING(*(uint8_t*)0x20000362 = 0);
    NONFAILING(*(uint8_t*)0x20000363 = 0);
    NONFAILING(*(uint8_t*)0x20000368 = 0);
    NONFAILING(*(uint8_t*)0x20000369 = 0);
    NONFAILING(*(uint8_t*)0x2000036a = 0);
    NONFAILING(*(uint8_t*)0x2000036b = 0);
    NONFAILING(*(uint8_t*)0x2000036c = 0);
    NONFAILING(*(uint8_t*)0x2000036d = 0);
    NONFAILING(*(uint8_t*)0x2000036e = 0);
    NONFAILING(*(uint8_t*)0x2000036f = 0);
    NONFAILING(*(uint8_t*)0x20000370 = 0);
    NONFAILING(*(uint8_t*)0x20000371 = 0);
    NONFAILING(*(uint8_t*)0x20000372 = -1);
    NONFAILING(*(uint8_t*)0x20000373 = -1);
    NONFAILING(*(uint8_t*)0x20000374 = 0xac);
    NONFAILING(*(uint8_t*)0x20000375 = 0x14);
    NONFAILING(*(uint8_t*)0x20000376 = 0x14);
    NONFAILING(*(uint8_t*)0x20000377 = 0xbb);
    NONFAILING(*(uint32_t*)0x20000378 = htobe32(0));
    NONFAILING(*(uint8_t*)0x2000037c = 0x32);
    NONFAILING(*(uint16_t*)0x20000380 = 0);
    NONFAILING(*(uint8_t*)0x20000384 = 0xfe);
    NONFAILING(*(uint8_t*)0x20000385 = 0x80);
    NONFAILING(*(uint8_t*)0x20000386 = 0);
    NONFAILING(*(uint8_t*)0x20000387 = 0);
    NONFAILING(*(uint8_t*)0x20000388 = 0);
    NONFAILING(*(uint8_t*)0x20000389 = 0);
    NONFAILING(*(uint8_t*)0x2000038a = 0);
    NONFAILING(*(uint8_t*)0x2000038b = 0);
    NONFAILING(*(uint8_t*)0x2000038c = 0);
    NONFAILING(*(uint8_t*)0x2000038d = 0);
    NONFAILING(*(uint8_t*)0x2000038e = 0);
    NONFAILING(*(uint8_t*)0x2000038f = 0);
    NONFAILING(*(uint8_t*)0x20000390 = 0);
    NONFAILING(*(uint8_t*)0x20000391 = 0);
    NONFAILING(*(uint8_t*)0x20000392 = 0);
    NONFAILING(*(uint8_t*)0x20000393 = 0xaa);
    NONFAILING(*(uint32_t*)0x20000394 = 0);
    NONFAILING(*(uint8_t*)0x20000398 = 0);
    NONFAILING(*(uint8_t*)0x20000399 = 0);
    NONFAILING(*(uint8_t*)0x2000039a = 0);
    NONFAILING(*(uint32_t*)0x2000039c = 0);
    NONFAILING(*(uint32_t*)0x200003a0 = 0);
    NONFAILING(*(uint32_t*)0x200003a4 = 0);
    syscall(__NR_setsockopt, r[1], 0, 0x11, 0x200002c0, 0xe8);
    break;
  case 4:
    NONFAILING(*(uint16_t*)0x20000980 = 2);
    NONFAILING(*(uint16_t*)0x20000982 = htobe16(1));
    NONFAILING(*(uint32_t*)0x20000984 = htobe32(0));
    NONFAILING(*(uint8_t*)0x20000988 = 0);
    NONFAILING(*(uint8_t*)0x20000989 = 0);
    NONFAILING(*(uint8_t*)0x2000098a = 0);
    NONFAILING(*(uint8_t*)0x2000098b = 0);
    NONFAILING(*(uint8_t*)0x2000098c = 0);
    NONFAILING(*(uint8_t*)0x2000098d = 0);
    NONFAILING(*(uint8_t*)0x2000098e = 0);
    NONFAILING(*(uint8_t*)0x2000098f = 0);
    syscall(__NR_bind, r[1], 0x20000980, 0x10);
    break;
  case 5:
    NONFAILING(*(uint8_t*)0x20000cc0 = 1);
    NONFAILING(*(uint8_t*)0x20000cc1 = 0x80);
    NONFAILING(*(uint8_t*)0x20000cc2 = 0xc2);
    NONFAILING(*(uint8_t*)0x20000cc3 = 0);
    NONFAILING(*(uint8_t*)0x20000cc4 = 0);
    NONFAILING(*(uint8_t*)0x20000cc5 = 0);
    NONFAILING(*(uint8_t*)0x20000cc6 = 0xaa);
    NONFAILING(*(uint8_t*)0x20000cc7 = 0xaa);
    NONFAILING(*(uint8_t*)0x20000cc8 = 0xaa);
    NONFAILING(*(uint8_t*)0x20000cc9 = 0xaa);
    NONFAILING(*(uint8_t*)0x20000cca = 0xaa);
    NONFAILING(*(uint8_t*)0x20000ccb = 0);
    NONFAILING(*(uint16_t*)0x20000ccc = htobe16(0x800));
    NONFAILING(STORE_BY_BITMASK(uint8_t, 0x20000cce, 5, 0, 4));
    NONFAILING(STORE_BY_BITMASK(uint8_t, 0x20000cce, 4, 4, 4));
    NONFAILING(STORE_BY_BITMASK(uint8_t, 0x20000ccf, 0, 0, 2));
    NONFAILING(STORE_BY_BITMASK(uint8_t, 0x20000ccf, 0, 2, 6));
    NONFAILING(*(uint16_t*)0x20000cd0 = htobe16(0x415));
    NONFAILING(*(uint16_t*)0x20000cd2 = htobe16(0));
    NONFAILING(*(uint16_t*)0x20000cd4 = htobe16(0));
    NONFAILING(*(uint8_t*)0x20000cd6 = 0);
    NONFAILING(*(uint8_t*)0x20000cd7 = 0x11);
    NONFAILING(*(uint16_t*)0x20000cd8 = htobe16(0));
    NONFAILING(*(uint32_t*)0x20000cda = htobe32(0));
    NONFAILING(*(uint32_t*)0x20000cde = htobe32(0xe0000001));
    NONFAILING(*(uint16_t*)0x20000ce2 = htobe16(0));
    NONFAILING(*(uint16_t*)0x20000ce4 = htobe16(1));
    NONFAILING(*(uint8_t*)0x20000ce6 = 4);
    NONFAILING(STORE_BY_BITMASK(uint8_t, 0x20000ce7, 1, 0, 4));
    NONFAILING(STORE_BY_BITMASK(uint8_t, 0x20000ce7, 0, 4, 4));
    NONFAILING(*(uint16_t*)0x20000ce8 = htobe16(0));
    NONFAILING(STORE_BY_BITMASK(uint8_t, 0x20000cea, 0, 0, 1));
    NONFAILING(STORE_BY_BITMASK(uint8_t, 0x20000cea, 0, 1, 4));
    NONFAILING(STORE_BY_BITMASK(uint8_t, 0x20000cea, 0, 5, 3));
    NONFAILING(memcpy((void*)0x20000ceb, "\xd7\x05\x02", 3));
    NONFAILING(*(uint8_t*)0x20000cee = 0);
    NONFAILING(memcpy((void*)0x20000cef, "\xf5\x34\x75", 3));
    NONFAILING(memcpy(
        (void*)0x20000cf2,
        "\xb4\x41\xd6\x32\xcd\xbb\xcb\x21\x13\x63\x80\x7a\xec\x73\xd3\x88\x37"
        "\x62\xa6\x1d\xc0\x2d\x34\x9b\xfa\x3a\xc9\x74\xb9\x87\xaa\x7f\xb9\x7e"
        "\xb3\x24\xd5\x94\xfb\xbb\x77\xba\xb7\x59\x41\x8a\xa8\xd4\x51\xd9\x21"
        "\xe8\xf5\xd2\xcf\x2b\x08\x29\x21\x11\x70\x11\x92\xe9\x7c\xac\x36\x6d"
        "\xd3\xeb\x2e\x0f\xb0\x39\xe5\x83\x14\xef\x47\x09\xc5\xf3\x55\x6d\xb6"
        "\xa1\xab\x6b\x4f\xb2\xbd\xd8\x3c\xdc\x26\xe8\x39\x5e\xc4\x98\x4e\xc3"
        "\xfa\xf7\x1a\x61\x1d\x15\x69\x54\x5d\x65\x4c\xde\xd9\x3b\xe8\x27\xa8"
        "\x51\x88\xb8\x03\xc1\x9c\x1b\x56\xaa\xb5\x22\x86\x2a\x71\x8b\x81\xe5"
        "\x12\xb4\x96\x90\x99\x4d\x34\x25\xe3\x3b\xd9\x3f\x0e\x74\x4c\x66\xa0"
        "\x83\xc1\xf9\xf1\xbd\x7b\xb8\xf9\xe1\x23\xc0\x8f\x3f\x04\x1e\xd3\xfd"
        "\xc0\x58\x13\x6c\xf0\x07\x1a\x47\xcc\x0e\x38\x72\x0a\x12\xe1\x1e\x84"
        "\x2a\x7b\x5b\x26\xdf\xf0\x7f\x57\x8f\xdb\x9a\x7b\x14\x66\x2a\x62\x5c"
        "\x1e\xe7\x6c\x41\xcc\xb2\xb1\xfc\x63\x76\xaa\x71\x8e\x10\x67\xb9\xe4"
        "\xaf\x51\x1e\xf5\xb3\x60\xdb\xfa\xd3\x26\x10\x8b\xb0\x33\xdb\x19\x3d"
        "\xab\x27\x97\x4e\xb8\xc4\x62\x73\x9e\xae\xe5\x1d\x87\xf3\x1c\x51\x6e"
        "\x7e\x39\x10\x73\x77\x0d\xa3\x20\x2e\x02\xc4\x1a\x72\x77\xc8\x47\xdf"
        "\x24\xbd\x5b\x0a\x7a\xb6\xe2\x52\xf3\xc8\xeb\xf0\x06\x88\xcc\x55\x31"
        "\x1d\x88\x7e\x8b\xfd\x95\xa7\xf4\xc6\xa1\x26\xaf\x3f\xe2\x67\x14\xdd"
        "\xb8\x69\xc6\x6d\x18\xf8\x70\x63\x1b\xbd\x49\x7e\x8a\x06\x88\x1b\x75"
        "\x4e\xcd\xcd\xd0\xdc\xff\xc5\x1c\xd5\x2a\x6b\x56\x0f\x8d\x64\xb6\x3a"
        "\x16\x74\x74\x5e\xdc\x5f\x53\xb1\x8a\x8f\xfc\xc5\xc2\xfb\xc4\xd2\xbb"
        "\xcc\x2f\xaf\x3c\x18\x9d\x9b\x36\xc0\x65\x5d\x13\x94\xf5\xc1\x27\xec"
        "\x86\xb8\xa7\x64\xa8\x7b\x54\x6c\x2b\x6a\xc3\x7d\x0a\x8e\xc3\xed\xd7"
        "\xcd\xa6\xf9\x30\x57\x07\x63\xdb\xdc\x06\x40\xd2\x19\x74\x9b\xd5\x7c"
        "\x7c\x89\xea\xad\xfd\xae\x41\xd6\x54\xa4\x6b\x17\xbe\x06\x9a\x32\xa7"
        "\xd9\x4d\x29\xb6\x12\xfb\xe6\x1b\x8b\xd1\x1a\x2d\x10\xba\x5d\x4a\xc7"
        "\x01\x4f\xc0\x46\x5c\x3f\x14\x45\x98\xbd\x1f\x91\x33\x43\xe7\x29\x37"
        "\x11\x04\x0e\xee\x0a\xe8\xdf\x1e\x49\xf0\x4e\xd1\x03\x7d\x4b\x74\x2a"
        "\xed\x0e\x93\x21\x16\x06\x0a\xaf\x6b\x98\x52\x38\xd2\xe1\x0f\xb5\xb1"
        "\x1d\x19\xd7\x80\x1b\xef\xed\x48\x33\x28\x7d\x96\xa8\x5a\x7c\xdd\x9e"
        "\x21\x1a\x67\x27\x60\x33\x56\x55\x57\x6f\xc0\xfa\x03\x36\x62\x1c\x2b"
        "\x2b\x10\x18\xef\x71\xbb\x50\x77\xc6\x7e\xe5\xfa\x8d\x47\x9d\x67\x76"
        "\x01\x33\x63\xe9\x8b\x1f\x12\x13\x71\x2b\xe7\xe4\x75\x49\xb6\x03\x54"
        "\x59\x00\x8c\x50\x9f\x0f\x98\x31\x30\xa4\x51\x53\x13\x81\xee\x3c\x1a"
        "\xb9\xe1\xcb\xb8\xe5\x58\xb5\x6c\xa1\xa7\x09\x39\x38\x9a\xdd\xc5\xf9"
        "\x63\x2b\x37\xff\x3f\x63\x4a\xbb\x50\x4b\xb0\xbe\x0a\x51\x64\x96\x83"
        "\xf6\xe2\x95\x88\xc1\x5c\xda\x40\x25\x5e\x17\x33\x28\x68\x18\x84\xff"
        "\xef\x67\x29\xe9\x05\x8c\x56\x23\xe1\x40\x1f\xdc\xc7\xb8\xcb\x56\x23"
        "\xa8\xfd\x72\x5f\xbe\xea\x05\xfc\x41\x7c\x44\xe4\x65\x00\x61\x92\x18"
        "\xdf\xf7\xc7\x0a\xa0\x68\x99\x4c\x58\x88\x3c\xad\xa5\x05\xa2\xaa\x85"
        "\xb6\x62\x0d\xfe\x9c\x45\xb7\x07\xc9\xaa\x12\x22\xb8\x69\x72\xea\xe5"
        "\x64\xb2\x8a\x05\xdd\xfa\x35\x45\xdf\x23\x1f\xde\x27\x07\xd4\xbf\x67"
        "\xdc\x6b\xa4\x1d\xab\xa9\x1d\xee\x80\x81\xe5\xc7\xe2\xbc\xfb\xeb\xeb"
        "\xd4\x2d\x5a\xb8\xa3\x2d\x6e\x09\x8f\xd5\x72\x33\xe3\xb8\x13\xdc\x0d"
        "\x77\x21\x34\x77\x5d\xef\x45\x18\x23\xb7\xfe\xf2\xbc\x93\xda\x01\x72"
        "\x2c\xd6\x13\xb9\xa3\xdb\x7e\x2d\x4c\x51\xfb\x7b\x56\x00\x6e\xe9\xce"
        "\xa5\x3b\x62\x34\x35\x99\xa5\x61\x67\x38\x8d\x45\x24\x7f\x92\x89\xfb"
        "\x1c\xab\x67\xa7\xcb\x0c\x36\x65\xdd\xf1\xe1\x41\x18\x75\xb4\xde\x34"
        "\x28\xb3\x2f\xc6\x60\x36\x91\xa0\x23\xd8\xe4\xcb\x93\xc6\x67\xac\xb7"
        "\xb5\x35\xfb\x5f\x77\xaf\x9a\x49\x64\x0c\xbe\x8f\xfe\x3a\x19\x3c\xf4"
        "\xdf\x1b\x55\x6a\x67\xcb\x75\x3c\x60\xbd\xf9\x78\xb8\x71\xaa\x51\x3c"
        "\x07\x07\x4c\x66\x02\x03\x7e\xbc\x32\x19\x92\x90\xe3\xc7\xac\x6f\x10"
        "\x3a\xd9\x35\x89\x51\xad\x4d\xe0\xc8\xf1\xb3\x49\x51\xb0\xe6\xa4\x82"
        "\x95\x97\x5c\xf0\x8b\x2c\x3c\x95\x06\x48\x55\xfc\x95\x31\x7e\x38\x6f"
        "\x1c\x18\x60\x8d\x1d\x08\x69\x90\x03\xc9\x98\xb9\x33\x32\xcd\x31\x6f"
        "\x17\xa5\x13\x9d\x35\x0c\xbf\xa9\xda\xbc\x3f\x77\xc4\x19\x7a\x01\x86"
        "\xe5\x09\x13\x97\x8e\x98\x0a\x7a\x02\x8e\x7c\xcd\xee\xe7\x18\xaf\x02"
        "\x82\x00\xe9\x4a\x6b\x3a\x0e\xc9\x3b\xa1\x4b\x0c\x64\xdf\xaf\x39\x67"
        "\xe2\x30\xd8\xcf\x87\x6f\x26\x28\x7d\x43\x6e\xbc\x95\x88\xb5\x2b\x43"
        "\xf2\x38\x08\x36\xbf\xe3",
        1009));
    struct csum_inet csum_1;
    csum_inet_init(&csum_1);
    NONFAILING(csum_inet_update(&csum_1, (const uint8_t*)0x0, 4));
    NONFAILING(csum_inet_update(&csum_1, (const uint8_t*)0x0, 4));
    uint16_t csum_1_chunk_2 = 0x2100;
    csum_inet_update(&csum_1, (const uint8_t*)&csum_1_chunk_2, 2);
    uint16_t csum_1_chunk_3 = 0x1000;
    csum_inet_update(&csum_1, (const uint8_t*)&csum_1_chunk_3, 2);
    NONFAILING(csum_inet_update(&csum_1, (const uint8_t*)0x0, 16));
    NONFAILING(*(uint16_t*)0x20000ce8 = csum_inet_digest(&csum_1));
    struct csum_inet csum_2;
    csum_inet_init(&csum_2);
    NONFAILING(csum_inet_update(&csum_2, (const uint8_t*)0x20000cce, 20));
    NONFAILING(*(uint16_t*)0x20000cd8 = csum_inet_digest(&csum_2));
    syz_emit_ethernet(0x423, 0x20000cc0, 0);
    break;
  }
}
int main(void)
{
  syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
  install_segv_handler();
  use_temporary_dir();
  do_sandbox_none();
  return 0;
}
