// WARNING in perf_trace_buf_alloc
// https://syzkaller.appspot.com/bug?id=7aa8f7e3965859f3cff73dc36837bad4f43023d7
// 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 <signal.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>

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;
}

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

#define SYZ_HAVE_SETUP_TEST 1
static void setup_test()
{
  prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
  setpgrp();
}

#define SYZ_HAVE_RESET_TEST 1
static void reset_test()
{
  int fd;
  for (fd = 3; fd < 30; fd++)
    close(fd);
}

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();
      reset_test();
      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;
    }
  }
}
#ifndef __NR_bpf
#define __NR_bpf 321
#endif

uint64_t r[1] = {0xffffffffffffffff};

void execute_one(void)
{
  long res = 0;
  *(uint32_t*)0x20940000 = 2;
  *(uint32_t*)0x20940004 = 0x70;
  *(uint8_t*)0x20940008 = 0xb0;
  *(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, 0, 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, 0, 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 = 0;
  *(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, 0, -1, 0);
  *(uint32_t*)0x20000100 = 0xa;
  *(uint32_t*)0x20000104 = 6;
  *(uint32_t*)0x20000108 = 0xb11;
  *(uint32_t*)0x2000010c = 9;
  *(uint32_t*)0x20000110 = 0;
  *(uint32_t*)0x20000114 = 1;
  *(uint32_t*)0x20000118 = 0;
  *(uint8_t*)0x2000011c = 0;
  *(uint8_t*)0x2000011d = 0;
  *(uint8_t*)0x2000011e = 0;
  *(uint8_t*)0x2000011f = 0;
  *(uint8_t*)0x20000120 = 0;
  *(uint8_t*)0x20000121 = 0;
  *(uint8_t*)0x20000122 = 0;
  *(uint8_t*)0x20000123 = 0;
  *(uint8_t*)0x20000124 = 0;
  *(uint8_t*)0x20000125 = 0;
  *(uint8_t*)0x20000126 = 0;
  *(uint8_t*)0x20000127 = 0;
  *(uint8_t*)0x20000128 = 0;
  *(uint8_t*)0x20000129 = 0;
  *(uint8_t*)0x2000012a = 0;
  *(uint8_t*)0x2000012b = 0;
  res = syscall(__NR_bpf, 0, 0x20000100, 0x2c);
  if (res != -1)
    r[0] = res;
  *(uint32_t*)0x20000140 = r[0];
  *(uint64_t*)0x20000148 = 0x200000c0;
  *(uint64_t*)0x20000150 = 0x20000040;
  *(uint64_t*)0x20000158 = 0;
  syscall(__NR_bpf, 2, 0x20000140, 0x20);
}
int main(void)
{
  syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
  loop();
  return 0;
}
