// WARNING: refcount bug in cdev_get
// https://syzkaller.appspot.com/bug?id=5efc1b8ee47e4d47eab6aefdaa195a72ca78146b
// status:open
// autogenerated by syzkaller (https://github.com/google/syzkaller)

#define _GNU_SOURCE

#include <dirent.h>
#include <endian.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <signal.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/prctl.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>

#include <linux/futex.h>

unsigned long long procid;

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 thread_start(void* (*fn)(void*), void* arg)
{
  pthread_t th;
  pthread_attr_t attr;
  pthread_attr_init(&attr);
  pthread_attr_setstacksize(&attr, 128 << 10);
  int i;
  for (i = 0; i < 100; i++) {
    if (pthread_create(&th, &attr, fn, arg) == 0) {
      pthread_attr_destroy(&attr);
      return;
    }
    if (errno == EAGAIN) {
      usleep(50);
      continue;
    }
    break;
  }
  exit(1);
}

typedef struct {
  int state;
} event_t;

static void event_init(event_t* ev)
{
  ev->state = 0;
}

static void event_reset(event_t* ev)
{
  ev->state = 0;
}

static void event_set(event_t* ev)
{
  if (ev->state)
    exit(1);
  __atomic_store_n(&ev->state, 1, __ATOMIC_RELEASE);
  syscall(SYS_futex, &ev->state, FUTEX_WAKE | FUTEX_PRIVATE_FLAG);
}

static void event_wait(event_t* ev)
{
  while (!__atomic_load_n(&ev->state, __ATOMIC_ACQUIRE))
    syscall(SYS_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, 0);
}

static int event_isset(event_t* ev)
{
  return __atomic_load_n(&ev->state, __ATOMIC_ACQUIRE);
}

static int event_timedwait(event_t* ev, uint64_t timeout)
{
  uint64_t start = current_time_ms();
  uint64_t now = start;
  for (;;) {
    uint64_t remain = timeout - (now - start);
    struct timespec ts;
    ts.tv_sec = remain / 1000;
    ts.tv_nsec = (remain % 1000) * 1000 * 1000;
    syscall(SYS_futex, &ev->state, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, 0, &ts);
    if (__atomic_load_n(&ev->state, __ATOMIC_RELAXED))
      return 1;
    now = current_time_ms();
    if (now - start > timeout)
      return 0;
  }
}

static 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 long syz_open_dev(volatile long a0, volatile long a1, volatile long a2)
{
  if (a0 == 0xc || a0 == 0xb) {
    char buf[128];
    sprintf(buf, "/dev/%s/%d:%d", a0 == 0xc ? "char" : "block", (uint8_t)a1,
            (uint8_t)a2);
    return open(buf, O_RDWR, 0);
  } else {
    char buf[1024];
    char* hash;
    strncpy(buf, (char*)a0, sizeof(buf) - 1);
    buf[sizeof(buf) - 1] = 0;
    while ((hash = strchr(buf, '#'))) {
      *hash = '0' + (char)(a1 % 10);
      a1 /= 10;
    }
    return open(buf, a2, 0);
  }
}

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) {
  }
}

static void setup_test()
{
  prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
  setpgrp();
  write_file("/proc/self/oom_score_adj", "1000");
}

struct thread_t {
  int created, call;
  event_t ready, done;
};

static struct thread_t threads[16];
static void execute_call(int call);
static int running;

static void* thr(void* arg)
{
  struct thread_t* th = (struct thread_t*)arg;
  for (;;) {
    event_wait(&th->ready);
    event_reset(&th->ready);
    execute_call(th->call);
    __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
    event_set(&th->done);
  }
  return 0;
}

static void execute_one(void)
{
  int i, call, thread;
  for (call = 0; call < 4; call++) {
    for (thread = 0; thread < (int)(sizeof(threads) / sizeof(threads[0]));
         thread++) {
      struct thread_t* th = &threads[thread];
      if (!th->created) {
        th->created = 1;
        event_init(&th->ready);
        event_init(&th->done);
        event_set(&th->done);
        thread_start(thr, th);
      }
      if (!event_isset(&th->done))
        continue;
      event_reset(&th->done);
      th->call = call;
      __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
      event_set(&th->ready);
      event_timedwait(&th->done, 45);
      break;
    }
  }
  for (i = 0; i < 100 && __atomic_load_n(&running, __ATOMIC_RELAXED); i++)
    sleep_ms(1);
}

static void execute_one(void);

#define WAIT_FLAGS __WALL

static void loop(void)
{
  int iter;
  for (iter = 0;; iter++) {
    int pid = fork();
    if (pid < 0)
      exit(1);
    if (pid == 0) {
      setup_test();
      execute_one();
      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;
    }
  }
}

uint64_t r[1] = {0xffffffffffffffff};

void execute_call(int call)
{
  intptr_t res;
  switch (call) {
  case 0:
    memcpy((void*)0x20000000, "/dev/uinput\000", 12);
    res = syscall(__NR_openat, 0xffffffffffffff9c, 0x20000000, 2, 0);
    if (res != -1)
      r[0] = res;
    break;
  case 1:
    memcpy((void*)0x20000b40,
           "syz1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
           "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
           "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
           "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
           "\000\000\000\000\000\000\000\000\000\000\000\000\000",
           80);
    *(uint16_t*)0x20000b90 = 0;
    *(uint16_t*)0x20000b92 = 0;
    *(uint16_t*)0x20000b94 = 0;
    *(uint16_t*)0x20000b96 = 0;
    *(uint32_t*)0x20000b98 = 0;
    *(uint32_t*)0x20000b9c = 0;
    *(uint32_t*)0x20000ba0 = 0;
    *(uint32_t*)0x20000ba4 = 0;
    *(uint32_t*)0x20000ba8 = 0;
    *(uint32_t*)0x20000bac = 0;
    *(uint32_t*)0x20000bb0 = 0;
    *(uint32_t*)0x20000bb4 = 0;
    *(uint32_t*)0x20000bb8 = 0;
    *(uint32_t*)0x20000bbc = 0;
    *(uint32_t*)0x20000bc0 = 0;
    *(uint32_t*)0x20000bc4 = 0;
    *(uint32_t*)0x20000bc8 = 0;
    *(uint32_t*)0x20000bcc = 0;
    *(uint32_t*)0x20000bd0 = 0;
    *(uint32_t*)0x20000bd4 = 0;
    *(uint32_t*)0x20000bd8 = 0;
    *(uint32_t*)0x20000bdc = 0;
    *(uint32_t*)0x20000be0 = 0;
    *(uint32_t*)0x20000be4 = 0;
    *(uint32_t*)0x20000be8 = 0;
    *(uint32_t*)0x20000bec = 0;
    *(uint32_t*)0x20000bf0 = 0;
    *(uint32_t*)0x20000bf4 = 0;
    *(uint32_t*)0x20000bf8 = 0;
    *(uint32_t*)0x20000bfc = 0;
    *(uint32_t*)0x20000c00 = 0;
    *(uint32_t*)0x20000c04 = 0;
    *(uint32_t*)0x20000c08 = 0;
    *(uint32_t*)0x20000c0c = 0;
    *(uint32_t*)0x20000c10 = 0;
    *(uint32_t*)0x20000c14 = 0;
    *(uint32_t*)0x20000c18 = 0;
    *(uint32_t*)0x20000c1c = 0;
    *(uint32_t*)0x20000c20 = 0;
    *(uint32_t*)0x20000c24 = 0;
    *(uint32_t*)0x20000c28 = 0;
    *(uint32_t*)0x20000c2c = 0;
    *(uint32_t*)0x20000c30 = 0;
    *(uint32_t*)0x20000c34 = 0;
    *(uint32_t*)0x20000c38 = 0;
    *(uint32_t*)0x20000c3c = 0;
    *(uint32_t*)0x20000c40 = 0;
    *(uint32_t*)0x20000c44 = 0;
    *(uint32_t*)0x20000c48 = 0;
    *(uint32_t*)0x20000c4c = 0;
    *(uint32_t*)0x20000c50 = 0;
    *(uint32_t*)0x20000c54 = 0;
    *(uint32_t*)0x20000c58 = 0;
    *(uint32_t*)0x20000c5c = 0;
    *(uint32_t*)0x20000c60 = 0;
    *(uint32_t*)0x20000c64 = 0;
    *(uint32_t*)0x20000c68 = 0;
    *(uint32_t*)0x20000c6c = 0;
    *(uint32_t*)0x20000c70 = 0;
    *(uint32_t*)0x20000c74 = 0;
    *(uint32_t*)0x20000c78 = 0;
    *(uint32_t*)0x20000c7c = 0;
    *(uint32_t*)0x20000c80 = 0;
    *(uint32_t*)0x20000c84 = 0;
    *(uint32_t*)0x20000c88 = 0;
    *(uint32_t*)0x20000c8c = 0;
    *(uint32_t*)0x20000c90 = 0;
    *(uint32_t*)0x20000c94 = 0;
    *(uint32_t*)0x20000c98 = 0;
    *(uint32_t*)0x20000c9c = 0;
    *(uint32_t*)0x20000ca0 = 0;
    *(uint32_t*)0x20000ca4 = 0;
    *(uint32_t*)0x20000ca8 = 0;
    *(uint32_t*)0x20000cac = 0;
    *(uint32_t*)0x20000cb0 = 0;
    *(uint32_t*)0x20000cb4 = 0;
    *(uint32_t*)0x20000cb8 = 0;
    *(uint32_t*)0x20000cbc = 0;
    *(uint32_t*)0x20000cc0 = 0;
    *(uint32_t*)0x20000cc4 = 0;
    *(uint32_t*)0x20000cc8 = 0;
    *(uint32_t*)0x20000ccc = 0;
    *(uint32_t*)0x20000cd0 = 0;
    *(uint32_t*)0x20000cd4 = 0;
    *(uint32_t*)0x20000cd8 = 0;
    *(uint32_t*)0x20000cdc = 0;
    *(uint32_t*)0x20000ce0 = 0;
    *(uint32_t*)0x20000ce4 = 0;
    *(uint32_t*)0x20000ce8 = 0;
    *(uint32_t*)0x20000cec = 0;
    *(uint32_t*)0x20000cf0 = 0;
    *(uint32_t*)0x20000cf4 = 0;
    *(uint32_t*)0x20000cf8 = 0;
    *(uint32_t*)0x20000cfc = 0;
    *(uint32_t*)0x20000d00 = 0;
    *(uint32_t*)0x20000d04 = 0;
    *(uint32_t*)0x20000d08 = 0;
    *(uint32_t*)0x20000d0c = 0;
    *(uint32_t*)0x20000d10 = 0;
    *(uint32_t*)0x20000d14 = 0;
    *(uint32_t*)0x20000d18 = 0;
    *(uint32_t*)0x20000d1c = 0;
    *(uint32_t*)0x20000d20 = 0;
    *(uint32_t*)0x20000d24 = 0;
    *(uint32_t*)0x20000d28 = 0;
    *(uint32_t*)0x20000d2c = 0;
    *(uint32_t*)0x20000d30 = 0;
    *(uint32_t*)0x20000d34 = 0;
    *(uint32_t*)0x20000d38 = 0;
    *(uint32_t*)0x20000d3c = 0;
    *(uint32_t*)0x20000d40 = 0;
    *(uint32_t*)0x20000d44 = 0;
    *(uint32_t*)0x20000d48 = 0;
    *(uint32_t*)0x20000d4c = 0;
    *(uint32_t*)0x20000d50 = 0;
    *(uint32_t*)0x20000d54 = 0;
    *(uint32_t*)0x20000d58 = 0;
    *(uint32_t*)0x20000d5c = 0;
    *(uint32_t*)0x20000d60 = 0;
    *(uint32_t*)0x20000d64 = 0;
    *(uint32_t*)0x20000d68 = 0;
    *(uint32_t*)0x20000d6c = 0;
    *(uint32_t*)0x20000d70 = 0;
    *(uint32_t*)0x20000d74 = 0;
    *(uint32_t*)0x20000d78 = 0;
    *(uint32_t*)0x20000d7c = 0;
    *(uint32_t*)0x20000d80 = 0;
    *(uint32_t*)0x20000d84 = 0;
    *(uint32_t*)0x20000d88 = 0;
    *(uint32_t*)0x20000d8c = 0;
    *(uint32_t*)0x20000d90 = 0;
    *(uint32_t*)0x20000d94 = 0;
    *(uint32_t*)0x20000d98 = 0;
    *(uint32_t*)0x20000d9c = 0;
    *(uint32_t*)0x20000da0 = 0;
    *(uint32_t*)0x20000da4 = 0;
    *(uint32_t*)0x20000da8 = 0;
    *(uint32_t*)0x20000dac = 0;
    *(uint32_t*)0x20000db0 = 0;
    *(uint32_t*)0x20000db4 = 0;
    *(uint32_t*)0x20000db8 = 0;
    *(uint32_t*)0x20000dbc = 0;
    *(uint32_t*)0x20000dc0 = 0;
    *(uint32_t*)0x20000dc4 = 0;
    *(uint32_t*)0x20000dc8 = 0;
    *(uint32_t*)0x20000dcc = 0;
    *(uint32_t*)0x20000dd0 = 0;
    *(uint32_t*)0x20000dd4 = 0;
    *(uint32_t*)0x20000dd8 = 0;
    *(uint32_t*)0x20000ddc = 0;
    *(uint32_t*)0x20000de0 = 0;
    *(uint32_t*)0x20000de4 = 0;
    *(uint32_t*)0x20000de8 = 0;
    *(uint32_t*)0x20000dec = 0;
    *(uint32_t*)0x20000df0 = 0;
    *(uint32_t*)0x20000df4 = 0;
    *(uint32_t*)0x20000df8 = 0;
    *(uint32_t*)0x20000dfc = 0;
    *(uint32_t*)0x20000e00 = 0;
    *(uint32_t*)0x20000e04 = 0;
    *(uint32_t*)0x20000e08 = 0;
    *(uint32_t*)0x20000e0c = 0;
    *(uint32_t*)0x20000e10 = 0;
    *(uint32_t*)0x20000e14 = 0;
    *(uint32_t*)0x20000e18 = 0;
    *(uint32_t*)0x20000e1c = 0;
    *(uint32_t*)0x20000e20 = 0;
    *(uint32_t*)0x20000e24 = 0;
    *(uint32_t*)0x20000e28 = 0;
    *(uint32_t*)0x20000e2c = 0;
    *(uint32_t*)0x20000e30 = 0;
    *(uint32_t*)0x20000e34 = 0;
    *(uint32_t*)0x20000e38 = 0;
    *(uint32_t*)0x20000e3c = 0;
    *(uint32_t*)0x20000e40 = 0;
    *(uint32_t*)0x20000e44 = 0;
    *(uint32_t*)0x20000e48 = 0;
    *(uint32_t*)0x20000e4c = 0;
    *(uint32_t*)0x20000e50 = 0;
    *(uint32_t*)0x20000e54 = 0;
    *(uint32_t*)0x20000e58 = 0;
    *(uint32_t*)0x20000e5c = 0;
    *(uint32_t*)0x20000e60 = 0;
    *(uint32_t*)0x20000e64 = 0;
    *(uint32_t*)0x20000e68 = 0;
    *(uint32_t*)0x20000e6c = 0;
    *(uint32_t*)0x20000e70 = 0;
    *(uint32_t*)0x20000e74 = 0;
    *(uint32_t*)0x20000e78 = 0;
    *(uint32_t*)0x20000e7c = 0;
    *(uint32_t*)0x20000e80 = 0;
    *(uint32_t*)0x20000e84 = 0;
    *(uint32_t*)0x20000e88 = 0;
    *(uint32_t*)0x20000e8c = 0;
    *(uint32_t*)0x20000e90 = 0;
    *(uint32_t*)0x20000e94 = 0;
    *(uint32_t*)0x20000e98 = 0;
    *(uint32_t*)0x20000e9c = 0;
    *(uint32_t*)0x20000ea0 = 0;
    *(uint32_t*)0x20000ea4 = 0;
    *(uint32_t*)0x20000ea8 = 0;
    *(uint32_t*)0x20000eac = 0;
    *(uint32_t*)0x20000eb0 = 0;
    *(uint32_t*)0x20000eb4 = 0;
    *(uint32_t*)0x20000eb8 = 0;
    *(uint32_t*)0x20000ebc = 0;
    *(uint32_t*)0x20000ec0 = 0;
    *(uint32_t*)0x20000ec4 = 0;
    *(uint32_t*)0x20000ec8 = 0;
    *(uint32_t*)0x20000ecc = 0;
    *(uint32_t*)0x20000ed0 = 0;
    *(uint32_t*)0x20000ed4 = 0;
    *(uint32_t*)0x20000ed8 = 0;
    *(uint32_t*)0x20000edc = 0;
    *(uint32_t*)0x20000ee0 = 0;
    *(uint32_t*)0x20000ee4 = 0;
    *(uint32_t*)0x20000ee8 = 0;
    *(uint32_t*)0x20000eec = 0;
    *(uint32_t*)0x20000ef0 = 0;
    *(uint32_t*)0x20000ef4 = 0;
    *(uint32_t*)0x20000ef8 = 0;
    *(uint32_t*)0x20000efc = 0;
    *(uint32_t*)0x20000f00 = 0;
    *(uint32_t*)0x20000f04 = 0;
    *(uint32_t*)0x20000f08 = 0;
    *(uint32_t*)0x20000f0c = 0;
    *(uint32_t*)0x20000f10 = 0;
    *(uint32_t*)0x20000f14 = 0;
    *(uint32_t*)0x20000f18 = 0;
    *(uint32_t*)0x20000f1c = 0;
    *(uint32_t*)0x20000f20 = 0;
    *(uint32_t*)0x20000f24 = 0;
    *(uint32_t*)0x20000f28 = 0;
    *(uint32_t*)0x20000f2c = 0;
    *(uint32_t*)0x20000f30 = 0;
    *(uint32_t*)0x20000f34 = 0;
    *(uint32_t*)0x20000f38 = 0;
    *(uint32_t*)0x20000f3c = 0;
    *(uint32_t*)0x20000f40 = 0;
    *(uint32_t*)0x20000f44 = 0;
    *(uint32_t*)0x20000f48 = 0;
    *(uint32_t*)0x20000f4c = 0;
    *(uint32_t*)0x20000f50 = 0;
    *(uint32_t*)0x20000f54 = 0;
    *(uint32_t*)0x20000f58 = 0;
    *(uint32_t*)0x20000f5c = 0;
    *(uint32_t*)0x20000f60 = 0;
    *(uint32_t*)0x20000f64 = 0;
    *(uint32_t*)0x20000f68 = 0;
    *(uint32_t*)0x20000f6c = 0;
    *(uint32_t*)0x20000f70 = 0;
    *(uint32_t*)0x20000f74 = 0;
    *(uint32_t*)0x20000f78 = 0;
    *(uint32_t*)0x20000f7c = 0;
    *(uint32_t*)0x20000f80 = 0;
    *(uint32_t*)0x20000f84 = 0;
    *(uint32_t*)0x20000f88 = 0;
    *(uint32_t*)0x20000f8c = 0;
    *(uint32_t*)0x20000f90 = 0;
    *(uint32_t*)0x20000f94 = 0;
    *(uint32_t*)0x20000f98 = 0;
    syscall(__NR_write, r[0], 0x20000b40, 0x45c);
    break;
  case 2:
    syscall(__NR_ioctl, r[0], 0x5501, 0);
    break;
  case 3:
    memcpy((void*)0x20000b00, "/dev/input/event#\000", 18);
    syz_open_dev(0x20000b00, 4, 0);
    break;
  }
}
int main(void)
{
  syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
  for (procid = 0; procid < 6; procid++) {
    if (fork() == 0) {
      loop();
    }
  }
  sleep(1000000);
  return 0;
}
