// KASAN: stack-out-of-bounds Read in timerqueue_add (2)
// https://syzkaller.appspot.com/bug?id=668693e5222d4c252d63a6d4c8c4628269adf9d8
// status:dup
// 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 <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/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);
}

#define BITMASK(bf_off, bf_len) (((1ull << (bf_len)) - 1) << (bf_off))
#define STORE_BY_BITMASK(type, htobe, addr, val, bf_off, bf_len)               \
  *(type*)(addr) =                                                             \
      htobe((htobe(*(type*)(addr)) & ~BITMASK((bf_off), (bf_len))) |           \
            (((type)(val) << (bf_off)) & BITMASK((bf_off), (bf_len))))

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

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

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

const int kInitNetNsFd = 239;
static long syz_init_net_socket(long domain, long type, long proto)
{
  int netns = open("/proc/self/ns/net", O_RDONLY);
  if (netns == -1)
    return netns;
  if (setns(kInitNetNsFd, 0))
    return -1;
  int sock = syscall(__NR_socket, domain, type, proto);
  int err = errno;
  if (setns(netns, 0))
    exit(1);
  close(netns);
  errno = err;
  return sock;
}

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();
  int netns = open("/proc/self/ns/net", O_RDONLY);
  if (netns == -1)
    exit(1);
  if (dup2(netns, kInitNetNsFd) < 0)
    exit(1);
  close(netns);
  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_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);
}

#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");
}

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

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);
    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[1] = {0xffffffffffffffff};

void execute_one(void)
{
  long res = 0;
  syscall(__NR_socketpair, 1, 5, 0, 0x20000200);
  syscall(__NR_socket, 0xa, 0x801, 0x84);
  syscall(__NR_wait4, 0, 0, 0x80000002, 0);
  syscall(__NR_ptrace, 0x4206, 0, 0, 0);
  NONFAILING(*(uint8_t*)0x200000c0 = 0);
  NONFAILING(*(uint8_t*)0x200000c1 = 0);
  NONFAILING(*(uint8_t*)0x200000c2 = 0);
  NONFAILING(*(uint8_t*)0x200000c3 = 0);
  NONFAILING(*(uint8_t*)0x200000c4 = 0);
  NONFAILING(*(uint8_t*)0x200000c5 = 0);
  NONFAILING(*(uint8_t*)0x200000c6 = 0);
  NONFAILING(*(uint8_t*)0x200000c7 = 0);
  NONFAILING(*(uint8_t*)0x200000c8 = 0);
  NONFAILING(*(uint8_t*)0x200000c9 = 0);
  NONFAILING(*(uint8_t*)0x200000ca = 0);
  NONFAILING(*(uint8_t*)0x200000cb = 0);
  NONFAILING(*(uint8_t*)0x200000cc = 0);
  NONFAILING(*(uint8_t*)0x200000cd = 0);
  NONFAILING(*(uint8_t*)0x200000ce = 0);
  NONFAILING(*(uint8_t*)0x200000cf = 0);
  NONFAILING(*(uint8_t*)0x200000d0 = 0);
  NONFAILING(*(uint8_t*)0x200000d1 = 0);
  NONFAILING(*(uint8_t*)0x200000d2 = 0);
  NONFAILING(*(uint8_t*)0x200000d3 = 0);
  NONFAILING(*(uint8_t*)0x200000d4 = 0);
  NONFAILING(*(uint8_t*)0x200000d5 = 0);
  NONFAILING(*(uint8_t*)0x200000d6 = 0);
  NONFAILING(*(uint8_t*)0x200000d7 = 0);
  NONFAILING(*(uint8_t*)0x200000d8 = 0);
  NONFAILING(*(uint8_t*)0x200000d9 = 0);
  NONFAILING(*(uint8_t*)0x200000da = 0);
  NONFAILING(*(uint8_t*)0x200000db = 0);
  NONFAILING(*(uint8_t*)0x200000dc = 0);
  NONFAILING(*(uint8_t*)0x200000dd = 0);
  NONFAILING(*(uint8_t*)0x200000de = 0);
  NONFAILING(*(uint8_t*)0x200000df = 0);
  NONFAILING(*(uint16_t*)0x200000e0 = 0);
  NONFAILING(*(uint32_t*)0x200000e4 = 0);
  NONFAILING(*(uint32_t*)0x200000e8 = 0);
  NONFAILING(*(uint64_t*)0x200000f0 = 3);
  NONFAILING(*(uint64_t*)0x200000f8 = 0x30);
  NONFAILING(*(uint32_t*)0x20000100 = 0);
  syscall(__NR_ioctl, -1, 0xc0481273, 0x200000c0);
  syscall(__NR_ioctl, -1, 0x40045565, 0);
  syz_init_net_socket(0x1a, 2, 0);
  syscall(__NR_ioctl, -1, 0x40087703, 0);
  syscall(__NR_openat, 0xffffffffffffff9c, 0, 0x40802, 0);
  res = syscall(__NR_socket, 0xa, 2, 0);
  if (res != -1)
    r[0] = res;
  NONFAILING(*(uint8_t*)0x20000000 = 0);
  NONFAILING(*(uint8_t*)0x20000001 = 0);
  NONFAILING(*(uint8_t*)0x20000002 = 0);
  NONFAILING(*(uint8_t*)0x20000003 = 0);
  NONFAILING(*(uint8_t*)0x20000004 = 0);
  NONFAILING(*(uint8_t*)0x20000005 = 0);
  NONFAILING(*(uint8_t*)0x20000006 = 0);
  NONFAILING(*(uint8_t*)0x20000007 = 0);
  syscall(__NR_setsockopt, r[0], 0x29, 0x3b, 0x20000000, 8);
  NONFAILING(*(uint16_t*)0x200000c0 = 0xa);
  NONFAILING(*(uint16_t*)0x200000c2 = htobe16(0));
  NONFAILING(*(uint32_t*)0x200000c4 = 0);
  NONFAILING(*(uint8_t*)0x200000c8 = 0xfe);
  NONFAILING(*(uint8_t*)0x200000c9 = 0x80);
  NONFAILING(*(uint8_t*)0x200000ca = 0);
  NONFAILING(*(uint8_t*)0x200000cb = 0);
  NONFAILING(*(uint8_t*)0x200000cc = 0);
  NONFAILING(*(uint8_t*)0x200000cd = 0);
  NONFAILING(*(uint8_t*)0x200000ce = 0);
  NONFAILING(*(uint8_t*)0x200000cf = 0);
  NONFAILING(*(uint8_t*)0x200000d0 = 0);
  NONFAILING(*(uint8_t*)0x200000d1 = 0);
  NONFAILING(*(uint8_t*)0x200000d2 = 0);
  NONFAILING(*(uint8_t*)0x200000d3 = 0);
  NONFAILING(*(uint8_t*)0x200000d4 = 0);
  NONFAILING(*(uint8_t*)0x200000d5 = 0);
  NONFAILING(*(uint8_t*)0x200000d6 = 0);
  NONFAILING(*(uint8_t*)0x200000d7 = 0);
  NONFAILING(*(uint32_t*)0x200000d8 = 4);
  syscall(__NR_connect, r[0], 0x200000c0, 0x1c);
  syscall(__NR_sendmmsg, r[0], 0x20005fc0, 0x8000000000000fc, 0x8000000);
  NONFAILING(memcpy((void*)0x20000080, "/dev/nullb0\x00", 12));
  syscall(__NR_openat, 0xffffffffffffff9c, 0x20000080, 0x4000000004002, 0);
  NONFAILING(*(uint64_t*)0x20000080 = 0);
  NONFAILING(*(uint32_t*)0x20000088 = 0);
  NONFAILING(*(uint64_t*)0x20000090 = 0x20005ff0);
  NONFAILING(*(uint64_t*)0x20005ff0 = 0x20008000);
  NONFAILING(memcpy((void*)0x20008000,
                    "\x05\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x01\x00\x00\x00",
                    28));
  NONFAILING(*(uint64_t*)0x20005ff8 = 0x1c);
  NONFAILING(*(uint64_t*)0x20000098 = 1);
  NONFAILING(*(uint64_t*)0x200000a0 = 0);
  NONFAILING(*(uint64_t*)0x200000a8 = 0);
  NONFAILING(*(uint32_t*)0x200000b0 = 0);
  syscall(__NR_sendmsg, -1, 0x20000080, 0xfffffffffffffffc);
  NONFAILING(*(uint8_t*)0x20000000 = 0xaa);
  NONFAILING(*(uint8_t*)0x20000001 = 0xaa);
  NONFAILING(*(uint8_t*)0x20000002 = 0xaa);
  NONFAILING(*(uint8_t*)0x20000003 = 0xaa);
  NONFAILING(*(uint8_t*)0x20000004 = 0xaa);
  NONFAILING(*(uint8_t*)0x20000005 = 0xaa);
  NONFAILING(*(uint8_t*)0x20000006 = 0);
  NONFAILING(*(uint8_t*)0x20000007 = 0);
  NONFAILING(*(uint8_t*)0x20000008 = 0);
  NONFAILING(*(uint8_t*)0x20000009 = 0);
  NONFAILING(*(uint8_t*)0x2000000a = 0);
  NONFAILING(*(uint8_t*)0x2000000b = 0);
  NONFAILING(*(uint16_t*)0x2000000c = htobe16(0x86dd));
  NONFAILING(STORE_BY_BITMASK(uint8_t, , 0x2000000e, 0, 0, 4));
  NONFAILING(STORE_BY_BITMASK(uint8_t, , 0x2000000e, 6, 4, 4));
  NONFAILING(memcpy((void*)0x2000000f, "\xb4\x09\x00", 3));
  NONFAILING(*(uint16_t*)0x20000012 = htobe16(0x5ca));
  NONFAILING(*(uint8_t*)0x20000014 = 0x2c);
  NONFAILING(*(uint8_t*)0x20000015 = 0);
  NONFAILING(*(uint8_t*)0x20000016 = 0);
  NONFAILING(*(uint8_t*)0x20000017 = 0);
  NONFAILING(*(uint8_t*)0x20000018 = 0);
  NONFAILING(*(uint8_t*)0x20000019 = 0);
  NONFAILING(*(uint8_t*)0x2000001a = 0);
  NONFAILING(*(uint8_t*)0x2000001b = 0);
  NONFAILING(*(uint8_t*)0x2000001c = 0);
  NONFAILING(*(uint8_t*)0x2000001d = 0);
  NONFAILING(*(uint8_t*)0x2000001e = 0);
  NONFAILING(*(uint8_t*)0x2000001f = 0);
  NONFAILING(*(uint8_t*)0x20000020 = -1);
  NONFAILING(*(uint8_t*)0x20000021 = -1);
  NONFAILING(*(uint32_t*)0x20000022 = htobe32(0xe0000002));
  NONFAILING(*(uint8_t*)0x20000026 = -1);
  NONFAILING(*(uint8_t*)0x20000027 = 2);
  NONFAILING(*(uint8_t*)0x20000028 = 0);
  NONFAILING(*(uint8_t*)0x20000029 = 0);
  NONFAILING(*(uint8_t*)0x2000002a = 0);
  NONFAILING(*(uint8_t*)0x2000002b = 0);
  NONFAILING(*(uint8_t*)0x2000002c = 0);
  NONFAILING(*(uint8_t*)0x2000002d = 0);
  NONFAILING(*(uint8_t*)0x2000002e = 0);
  NONFAILING(*(uint8_t*)0x2000002f = 0);
  NONFAILING(*(uint8_t*)0x20000030 = 0);
  NONFAILING(*(uint8_t*)0x20000031 = 0);
  NONFAILING(*(uint8_t*)0x20000032 = 0);
  NONFAILING(*(uint8_t*)0x20000033 = 0);
  NONFAILING(*(uint8_t*)0x20000034 = 0);
  NONFAILING(*(uint8_t*)0x20000035 = 1);
  NONFAILING(*(uint8_t*)0x20000036 = 0x88);
  NONFAILING(*(uint8_t*)0x20000037 = 0);
  NONFAILING(*(uint16_t*)0x20000038 = htobe16(0));
  NONFAILING(*(uint8_t*)0x2000003a = 0);
  NONFAILING(*(uint8_t*)0x2000003b = 9);
  NONFAILING(*(uint8_t*)0x2000003c = 4);
  NONFAILING(*(uint8_t*)0x2000003d = 0);
  NONFAILING(STORE_BY_BITMASK(uint8_t, , 0x2000003e, 0, 0, 4));
  NONFAILING(STORE_BY_BITMASK(uint8_t, , 0x2000003e, 6, 4, 4));
  NONFAILING(memcpy((void*)0x2000003f, "\xb6\x80\xfa", 3));
  NONFAILING(*(uint16_t*)0x20000042 = htobe16(0));
  NONFAILING(*(uint8_t*)0x20000044 = 0);
  NONFAILING(*(uint8_t*)0x20000045 = 0);
  NONFAILING(*(uint8_t*)0x20000046 = 0);
  NONFAILING(*(uint8_t*)0x20000047 = 0);
  NONFAILING(*(uint8_t*)0x20000048 = 0);
  NONFAILING(*(uint8_t*)0x20000049 = 0);
  NONFAILING(*(uint8_t*)0x2000004a = 0);
  NONFAILING(*(uint8_t*)0x2000004b = 0);
  NONFAILING(*(uint8_t*)0x2000004c = 0);
  NONFAILING(*(uint8_t*)0x2000004d = 0);
  NONFAILING(*(uint8_t*)0x2000004e = 0);
  NONFAILING(*(uint8_t*)0x2000004f = 0);
  NONFAILING(*(uint8_t*)0x20000050 = -1);
  NONFAILING(*(uint8_t*)0x20000051 = -1);
  NONFAILING(*(uint32_t*)0x20000052 = htobe32(-1));
  NONFAILING(*(uint8_t*)0x20000056 = 0);
  NONFAILING(*(uint8_t*)0x20000057 = 0);
  NONFAILING(*(uint8_t*)0x20000058 = 0);
  NONFAILING(*(uint8_t*)0x20000059 = 0);
  NONFAILING(*(uint8_t*)0x2000005a = 0);
  NONFAILING(*(uint8_t*)0x2000005b = 0);
  NONFAILING(*(uint8_t*)0x2000005c = 0);
  NONFAILING(*(uint8_t*)0x2000005d = 0);
  NONFAILING(*(uint8_t*)0x2000005e = 0);
  NONFAILING(*(uint8_t*)0x2000005f = 0);
  NONFAILING(*(uint8_t*)0x20000060 = -1);
  NONFAILING(*(uint8_t*)0x20000061 = -1);
  NONFAILING(*(uint8_t*)0x20000062 = 0xac);
  NONFAILING(*(uint8_t*)0x20000063 = 0x14);
  NONFAILING(*(uint8_t*)0x20000064 = -1);
  NONFAILING(*(uint8_t*)0x20000065 = 0xbb);
  struct csum_inet csum_1;
  csum_inet_init(&csum_1);
  NONFAILING(csum_inet_update(&csum_1, (const uint8_t*)0x0, 16));
  NONFAILING(csum_inet_update(&csum_1, (const uint8_t*)0x0, 16));
  uint32_t csum_1_chunk_2 = 0x30000000;
  csum_inet_update(&csum_1, (const uint8_t*)&csum_1_chunk_2, 4);
  uint32_t csum_1_chunk_3 = 0x3a000000;
  csum_inet_update(&csum_1, (const uint8_t*)&csum_1_chunk_3, 4);
  NONFAILING(csum_inet_update(&csum_1, (const uint8_t*)0x0, 48));
  NONFAILING(*(uint16_t*)0x20000038 = csum_inet_digest(&csum_1));
}
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;
}
