text: // KMSAN: uninit-value in __list_add_valid
  // https://syzkaller.appspot.com/bug?id=b7f453321d948bb133fdb6ddbea56e336d7d2da2
  // status:invalid
  // autogenerated by syzkaller (http://github.com/google/syzkaller)
  
  #define _GNU_SOURCE
  #include <arpa/inet.h>
  #include <dirent.h>
  #include <endian.h>
  #include <errno.h>
  #include <errno.h>
  #include <errno.h>
  #include <errno.h>
  #include <fcntl.h>
  #include <fcntl.h>
  #include <fcntl.h>
  #include <linux/capability.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>
  #include <net/if_arp.h>
  #include <netinet/in.h>
  #include <sched.h>
  #include <signal.h>
  #include <signal.h>
  #include <stdarg.h>
  #include <stdarg.h>
  #include <stdarg.h>
  #include <stdbool.h>
  #include <stdbool.h>
  #include <stdio.h>
  #include <stdio.h>
  #include <stdio.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <sys/ioctl.h>
  #include <sys/mman.h>
  #include <sys/mount.h>
  #include <sys/mount.h>
  #include <sys/mount.h>
  #include <sys/prctl.h>
  #include <sys/prctl.h>
  #include <sys/resource.h>
  #include <sys/socket.h>
  #include <sys/stat.h>
  #include <sys/stat.h>
  #include <sys/stat.h>
  #include <sys/syscall.h>
  #include <sys/time.h>
  #include <sys/time.h>
  #include <sys/types.h>
  #include <sys/uio.h>
  #include <sys/wait.h>
  #include <sys/wait.h>
  #include <time.h>
  #include <unistd.h>
  
  __attribute__((noreturn)) static void doexit(int status)
  {
    volatile unsigned i;
    syscall(__NR_exit_group, status);
    for (i = 0;; i++) {
    }
  }
  #include <errno.h>
  #include <stdarg.h>
  #include <stdint.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <sys/stat.h>
  
  const int kFailStatus = 67;
  const int kRetryStatus = 69;
  
  static void fail(const char* msg, ...)
  {
    int e = errno;
    va_list args;
    va_start(args, msg);
    vfprintf(stderr, msg, args);
    va_end(args);
    fprintf(stderr, " (errno %d)\n", e);
    doexit((e == ENOMEM || e == EAGAIN) ? kRetryStatus : kFailStatus);
  }
  
  static void exitf(const char* msg, ...)
  {
    int e = errno;
    va_list args;
    va_start(args, msg);
    vfprintf(stderr, msg, args);
    va_end(args);
    fprintf(stderr, " (errno %d)\n", e);
    doexit(kRetryStatus);
  }
  
  #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;                                                  \
    }
  
  static uint64_t current_time_ms()
  {
    struct timespec ts;
  
    if (clock_gettime(CLOCK_MONOTONIC, &ts))
      fail("clock_gettime failed");
    return (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000;
  }
  
  static void use_temporary_dir()
  {
    char tmpdir_template[] = "./syzkaller.XXXXXX";
    char* tmpdir = mkdtemp(tmpdir_template);
    if (!tmpdir)
      fail("failed to mkdtemp");
    if (chmod(tmpdir, 0777))
      fail("failed to chmod");
    if (chdir(tmpdir))
      fail("failed to chdir");
  }
  
  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)
      fail("tun: snprintf failed");
    if ((size_t)rv >= size)
      fail("tun: string '%s...' doesn't fit into buffer", str);
  }
  
  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);
  }
  
  #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)
        fail("command '%s' failed: %d", &command[0], rv);
    }
  }
  
  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 = 252;
    if (dup2(tunfd, kTunFd) < 0)
      fail("dup2(tunfd, kTunFd) failed");
    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)
        fail("tun: ioctl(TUNSETIFF) failed");
    }
    if (ioctl(tunfd, TUNGETIFF, (void*)&ifr) < 0)
      fail("tun: ioctl(TUNGETIFF) failed");
    tun_frags_enabled = (ifr.ifr_flags & IFF_NAPI_FRAGS) != 0;
  
    execute_command(1, "sysctl -w net.ipv6.conf.%s.accept_dad=0", TUN_IFACE);
  
    execute_command(1, "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 -6 addr add %s/120 dev %s", LOCAL_IPV6, TUN_IFACE);
    execute_command(1, "ip neigh add %s lladdr %s dev %s nud permanent",
                    REMOTE_IPV4, REMOTE_MAC, TUN_IFACE);
    execute_command(1, "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 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;
      fail("tun: read failed with %d", rv);
    }
    return rv;
  }
  
  static void flush_tun()
  {
    char data[SYZ_TUN_MAX_PACKET_SIZE];
    while (read_tun(&data[0], sizeof(data)) != -1)
      ;
  }
  
  static uintptr_t syz_open_procfs(uintptr_t a0, uintptr_t a1)
  {
  
    char buf[128];
    memset(buf, 0, sizeof(buf));
    if (a0 == 0) {
      snprintf(buf, sizeof(buf), "/proc/self/%s", (char*)a1);
    } else if (a0 == (uintptr_t)-1) {
      snprintf(buf, sizeof(buf), "/proc/thread-self/%s", (char*)a1);
    } else {
      snprintf(buf, sizeof(buf), "/proc/self/task/%d/%s", (int)a0, (char*)a1);
    }
    int fd = open(buf, O_RDWR);
    if (fd == -1)
      fd = open(buf, O_RDONLY);
    return fd;
  }
  
  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 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 (!write_file("/proc/sys/fs/binfmt_misc/register",
                    ":syz0:M:0:syz0::./file0:")) {
    }
    if (!write_file("/proc/sys/fs/binfmt_misc/register",
                    ":syz1:M:1:yz1::./file0:POC")) {
    }
  }
  
  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 = 160 << 20;
    setrlimit(RLIMIT_AS, &rlim);
    rlim.rlim_cur = rlim.rlim_max = 8 << 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);
  
    if (unshare(CLONE_NEWNS)) {
    }
    if (unshare(CLONE_NEWIPC)) {
    }
    if (unshare(0x02000000)) {
    }
    if (unshare(CLONE_NEWUTS)) {
    }
    if (unshare(CLONE_SYSVSEM)) {
    }
  }
  
  static int real_uid;
  static int real_gid;
  __attribute__((aligned(64 << 10))) static char sandbox_stack[1 << 20];
  
  static int namespace_sandbox_proc(void* arg)
  {
    sandbox_common();
  
    write_file("/proc/self/setgroups", "deny");
    if (!write_file("/proc/self/uid_map", "0 %d 1\n", real_uid))
      fail("write of /proc/self/uid_map failed");
    if (!write_file("/proc/self/gid_map", "0 %d 1\n", real_gid))
      fail("write of /proc/self/gid_map failed");
  
    if (unshare(CLONE_NEWNET))
      fail("unshare(CLONE_NEWNET)");
    initialize_tun();
    initialize_netdevices();
  
    if (mkdir("./syz-tmp", 0777))
      fail("mkdir(syz-tmp) failed");
    if (mount("", "./syz-tmp", "tmpfs", 0, NULL))
      fail("mount(tmpfs) failed");
    if (mkdir("./syz-tmp/newroot", 0777))
      fail("mkdir failed");
    if (mkdir("./syz-tmp/newroot/dev", 0700))
      fail("mkdir failed");
    unsigned mount_flags = MS_BIND | MS_REC | MS_PRIVATE;
    if (mount("/dev", "./syz-tmp/newroot/dev", NULL, mount_flags, NULL))
      fail("mount(dev) failed");
    if (mkdir("./syz-tmp/newroot/proc", 0700))
      fail("mkdir failed");
    if (mount(NULL, "./syz-tmp/newroot/proc", "proc", 0, NULL))
      fail("mount(proc) failed");
    if (mkdir("./syz-tmp/newroot/selinux", 0700))
      fail("mkdir failed");
    const char* selinux_path = "./syz-tmp/newroot/selinux";
    if (mount("/selinux", selinux_path, NULL, mount_flags, NULL)) {
      if (errno != ENOENT)
        fail("mount(/selinux) failed");
      if (mount("/sys/fs/selinux", selinux_path, NULL, mount_flags, NULL) &&
          errno != ENOENT)
        fail("mount(/sys/fs/selinux) failed");
    }
    if (mkdir("./syz-tmp/newroot/sys", 0700))
      fail("mkdir failed");
    if (mount(NULL, "./syz-tmp/newroot/sys", "sysfs", 0, NULL))
      fail("mount(sysfs) failed");
    if (mkdir("./syz-tmp/newroot/syzcgroup", 0700))
      fail("mkdir failed");
    if (mkdir("./syz-tmp/newroot/syzcgroup/unified", 0700))
      fail("mkdir failed");
    if (mkdir("./syz-tmp/newroot/syzcgroup/cpu", 0700))
      fail("mkdir failed");
    if (mkdir("./syz-tmp/newroot/syzcgroup/net", 0700))
      fail("mkdir failed");
    if (mount("/syzcgroup/unified", "./syz-tmp/newroot/syzcgroup/unified", NULL,
              mount_flags, NULL)) {
    }
    if (mount("/syzcgroup/cpu", "./syz-tmp/newroot/syzcgroup/cpu", NULL,
              mount_flags, NULL)) {
    }
    if (mount("/syzcgroup/net", "./syz-tmp/newroot/syzcgroup/net", NULL,
              mount_flags, NULL)) {
    }
    if (mkdir("./syz-tmp/pivot", 0777))
      fail("mkdir failed");
    if (syscall(SYS_pivot_root, "./syz-tmp", "./syz-tmp/pivot")) {
      if (chdir("./syz-tmp"))
        fail("chdir failed");
    } else {
      if (chdir("/"))
        fail("chdir failed");
      if (umount2("./pivot", MNT_DETACH))
        fail("umount failed");
    }
    if (chroot("./newroot"))
      fail("chroot failed");
    if (chdir("/"))
      fail("chdir failed");
  
    struct __user_cap_header_struct cap_hdr = {};
    struct __user_cap_data_struct cap_data[2] = {};
    cap_hdr.version = _LINUX_CAPABILITY_VERSION_3;
    cap_hdr.pid = getpid();
    if (syscall(SYS_capget, &cap_hdr, &cap_data))
      fail("capget failed");
    cap_data[0].effective &= ~(1 << CAP_SYS_PTRACE);
    cap_data[0].permitted &= ~(1 << CAP_SYS_PTRACE);
    cap_data[0].inheritable &= ~(1 << CAP_SYS_PTRACE);
    if (syscall(SYS_capset, &cap_hdr, &cap_data))
      fail("capset failed");
  
    loop();
    doexit(1);
  }
  
  static int do_sandbox_namespace(void)
  {
    int pid;
  
    setup_cgroups();
    setup_binfmt_misc();
    real_uid = getuid();
    real_gid = getgid();
    mprotect(sandbox_stack, 4096, PROT_NONE);
    pid =
        clone(namespace_sandbox_proc, &sandbox_stack[sizeof(sandbox_stack) - 64],
              CLONE_NEWUSER | CLONE_NEWPID, 0);
    if (pid < 0)
      fail("sandbox clone failed");
    return pid;
  }
  
  #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;
      }
      fail("socket(%d, SOCK_STREAM, IPPROTO_TCP)", family);
    }
    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;
        }
        fail("getsockopt(IPT_SO_GET_INFO)");
      }
      if (table->info.size > sizeof(table->replace.entrytable))
        fail("table size is too large: %u", table->info.size);
      if (table->info.num_entries > XT_MAX_ENTRIES)
        fail("too many counters: %u", table->info.num_entries);
      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))
        fail("getsockopt(IPT_SO_GET_ENTRIES)");
      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;
      }
      fail("socket(%d, SOCK_STREAM, IPPROTO_TCP)", family);
    }
    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))
        fail("getsockopt(IPT_SO_GET_INFO)");
      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))
          fail("getsockopt(IPT_SO_GET_ENTRIES)");
        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))
        fail("setsockopt(IPT_SO_SET_REPLACE)");
    }
    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)
      fail("socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)");
    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;
        }
        fail("getsockopt(ARPT_SO_GET_INFO)");
      }
      if (table->info.size > sizeof(table->replace.entrytable))
        fail("table size is too large: %u", table->info.size);
      if (table->info.num_entries > XT_MAX_ENTRIES)
        fail("too many counters: %u", table->info.num_entries);
      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))
        fail("getsockopt(ARPT_SO_GET_ENTRIES)");
      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)
      fail("socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)");
    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))
        fail("getsockopt(ARPT_SO_GET_INFO)");
      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))
          fail("getsockopt(ARPT_SO_GET_ENTRIES)");
        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, SOL_IP, ARPT_SO_SET_REPLACE, &table->replace, optlen))
        fail("setsockopt(ARPT_SO_SET_REPLACE)");
    }
    close(fd);
  }
  #include <linux/if.h>
  #include <linux/netfilter_bridge/ebtables.h>
  
  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)
      fail("socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)");
    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;
        }
        fail("getsockopt(EBT_SO_GET_INIT_INFO)");
      }
      if (table->replace.entries_size > sizeof(table->entrytable))
        fail("table size is too large: %u", table->replace.entries_size);
      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))
        fail("getsockopt(EBT_SO_GET_INIT_ENTRIES)");
    }
    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)
      fail("socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)");
    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))
        fail("getsockopt(EBT_SO_GET_INFO)");
      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))
          fail("getsockopt(EBT_SO_GET_ENTRIES)");
        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))
        fail("setsockopt(EBT_SO_SET_ENTRIES)");
    }
    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 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) {
        exitf("opendir(%s) failed due to NOFILE, exiting", dir);
      }
      exitf("opendir(%s) failed", dir);
    }
    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);
      struct stat st;
      if (lstat(filename, &st))
        exitf("lstat(%s) failed", filename);
      if (S_ISDIR(st.st_mode)) {
        remove_dir(filename);
        continue;
      }
      int i;
      for (i = 0;; i++) {
        if (unlink(filename) == 0)
          break;
        if (errno == EROFS) {
          break;
        }
        if (errno != EBUSY || i > 100)
          exitf("unlink(%s) failed", filename);
        if (umount2(filename, MNT_DETACH))
          exitf("umount(%s) failed", filename);
      }
    }
    closedir(dp);
    int i;
    for (i = 0;; i++) {
      if (rmdir(dir) == 0)
        break;
      if (i < 100) {
        if (errno == EROFS) {
          break;
        }
        if (errno == EBUSY) {
          if (umount2(dir, MNT_DETACH))
            exitf("umount(%s) failed", dir);
          continue;
        }
        if (errno == ENOTEMPTY) {
          if (iter < 100) {
            iter++;
            goto retry;
          }
        }
      }
      exitf("rmdir(%s) failed", dir);
    }
  }
  
  static void execute_one();
  extern unsigned long long procid;
  
  static void loop()
  {
    checkpoint_net_namespace();
    char cgroupdir[64];
    snprintf(cgroupdir, sizeof(cgroupdir), "/syzcgroup/unified/syz%llu", procid);
    char cgroupdir_cpu[64];
    snprintf(cgroupdir_cpu, sizeof(cgroupdir_cpu), "/syzcgroup/cpu/syz%llu",
             procid);
    char cgroupdir_net[64];
    snprintf(cgroupdir_net, sizeof(cgroupdir_net), "/syzcgroup/net/syz%llu",
             procid);
    if (mkdir(cgroupdir, 0777)) {
    }
    if (mkdir(cgroupdir_cpu, 0777)) {
    }
    if (mkdir(cgroupdir_net, 0777)) {
    }
    int pid = getpid();
    char procs_file[128];
    snprintf(procs_file, sizeof(procs_file), "%s/cgroup.procs", cgroupdir);
    if (!write_file(procs_file, "%d", pid)) {
    }
    snprintf(procs_file, sizeof(procs_file), "%s/cgroup.procs", cgroupdir_cpu);
    if (!write_file(procs_file, "%d", pid)) {
    }
    snprintf(procs_file, sizeof(procs_file), "%s/cgroup.procs", cgroupdir_net);
    if (!write_file(procs_file, "%d", pid)) {
    }
    int iter;
    for (iter = 0;; iter++) {
      char cwdbuf[32];
      sprintf(cwdbuf, "./%d", iter);
      if (mkdir(cwdbuf, 0777))
        fail("failed to mkdir");
      int pid = fork();
      if (pid < 0)
        fail("clone failed");
      if (pid == 0) {
        prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
        setpgrp();
        if (chdir(cwdbuf))
          fail("failed to chdir");
        if (symlink(cgroupdir, "./cgroup")) {
        }
        if (symlink(cgroupdir_cpu, "./cgroup.cpu")) {
        }
        if (symlink(cgroupdir_net, "./cgroup.net")) {
        }
        flush_tun();
        execute_one();
        doexit(0);
      }
  
      int status = 0;
      uint64_t start = current_time_ms();
      for (;;) {
        int res = waitpid(-1, &status, __WALL | WNOHANG);
        if (res == pid) {
          break;
        }
        usleep(1000);
        if (current_time_ms() - start < 3 * 1000)
          continue;
        kill(-pid, SIGKILL);
        kill(pid, SIGKILL);
        while (waitpid(-1, &status, __WALL) != pid) {
        }
        break;
      }
      remove_dir(cwdbuf);
      reset_net_namespace();
    }
  }
  
  uint64_t r[3] = {0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff};
  unsigned long long procid;
  void execute_one()
  {
    long res = 0;
    syscall(__NR_socket, 0xa, 0x80003, 0);
    *(uint32_t*)0x20bba000 = 0;
    *(uint32_t*)0x20bba004 = 0x70;
    *(uint8_t*)0x20bba008 = 0;
    *(uint8_t*)0x20bba009 = 0;
    *(uint8_t*)0x20bba00a = 0;
    *(uint8_t*)0x20bba00b = 0;
    *(uint32_t*)0x20bba00c = 0;
    *(uint64_t*)0x20bba010 = 0;
    *(uint64_t*)0x20bba018 = 0;
    *(uint64_t*)0x20bba020 = 0;
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 0, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 1, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 2, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 3, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 4, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 9, 5, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 6, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 7, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 8, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 9, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 10, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 11, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 12, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 13, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 14, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 15, 2);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 17, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 18, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0x1f, 19, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 20, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 21, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 22, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 23, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 24, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 25, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 26, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 27, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 28, 1);
    STORE_BY_BITMASK(uint64_t, 0x20bba028, 0, 29, 35);
    *(uint32_t*)0x20bba030 = 0;
    *(uint32_t*)0x20bba034 = 0;
    *(uint64_t*)0x20bba038 = 0x20000000;
    *(uint64_t*)0x20bba040 = 0;
    *(uint64_t*)0x20bba048 = 0;
    *(uint64_t*)0x20bba050 = 0;
    *(uint32_t*)0x20bba058 = 0;
    *(uint32_t*)0x20bba05c = 0;
    *(uint64_t*)0x20bba060 = 0;
    *(uint32_t*)0x20bba068 = 0;
    *(uint16_t*)0x20bba06c = 0;
    *(uint16_t*)0x20bba06e = 0;
    syscall(__NR_perf_event_open, 0x20bba000, 0, 0, -1, 0);
    *(uint32_t*)0x20940000 = 2;
    *(uint32_t*)0x20940004 = 0x78;
    *(uint8_t*)0x20940008 = 0xfe;
    *(uint8_t*)0x20940009 = 0;
    *(uint8_t*)0x2094000a = 0;
    *(uint8_t*)0x2094000b = 0;
    *(uint32_t*)0x2094000c = 0;
    *(uint64_t*)0x20940010 = 0;
    *(uint64_t*)0x20940018 = 0;
    *(uint64_t*)0x20940020 = 0;
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 0, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, -1, 1, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 2, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 3, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 4, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 3, 5, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 6, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 7, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 8, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 9, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 10, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 11, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 12, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 13, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 14, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 15, 2);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 17, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 18, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 19, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 20, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 21, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 22, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 23, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 24, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 25, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 26, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 27, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 28, 1);
    STORE_BY_BITMASK(uint64_t, 0x20940028, 0, 29, 35);
    *(uint32_t*)0x20940030 = 0;
    *(uint32_t*)0x20940034 = 0;
    *(uint64_t*)0x20940038 = 0x20000000;
    *(uint64_t*)0x20940040 = 0;
    *(uint64_t*)0x20940048 = 0;
    *(uint64_t*)0x20940050 = 0;
    *(uint32_t*)0x20940058 = 0;
    *(uint32_t*)0x2094005c = 0;
    *(uint64_t*)0x20940060 = 0;
    *(uint32_t*)0x20940068 = 0;
    *(uint16_t*)0x2094006c = 0;
    *(uint16_t*)0x2094006e = 0;
    syscall(__NR_perf_event_open, 0x20940000, 0, -1, -1, 0);
    syscall(__NR_clone, 0, 0x200002c0, 0x200000c0, 0x200001c0, 0x200003c0);
    memcpy((void*)0x20f80000, "./file0", 8);
    syscall(__NR_mknod, 0x20f80000, 0, 0);
    res = syscall(__NR_socket, 0x10, 3, 0x10);
    if (res != -1)
      r[0] = res;
    res = syscall(__NR_socket, 0x11, 0, 0x300);
    if (res != -1)
      r[1] = res;
    memcpy((void*)0x20000000,
           "\x62\x72\x69\x64\x67\x65\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00",
           16);
    *(uint32_t*)0x20000010 = 0;
    syscall(__NR_ioctl, r[1], 0x8933, 0x20000000);
    memcpy((void*)0x20000000,
           "\x62\x63\x73\x66\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
           16);
    syscall(__NR_ioctl, r[0], 0x89a1, 0x20000000);
    *(uint32_t*)0x20000040 = 0xffffff8e;
    syscall(__NR_accept, r[1], 0, 0x20000040);
    memcpy((void*)0x200004c0, "smaps", 6);
    res = syz_open_procfs(0, 0x200004c0);
    if (res != -1)
      r[2] = res;
    *(uint32_t*)0x20000500 = 0;
    *(uint32_t*)0x20000504 = 3;
    *(uint32_t*)0x20000508 = 4;
    *(uint32_t*)0x2000050c = 3;
    *(uint32_t*)0x20000510 = 8;
    *(uint64_t*)0x20000518 = 0x18;
    *(uint64_t*)0x20000520 = 2;
    *(uint64_t*)0x20000528 = 9;
    *(uint8_t*)0x20000530 = 0;
    *(uint8_t*)0x20000531 = 0;
    *(uint8_t*)0x20000532 = 0;
    *(uint8_t*)0x20000533 = 0;
    *(uint8_t*)0x20000534 = 0;
    *(uint8_t*)0x20000535 = 0;
    *(uint8_t*)0x20000536 = 0;
    *(uint8_t*)0x20000537 = 0;
    *(uint8_t*)0x20000538 = 0;
    *(uint8_t*)0x20000539 = 0;
    *(uint8_t*)0x2000053a = 0;
    *(uint8_t*)0x2000053b = 0;
    *(uint8_t*)0x2000053c = 0;
    *(uint8_t*)0x2000053d = 0;
    *(uint8_t*)0x2000053e = 0;
    *(uint8_t*)0x2000053f = 0;
    *(uint8_t*)0x20000540 = 0;
    *(uint8_t*)0x20000541 = 0;
    *(uint8_t*)0x20000542 = 0;
    *(uint8_t*)0x20000543 = 0;
    *(uint8_t*)0x20000544 = 0;
    *(uint8_t*)0x20000545 = 0;
    *(uint8_t*)0x20000546 = 0;
    *(uint8_t*)0x20000547 = 0;
    *(uint8_t*)0x20000548 = 0;
    *(uint8_t*)0x20000549 = 0;
    *(uint8_t*)0x2000054a = 0;
    *(uint8_t*)0x2000054b = 0;
    *(uint8_t*)0x2000054c = 0;
    *(uint8_t*)0x2000054d = 0;
    *(uint8_t*)0x2000054e = 0;
    *(uint8_t*)0x2000054f = 0;
    syscall(__NR_ioctl, r[2], 0xc0505405, 0x20000500);
    syscall(__NR_getsockopt, -1, 1, 0x19, 0x20000080, 0x10);
    *(uint32_t*)0x200000c0 = 0;
    *(uint16_t*)0x200000c4 = 1;
    *(uint16_t*)0x200000c6 = 0xac;
    *(uint8_t*)0x200000c8 = -1;
    *(uint8_t*)0x200000c9 = -1;
    *(uint8_t*)0x200000ca = -1;
    *(uint8_t*)0x200000cb = -1;
    *(uint8_t*)0x200000cc = -1;
    *(uint8_t*)0x200000cd = -1;
    *(uint8_t*)0x200000ce = 0;
    *(uint8_t*)0x200000cf = 0;
    syscall(__NR_setsockopt, -1, 0x107, 1, 0x200000c0, 0x10);
  }
  
  int main()
  {
    syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
    char* cwd = get_current_dir_name();
    for (procid = 0; procid < 8; procid++) {
      if (fork() == 0) {
        for (;;) {
          if (chdir(cwd))
            fail("failed to chdir");
          use_temporary_dir();
          int pid = do_sandbox_namespace();
          int status = 0;
          while (waitpid(pid, &status, __WALL) != pid) {
          }
        }
      }
    }
    sleep(1000000);
    return 0;
  }
  