// https://syzkaller.appspot.com/bug?id=479d6cbadd1e0f9effe7ffaaf3ce63cc14459988
// autogenerated by syzkaller (http://github.com/google/syzkaller)

#define _GNU_SOURCE

#include <arpa/inet.h>
#include <dirent.h>
#include <errno.h>
#include <errno.h>
#include <errno.h>
#include <errno.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/tcp.h>
#include <net/if_arp.h>
#include <pthread.h>
#include <sched.h>
#include <setjmp.h>
#include <signal.h>
#include <signal.h>
#include <signal.h>
#include <stdarg.h>
#include <stdarg.h>
#include <stdarg.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/mount.h>
#include <sys/mount.h>
#include <sys/prctl.h>
#include <sys/prctl.h>
#include <sys/resource.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/wait.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>

const int kFailStatus = 67;
const int kRetryStatus = 69;

__attribute__((noreturn)) static void doexit(int status)
{
  volatile unsigned i;
  syscall(__NR_exit_group, status);
  for (i = 0;; i++) {
  }
}

__attribute__((noreturn)) static void fail(const char* msg, ...)
{
  int e = errno;
  fflush(stdout);
  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);
}

__attribute__((noreturn)) static void exitf(const char* msg, ...)
{
  int e = errno;
  fflush(stdout);
  va_list args;
  va_start(args, msg);
  vfprintf(stderr, msg, args);
  va_end(args);
  fprintf(stderr, " (errno %d)\n", e);
  doexit(kRetryStatus);
}

static __thread int skip_segv;
static __thread jmp_buf segv_env;

static void segv_handler(int sig, siginfo_t* info, void* uctx)
{
  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);
  }
  doexit(sig);
  for (;;) {
  }
}

static void install_segv_handler()
{
  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 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

static void execute_command(const char* format, ...)
{
  va_list args;
  char command[COMMAND_MAX_LEN];
  int rv;

  va_start(args, format);

  vsnprintf_check(command, sizeof(command), format, args);
  rv = system(command);
  if (rv != 0)
    fail("tun: command \"%s\" failed with code %d", &command[0], rv);

  va_end(args);
}

static int tunfd = -1;

#define SYZ_TUN_MAX_PACKET_SIZE 1000

#define MAX_PIDS 32
#define ADDR_MAX_LEN 32

#define LOCAL_MAC "aa:aa:aa:aa:aa:%02hx"
#define REMOTE_MAC "bb:bb:bb:bb:bb:%02hx"

#define LOCAL_IPV4 "172.20.%d.170"
#define REMOTE_IPV4 "172.20.%d.187"

#define LOCAL_IPV6 "fe80::%02hxaa"
#define REMOTE_IPV6 "fe80::%02hxbb"

static void initialize_tun(uint64_t pid)
{
  if (pid >= MAX_PIDS)
    fail("tun: no more than %d executors", MAX_PIDS);
  int id = pid;

  tunfd = open("/dev/net/tun", O_RDWR | O_NONBLOCK);
  if (tunfd == -1)
    fail("tun: can't open /dev/net/tun");

  char iface[IFNAMSIZ];
  snprintf_check(iface, sizeof(iface), "syz%d", id);

  struct ifreq ifr;
  memset(&ifr, 0, sizeof(ifr));
  strncpy(ifr.ifr_name, iface, IFNAMSIZ);
  ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
  if (ioctl(tunfd, TUNSETIFF, (void*)&ifr) < 0)
    fail("tun: ioctl(TUNSETIFF) failed");

  char local_mac[ADDR_MAX_LEN];
  snprintf_check(local_mac, sizeof(local_mac), LOCAL_MAC, id);
  char remote_mac[ADDR_MAX_LEN];
  snprintf_check(remote_mac, sizeof(remote_mac), REMOTE_MAC, id);

  char local_ipv4[ADDR_MAX_LEN];
  snprintf_check(local_ipv4, sizeof(local_ipv4), LOCAL_IPV4, id);
  char remote_ipv4[ADDR_MAX_LEN];
  snprintf_check(remote_ipv4, sizeof(remote_ipv4), REMOTE_IPV4, id);

  char local_ipv6[ADDR_MAX_LEN];
  snprintf_check(local_ipv6, sizeof(local_ipv6), LOCAL_IPV6, id);
  char remote_ipv6[ADDR_MAX_LEN];
  snprintf_check(remote_ipv6, sizeof(remote_ipv6), REMOTE_IPV6, id);

  execute_command("sysctl -w net.ipv6.conf.%s.accept_dad=0", iface);

  execute_command("sysctl -w net.ipv6.conf.%s.router_solicitations=0",
                  iface);

  execute_command("ip link set dev %s address %s", iface, local_mac);
  execute_command("ip addr add %s/24 dev %s", local_ipv4, iface);
  execute_command("ip -6 addr add %s/120 dev %s", local_ipv6, iface);
  execute_command("ip neigh add %s lladdr %s dev %s nud permanent",
                  remote_ipv4, remote_mac, iface);
  execute_command("ip -6 neigh add %s lladdr %s dev %s nud permanent",
                  remote_ipv6, remote_mac, iface);
  execute_command("ip link set dev %s up", iface);
}

static void setup_tun(uint64_t pid, bool enable_tun)
{
  if (enable_tun)
    initialize_tun(pid);
}

static int read_tun(char* data, int size)
{
  int rv = read(tunfd, data, size);
  if (rv < 0) {
    if (errno == EAGAIN)
      return -1;
    fail("tun: read failed with %d, errno: %d", rv, errno);
  }
  return rv;
}

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

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 = 128 << 20;
  setrlimit(RLIMIT_AS, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 8 << 20;
  setrlimit(RLIMIT_MEMLOCK, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 1 << 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);

  unshare(CLONE_NEWNS);
  unshare(CLONE_NEWIPC);
  unshare(CLONE_IO);
}

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) {
    close(fd);
    return false;
  }
  close(fd);
  return true;
}

static int real_uid;
static int real_gid;
static int epid;
static bool etun;
__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");

  setup_tun(epid, etun);

  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");
  if (mount("/dev", "./syz-tmp/newroot/dev", NULL,
            MS_BIND | MS_REC | MS_PRIVATE, 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/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(int executor_pid, bool enable_tun)
{
  real_uid = getuid();
  real_gid = getgid();
  epid = executor_pid;
  etun = enable_tun;
  mprotect(sandbox_stack, 4096, PROT_NONE);
  return clone(
      namespace_sandbox_proc,
      &sandbox_stack[sizeof(sandbox_stack) - 64],
      CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWUTS | CLONE_NEWNET, NULL);
}

static void remove_dir(const char* dir)
{
  DIR* dp;
  struct dirent* ep;
  int iter = 0;
retry:
  dp = opendir(dir);
  if (dp == NULL) {
    if (errno == EMFILE) {
      exitf("opendir(%s) failed due to NOFILE, exiting");
    }
    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 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 test();

void loop()
{
  int iter;
  for (iter = 0;; iter++) {
    char cwdbuf[256];
    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");
      flush_tun();
      test();
      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 > 5 * 1000) {
        kill(-pid, SIGKILL);
        kill(pid, SIGKILL);
        while (waitpid(-1, &status, __WALL) != pid) {
        }
        break;
      }
    }
    remove_dir(cwdbuf);
  }
}

long r[115];
void* thr(void* arg)
{
  switch ((long)arg) {
  case 0:
    r[0] = syscall(__NR_mmap, 0x20000000ul, 0xfff000ul, 0x3ul, 0x32ul,
                   0xfffffffffffffffful, 0x0ul);
    break;
  case 1:
    r[1] =
        syscall(__NR_socket, 0x4000000000011ul, 0x100000802ul, 0x5ul);
    break;
  case 2:
    r[2] = syscall(__NR_socket, 0x1ful, 0x3ul, 0x3ul);
    break;
  case 3:
    NONFAILING(*(uint16_t*)0x2042dea0 = (uint16_t)0x2);
    NONFAILING(*(uint16_t*)0x2042dea2 = (uint16_t)0x224e);
    NONFAILING(*(uint32_t*)0x2042dea4 = (uint32_t)0x100007f);
    NONFAILING(*(uint8_t*)0x2042dea8 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042dea9 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042deaa = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042deab = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042deac = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042dead = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042deae = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042deaf = (uint8_t)0x0);
    NONFAILING(*(uint64_t*)0x2042deb0 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042deb8 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042dec0 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042dec8 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042ded0 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042ded8 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042dee0 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042dee8 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042def0 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042def8 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df00 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df08 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df10 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df18 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df20 = (uint64_t)0x0);
    NONFAILING(*(uint16_t*)0x2042df28 = (uint16_t)0xa);
    NONFAILING(*(uint16_t*)0x2042df2a = (uint16_t)0x214e);
    NONFAILING(*(uint32_t*)0x2042df2c = (uint32_t)0x45);
    NONFAILING(*(uint8_t*)0x2042df30 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df31 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df32 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df33 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df34 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df35 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df36 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df37 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df38 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df39 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df3a = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df3b = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df3c = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df3d = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df3e = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2042df3f = (uint8_t)0x0);
    NONFAILING(*(uint32_t*)0x2042df40 = (uint32_t)0x80);
    NONFAILING(*(uint64_t*)0x2042df48 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df50 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df58 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df60 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df68 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df70 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df78 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df80 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df88 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df90 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042df98 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x2042dfa0 = (uint64_t)0x0);
    NONFAILING(*(uint16_t*)0x2042dfa8 = (uint16_t)0x3);
    NONFAILING(*(uint16_t*)0x2042dfaa = (uint16_t)0x800);
    NONFAILING(*(uint32_t*)0x2042dfac = (uint32_t)0xffff);
    NONFAILING(memcpy((void*)0x2042dfb0,
                      "\x35\xaf\xb6\x66\x7c\xa9\x98\x1a\x7f\xba\x01\x2d"
                      "\x49\x78\x66\x3a\x73\x18\x75\xe9\xaf\x3f\x75\x35"
                      "\x4a\xba\xa1\x3e\x9d\x8a\x94\xc5\x1e\xdf\xb8\x21"
                      "\xac\xa5\x02\x65\xfc\x33\x0c\x36\x15\xff\x51\x6b"
                      "\x62\x9c\x26\xbf\x6e\x04\xd0\x36\x14\xa0\xaf\x33"
                      "\xa0\xda\x1e\x80\xc8\x1a\xda\x96\x11\xcd\xad\xa6"
                      "\xe6\xac\xf5\xf9\x9e\x66\xbe\x8a",
                      80));
    r[65] = syscall(__NR_setsockopt, r[1], 0x6ul, 0xeul, 0x2042dea0ul,
                    0x160ul);
    break;
  case 4:
    NONFAILING(*(uint16_t*)0x20fe2000 = (uint16_t)0x11);
    NONFAILING(memcpy(
        (void*)0x20fe2002,
        "\x00\x00\x01\x00\x00\x00\x00\x00\x08\x00\x44\x94\x4e\xeb\xa7"
        "\x1a\x49\x76\xe2\x52\x92\x2c\xb1\x8f\x6e\x2e\x2a\xba\x00\x00"
        "\x00\x01\x2e\x0b\x38\x36\x00\x54\x04\xb0\xe0\x30\x1a\x4c\xe8"
        "\x75\xf2\xe3\xff\x5f\x16\x3e\xe3\x40\xb7\x67\x95\x00\x80\x00"
        "\x00\x00\x00\x00\x00\x01\x01\x01\x3c\x58\x11\x03\x9e\x15\x77"
        "\x50\x27\xec\xce\x66\xfd\x79\x2b\xbf\x0e\x5b\xf5\xff\x1b\x08"
        "\x16\xf3\xf6\xdb\x1c\x00\x01\x00\x00\x00\x00\x00\x00\x00\x49"
        "\x74\x00\x00\x00\x00\x00\x00\x00\x06\xad\x8e\x5e\xcc\x32\x6d"
        "\x3a\x09\xff\xc2\xc6\x54",
        126));
    r[68] = syscall(__NR_bind, r[2], 0x20fe2000ul, 0x80ul);
    break;
  case 5:
    r[69] = syscall(__NR_write, r[1], 0x20083fd7ul, 0x0ul);
    break;
  case 6:
    NONFAILING(*(uint32_t*)0x20dedff0 = (uint32_t)0xed);
    NONFAILING(*(uint32_t*)0x20dedff4 = (uint32_t)0x5);
    NONFAILING(*(uint32_t*)0x20dedff8 = (uint32_t)0x2);
    NONFAILING(*(uint16_t*)0x20dedffc = (uint16_t)0x5);
    r[74] = syscall(__NR_setsockopt, r[1], 0x0ul, 0x2ul, 0x20dedff0ul,
                    0x10ul);
    break;
  case 7:
    NONFAILING(*(uint8_t*)0x20b42000 = (uint8_t)0x73);
    NONFAILING(*(uint8_t*)0x20b42001 = (uint8_t)0x79);
    NONFAILING(*(uint8_t*)0x20b42002 = (uint8_t)0x7a);
    NONFAILING(*(uint8_t*)0x20b42003 = (uint8_t)0x30);
    NONFAILING(*(uint8_t*)0x20b42004 = (uint8_t)0x0);
    r[80] = syscall(__NR_setsockopt, r[2], 0x1ul, 0x19ul, 0x20b42000ul,
                    0x10ul);
    break;
  case 8:
    NONFAILING(*(uint8_t*)0x2099f000 = (uint8_t)0x73);
    NONFAILING(*(uint8_t*)0x2099f001 = (uint8_t)0x79);
    NONFAILING(*(uint8_t*)0x2099f002 = (uint8_t)0x7a);
    NONFAILING(*(uint8_t*)0x2099f003 = (uint8_t)0x30);
    NONFAILING(*(uint8_t*)0x2099f004 = (uint8_t)0x0);
    NONFAILING(*(uint32_t*)0x2099f010 = (uint32_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f014 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f015 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f016 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f017 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f018 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f019 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f01a = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f01b = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f01c = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f01d = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f01e = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f01f = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f020 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f021 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f022 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f023 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f024 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f025 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f026 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x2099f027 = (uint8_t)0x0);
    r[107] = syscall(__NR_ioctl, r[2], 0x8933ul, 0x2099f000ul);
    break;
  case 9:
    NONFAILING(*(uint16_t*)0x208a8f80 = (uint16_t)0x11);
    NONFAILING(memcpy(
        (void*)0x208a8f82,
        "\x01\x00\x01\x00\x00\x00\x00\x00\x08\x00\x44\x94\x4e\xeb\xa7"
        "\x1a\x49\x76\xe2\x4c\x92\x2c\xb1\x8f\x6e\x2e\x2a\xba\x00\x00"
        "\x00\x01\x2e\x0b\x38\x36\x00\x54\x04\xb0\xe0\x30\x1a\x52\xe8"
        "\x75\xf2\xe3\xff\x5f\x16\x3e\xe3\x40\xb7\x67\x95\x00\x80\x00"
        "\x00\x00\x00\x00\x00\x01\x01\x01\x3c\x58\x11\x03\x00\x00\x00"
        "\x00\x00\x00\x00\x66\xfd\x79\x2b\xbf\x0e\x5b\xf5\xff\x1b\x08"
        "\x16\xf3\xf6\xdb\x1c\x00\x01\x00\x00\x00\x00\x00\x00\x00\x49"
        "\x74\x00\x00\x00\x00\x00\x00\x00\x06\xad\x8e\x5e\xcc\x32\x6d"
        "\x3a\x09\xff\xc2\xc6\x54",
        126));
    r[110] = syscall(__NR_bind, r[1], 0x208a8f80ul, 0x80ul);
    break;
  case 10:
    NONFAILING(*(uint16_t*)0x2052e000 = (uint16_t)0xc78);
    NONFAILING(*(uint8_t*)0x2052e002 = (uint8_t)0x7);
    NONFAILING(*(uint8_t*)0x2052e003 = (uint8_t)0x8000);
    r[114] = syscall(__NR_setsockopt, r[1], 0x107ul, 0x12ul,
                     0x2052e000ul, 0x4ul);
    break;
  }
  return 0;
}

void test()
{
  long i;
  pthread_t th[22];

  memset(r, -1, sizeof(r));
  srand(getpid());
  for (i = 0; i < 11; i++) {
    pthread_create(&th[i], 0, thr, (void*)i);
    usleep(rand() % 10000);
  }
  for (i = 0; i < 11; i++) {
    pthread_create(&th[11 + i], 0, thr, (void*)i);
    if (rand() % 2)
      usleep(rand() % 10000);
  }
  usleep(rand() % 100000);
}

int main()
{
  int i;
  for (i = 0; i < 8; i++) {
    if (fork() == 0) {
      install_segv_handler();
      use_temporary_dir();
      int pid = do_sandbox_namespace(i, true);
      int status = 0;
      while (waitpid(pid, &status, __WALL) != pid) {
      }
      return 0;
    }
  }
  sleep(1000000);
  return 0;
}