// KASAN: out-of-bounds Read in __list_del_entry_valid
// https://syzkaller.appspot.com/bug?id=090a62312af6a6444b8a7d67f443a57321532b04
// status:invalid
// autogenerated by syzkaller (http://github.com/google/syzkaller)

#ifndef __NR_userfaultfd
#define __NR_userfaultfd 323
#endif

#define _GNU_SOURCE

#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.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 <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/prctl.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <sys/wait.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);
}

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 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 int do_sandbox_none(int executor_pid, bool enable_tun)
{
  int pid = fork();
  if (pid)
    return pid;

  sandbox_common();
  setup_tun(executor_pid, enable_tun);

  loop();
  doexit(1);
}

static void test();

void loop()
{
  while (1) {
    test();
  }
}

long r[60];
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_mmap, 0x20000000ul, 0xfff000ul, 0x3ul, 0x32ul,
                   0xfffffffffffffffful, 0x0ul);
    break;
  case 2:
    NONFAILING(*(uint32_t*)0x203fb000 = (uint32_t)0x2);
    NONFAILING(*(uint32_t*)0x203fb004 = (uint32_t)0x78);
    NONFAILING(*(uint8_t*)0x203fb008 = (uint8_t)0x6350);
    NONFAILING(*(uint8_t*)0x203fb009 = (uint8_t)0x1);
    NONFAILING(*(uint8_t*)0x203fb00a = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x203fb00b = (uint8_t)0x0);
    NONFAILING(*(uint32_t*)0x203fb00c = (uint32_t)0x0);
    NONFAILING(*(uint64_t*)0x203fb010 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x203fb018 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x203fb020 = (uint64_t)0x0);
    NONFAILING(*(uint8_t*)0x203fb028 = (uint8_t)0xfe);
    NONFAILING(*(uint8_t*)0x203fb029 = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x203fb02a = (uint8_t)0x0);
    NONFAILING(*(uint8_t*)0x203fb02b = (uint8_t)0x0);
    NONFAILING(*(uint32_t*)0x203fb02c = (uint32_t)0x0);
    NONFAILING(*(uint32_t*)0x203fb030 = (uint32_t)0x0);
    NONFAILING(*(uint32_t*)0x203fb034 = (uint32_t)0x0);
    NONFAILING(*(uint64_t*)0x203fb038 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x203fb040 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x203fb048 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x203fb050 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x203fb058 = (uint64_t)0x0);
    NONFAILING(*(uint32_t*)0x203fb060 = (uint32_t)0x0);
    NONFAILING(*(uint64_t*)0x203fb068 = (uint64_t)0x0);
    NONFAILING(*(uint32_t*)0x203fb070 = (uint32_t)0x0);
    NONFAILING(*(uint16_t*)0x203fb074 = (uint16_t)0x0);
    NONFAILING(*(uint16_t*)0x203fb076 = (uint16_t)0x0);
    r[29] = syscall(__NR_perf_event_open, 0x203fb000ul, 0x0ul,
                    0xfffffffffffffffful, 0xfffffffffffffffful, 0x0ul);
    break;
  case 3:
    r[30] = syscall(__NR_mmap, 0x20000000ul, 0x14000ul, 0x3ul, 0x32ul,
                    0xfffffffffffffffful, 0x0ul);
    break;
  case 4:
    NONFAILING(*(uint64_t*)0x2000f000 = (uint64_t)0xafda);
    NONFAILING(*(uint64_t*)0x2000f008 = (uint64_t)0x0);
    r[33] = syscall(__NR_setrlimit, 0x7ul, 0x2000f000ul);
    break;
  case 5:
    r[34] = syscall(__NR_userfaultfd, 0x0ul);
    break;
  case 6:
    NONFAILING(*(uint64_t*)0x20054fe8 = (uint64_t)0xaa);
    NONFAILING(*(uint64_t*)0x20054ff0 = (uint64_t)0x52);
    NONFAILING(*(uint64_t*)0x20054ff8 = (uint64_t)0x0);
    r[38] = syscall(__NR_ioctl, r[34], 0xc018aa3ful, 0x20054fe8ul);
    break;
  case 7:
    NONFAILING(*(uint64_t*)0x20051fe8 = (uint64_t)0x20012000);
    NONFAILING(*(uint64_t*)0x20051ff0 = (uint64_t)0x2000);
    NONFAILING(*(uint64_t*)0x20051ff8 = (uint64_t)0x1);
    NONFAILING(*(uint64_t*)0x20052000 = (uint64_t)0x0);
    r[43] = syscall(__NR_ioctl, r[34], 0xc020aa00ul, 0x20051fe8ul);
    break;
  case 8:
    r[44] = syscall(__NR_clone, 0x0ul, 0x20d42ffful, 0x20d6f000ul,
                    0x20a6bffcul, 0x20497000ul);
    break;
  case 9:
    NONFAILING(*(uint64_t*)0x20053f90 = (uint64_t)0x20053000);
    NONFAILING(*(uint64_t*)0x20053f98 = (uint64_t)0x56);
    NONFAILING(*(uint64_t*)0x20053fa0 = (uint64_t)0x2002a000);
    NONFAILING(*(uint64_t*)0x20053fa8 = (uint64_t)0x14);
    NONFAILING(*(uint64_t*)0x20053fb0 = (uint64_t)0x20021fda);
    NONFAILING(*(uint64_t*)0x20053fb8 = (uint64_t)0x26);
    NONFAILING(*(uint64_t*)0x20053fc0 = (uint64_t)0x20053000);
    NONFAILING(*(uint64_t*)0x20053fc8 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x20053fd0 = (uint64_t)0x20053f9d);
    NONFAILING(*(uint64_t*)0x20053fd8 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x20053fe0 = (uint64_t)0x2000c000);
    NONFAILING(*(uint64_t*)0x20053fe8 = (uint64_t)0x0);
    NONFAILING(*(uint64_t*)0x20053ff0 = (uint64_t)0x2004bf77);
    NONFAILING(*(uint64_t*)0x20053ff8 = (uint64_t)0xf6);
    r[59] = syscall(__NR_readv, r[34], 0x20053f90ul, 0x7ul);
    break;
  }
  return 0;
}

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

  memset(r, -1, sizeof(r));
  srand(getpid());
  for (i = 0; i < 10; i++) {
    pthread_create(&th[i], 0, thr, (void*)i);
    usleep(rand() % 10000);
  }
  for (i = 0; i < 10; i++) {
    pthread_create(&th[10 + 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_none(i, true);
      int status = 0;
      while (waitpid(pid, &status, __WALL) != pid) {
      }
      return 0;
    }
  }
  sleep(1000000);
  return 0;
}
