// WARNING: ODEBUG bug in p9_fd_close
// https://syzkaller.appspot.com/bug?id=b1259f9a8ed763aa4914809e9ae43d4d1fcc8b26
// status:open
// autogenerated by syzkaller (http://github.com/google/syzkaller)

#define _GNU_SOURCE
#include <endian.h>
#include <errno.h>
#include <linux/futex.h>
#include <pthread.h>
#include <signal.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/prctl.h>
#include <sys/syscall.h>
#include <sys/time.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 <string.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 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 execute_one();
extern unsigned long long procid;

static void loop()
{
  int iter;
  for (iter = 0;; iter++) {
    int pid = fork();
    if (pid < 0)
      fail("clone failed");
    if (pid == 0) {
      prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
      setpgrp();
      execute_one();
      int fd;
      for (fd = 3; fd < 30; fd++)
        close(fd);
      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)
        continue;
      kill(-pid, SIGKILL);
      kill(pid, SIGKILL);
      while (waitpid(-1, &status, __WALL) != pid) {
      }
      break;
    }
  }
}

struct thread_t {
  int created, running, call;
  pthread_t th;
};

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 (;;) {
    while (!__atomic_load_n(&th->running, __ATOMIC_ACQUIRE))
      syscall(SYS_futex, &th->running, FUTEX_WAIT, 0, 0);
    execute_call(th->call);
    __atomic_fetch_sub(&running, 1, __ATOMIC_RELAXED);
    __atomic_store_n(&th->running, 0, __ATOMIC_RELEASE);
    syscall(SYS_futex, &th->running, FUTEX_WAKE);
  }
  return 0;
}

static void execute(int num_calls)
{
  int call, thread;
  running = 0;
  for (call = 0; call < num_calls; call++) {
    for (thread = 0; thread < sizeof(threads) / sizeof(threads[0]); thread++) {
      struct thread_t* th = &threads[thread];
      if (!th->created) {
        th->created = 1;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_attr_setstacksize(&attr, 128 << 10);
        pthread_create(&th->th, &attr, thr, th);
      }
      if (!__atomic_load_n(&th->running, __ATOMIC_ACQUIRE)) {
        th->call = call;
        __atomic_fetch_add(&running, 1, __ATOMIC_RELAXED);
        __atomic_store_n(&th->running, 1, __ATOMIC_RELEASE);
        syscall(SYS_futex, &th->running, FUTEX_WAKE);
        struct timespec ts;
        ts.tv_sec = 0;
        ts.tv_nsec = 20 * 1000 * 1000;
        syscall(SYS_futex, &th->running, FUTEX_WAIT, 1, &ts);
        if (__atomic_load_n(&running, __ATOMIC_RELAXED))
          usleep((call == num_calls - 1) ? 10000 : 1000);
        break;
      }
    }
  }
}

#ifndef __NR_write
#define __NR_write 4
#endif
#ifndef __NR_mount
#define __NR_mount 21
#endif
#ifndef __NR_mmap
#define __NR_mmap 192
#endif
#ifndef __NR_removexattr
#define __NR_removexattr 235
#endif
#ifndef __NR_mkdir
#define __NR_mkdir 39
#endif
#ifndef __NR_pipe2
#define __NR_pipe2 331
#endif
#undef __NR_mmap
#define __NR_mmap __NR_mmap2

uint64_t r[2] = {0xffffffffffffffff, 0xffffffffffffffff};
unsigned long long procid;
void execute_call(int call)
{
  long res;
  switch (call) {
  case 0:
    memcpy((void*)0x20000000, "./file0", 8);
    memcpy((void*)0x20000040, "system.", 7);
    memcpy((void*)0x20000047, "eth1,", 6);
    syscall(__NR_removexattr, 0x20000000, 0x20000040);
    break;
  case 1:
    memcpy((void*)0x20000080, "./file0", 8);
    syscall(__NR_mkdir, 0x20000080, 2);
    break;
  case 2:
    res = syscall(__NR_pipe2, 0x200000c0, 0x80000);
    if (res != -1) {
      r[0] = *(uint32_t*)0x200000c0;
      r[1] = *(uint32_t*)0x200000c4;
    }
    break;
  case 3:
    *(uint32_t*)0x20000100 = 0x10;
    *(uint8_t*)0x20000104 = 0x17;
    *(uint16_t*)0x20000105 = 1;
    *(uint16_t*)0x20000107 = 7;
    memcpy((void*)0x20000109, "./file0", 7);
    syscall(__NR_write, r[1], 0x20000100, 0x10);
    break;
  case 4:
    memcpy((void*)0x20002d00, "./file0", 8);
    memcpy((void*)0x20002d40, "9p", 3);
    memcpy((void*)0x20002d80, "trans=fd,", 9);
    memcpy((void*)0x20002d89, "rfdno", 5);
    *(uint8_t*)0x20002d8e = 0x3d;
    sprintf((char*)0x20002d8f, "0x%016llx", (long long)r[0]);
    *(uint8_t*)0x20002da1 = 0x2c;
    memcpy((void*)0x20002da2, "wfdno", 5);
    *(uint8_t*)0x20002da7 = 0x3d;
    sprintf((char*)0x20002da8, "0x%016llx", (long long)r[0]);
    *(uint8_t*)0x20002dba = 0x2c;
    memcpy((void*)0x20002dbb, "access", 6);
    *(uint8_t*)0x20002dc1 = 0x3d;
    sprintf((char*)0x20002dc2, "%020llu", (long long)0);
    *(uint8_t*)0x20002dd6 = 0x2c;
    memcpy((void*)0x20002dd7, "dfltuid", 7);
    *(uint8_t*)0x20002dde = 0x3d;
    sprintf((char*)0x20002ddf, "0x%016llx", (long long)0);
    *(uint8_t*)0x20002df1 = 0x2c;
    memcpy((void*)0x20002df2, "dfltuid", 7);
    *(uint8_t*)0x20002df9 = 0x3d;
    sprintf((char*)0x20002dfa, "0x%016llx", (long long)0);
    *(uint8_t*)0x20002e0c = 0x2c;
    memcpy((void*)0x20002e0d, "access=client", 13);
    *(uint8_t*)0x20002e1a = 0x2c;
    *(uint8_t*)0x20002e1b = 0;
    syscall(__NR_mount, 0, 0x20002d00, 0x20002d40, 0x200000, 0x20002d80);
    break;
  }
}

void execute_one()
{
  execute(5);
}

int main()
{
  syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
  for (procid = 0; procid < 8; procid++) {
    if (fork() == 0) {
      for (;;) {
        loop();
      }
    }
  }
  sleep(1000000);
  return 0;
}
