// KMSAN: uninit-value in dev_mc_add_excl
// https://syzkaller.appspot.com/bug?id=f2f4e03d3e87d8b6a12bb917935855a7db8508aa
// status:fixed
// 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;
}

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

uint64_t r[3] = {0xffffffffffffffff, 0xffffffffffffffff, 0x0};

void execute_one(void)
{
  long res = 0;
  res = syscall(__NR_socket, 0x10, 3, 0);
  if (res != -1)
    r[0] = res;
  res = syscall(__NR_socket, 0xa, 0x803, 3);
  if (res != -1)
    r[1] = res;
  memcpy((void*)0x20000fc0,
         "\x69\x70\x36\x74\x6e\x6c\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00",
         16);
  *(uint32_t*)0x20000fd0 = 0;
  res = syscall(__NR_ioctl, r[1], 0x8933, 0x20000fc0);
  if (res != -1)
    r[2] = *(uint32_t*)0x20000fd0;
  *(uint64_t*)0x20000500 = 0x20000440;
  *(uint16_t*)0x20000440 = 0x10;
  *(uint16_t*)0x20000442 = -1;
  *(uint32_t*)0x20000444 = 0;
  *(uint32_t*)0x20000448 = 0;
  *(uint32_t*)0x20000508 = 0xc;
  *(uint64_t*)0x20000510 = 0x200004c0;
  *(uint64_t*)0x200004c0 = 0x20000480;
  *(uint32_t*)0x20000480 = 0x28;
  *(uint16_t*)0x20000484 = 0x1c;
  *(uint16_t*)0x20000486 = 1;
  *(uint32_t*)0x20000488 = 0;
  *(uint32_t*)0x2000048c = 0;
  *(uint8_t*)0x20000490 = 7;
  *(uint8_t*)0x20000491 = 0;
  *(uint16_t*)0x20000492 = 0;
  *(uint32_t*)0x20000494 = r[2];
  *(uint16_t*)0x20000498 = 0;
  *(uint8_t*)0x2000049a = -1;
  *(uint8_t*)0x2000049b = 0;
  *(uint16_t*)0x2000049c = 0xa;
  *(uint16_t*)0x2000049e = 2;
  *(uint8_t*)0x200004a0 = -1;
  *(uint8_t*)0x200004a1 = 0;
  *(uint8_t*)0x200004a2 = 0;
  *(uint8_t*)0x200004a3 = 0;
  *(uint8_t*)0x200004a4 = 0;
  *(uint8_t*)0x200004a5 = 0;
  *(uint64_t*)0x200004c8 = 0x28;
  *(uint64_t*)0x20000518 = 1;
  *(uint64_t*)0x20000520 = 0;
  *(uint64_t*)0x20000528 = 0;
  *(uint32_t*)0x20000530 = 0;
  syscall(__NR_sendmsg, r[0], 0x20000500, 0);
  *(uint32_t*)0x20000180 = 0x80;
  syscall(__NR_accept4, -1, 0x20000000, 0x20000180, 0);
  *(uint16_t*)0x20000080 = 0xa;
  *(uint16_t*)0x20000082 = htobe16(0x4e22);
  *(uint32_t*)0x20000084 = 0;
  *(uint64_t*)0x20000088 = htobe64(0);
  *(uint64_t*)0x20000090 = htobe64(1);
  *(uint32_t*)0x20000098 = 0;
  syscall(__NR_sendto, -1, 0x20000000, 0, 0x20000004, 0x20000080, 0x1c);
  *(uint64_t*)0x20fdbff8 = 0x20ac9000;
  *(uint64_t*)0x20fdc000 = 0;
  syscall(__NR_writev, -1, 0x20fdbff8, 1);
  syscall(__NR_socket, 2, 3, 1);
}
int main(void)
{
  syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
  loop();
  return 0;
}
