// KASAN: use-after-free Read in tipc_group_is_open
// https://syzkaller.appspot.com/bug?id=7d9e6b86d74faf91174e35ea6e4d8f337f81983d
// status:fixed
// 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 <stdint.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 test();

void loop()
{
  int iter;
  for (iter = 0;; iter++) {
    int pid = fork();
    if (pid < 0)
      fail("loop fork failed");
    if (pid == 0) {
      prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
      setpgrp();
      test();
      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) {
        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 int collide;

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);
        if (collide && call % 2)
          break;
        struct timespec ts;
        ts.tv_sec = 0;
        ts.tv_nsec = 20 * 1000 * 1000;
        syscall(SYS_futex, &th->running, FUTEX_WAIT, 1, &ts);
        if (running)
          usleep((call == num_calls - 1) ? 10000 : 1000);
        break;
      }
    }
  }
}

long r[1];
uint64_t procid;
void execute_call(int call)
{
  switch (call) {
  case 0:
    syscall(__NR_mmap, 0x20000000, 0xfff000, 3, 0x32, -1, 0);
    break;
  case 1:
    r[0] = syscall(__NR_socket, 0x1e, 4, 0);
    break;
  case 2:
    *(uint32_t*)0x20265000 = 0x3fc;
    *(uint32_t*)0x20265004 = 0;
    *(uint32_t*)0x20265008 = 1;
    *(uint32_t*)0x2026500c = 0;
    syscall(__NR_setsockopt, -1, 0x10f, 0x87, 0x20265000, 0x10);
    break;
  case 3:
    *(uint64_t*)0x20c5cfc8 = 0x20c71fd2;
    *(uint32_t*)0x20c5cfd0 = 0x2e;
    *(uint64_t*)0x20c5cfd8 = 0x203aef90;
    *(uint64_t*)0x20c5cfe0 = 7;
    *(uint64_t*)0x20c5cfe8 = 0x20384e60;
    *(uint64_t*)0x20c5cff0 = 0x40;
    *(uint32_t*)0x20c5cff8 = 0x20000000;
    *(uint16_t*)0x20c71fd2 = 0x18;
    *(uint32_t*)0x20c71fd4 = 1;
    *(uint32_t*)0x20c71fd8 = 0;
    *(uint32_t*)0x20c71fdc = r[0];
    *(uint16_t*)0x20c71fe0 = 2;
    *(uint16_t*)0x20c71fe2 = htobe16(0x4e21 + procid * 4);
    *(uint8_t*)0x20c71fe4 = 0xac;
    *(uint8_t*)0x20c71fe5 = 0x14;
    *(uint8_t*)0x20c71fe6 = 0 + procid * 1;
    *(uint8_t*)0x20c71fe7 = 0xc;
    *(uint8_t*)0x20c71fe8 = 0;
    *(uint8_t*)0x20c71fe9 = 0;
    *(uint8_t*)0x20c71fea = 0;
    *(uint8_t*)0x20c71feb = 0;
    *(uint8_t*)0x20c71fec = 0;
    *(uint8_t*)0x20c71fed = 0;
    *(uint8_t*)0x20c71fee = 0;
    *(uint8_t*)0x20c71fef = 0;
    *(uint32_t*)0x20c71ff0 = 0;
    *(uint32_t*)0x20c71ff4 = 3;
    *(uint32_t*)0x20c71ff8 = 4;
    *(uint32_t*)0x20c71ffc = 1;
    *(uint64_t*)0x203aef90 = 0x207f3000;
    *(uint64_t*)0x203aef98 = 0;
    *(uint64_t*)0x203aefa0 = 0x20c96f89;
    *(uint64_t*)0x203aefa8 = 0;
    *(uint64_t*)0x203aefb0 = 0x20ac6000;
    *(uint64_t*)0x203aefb8 = 0;
    *(uint64_t*)0x203aefc0 = 0x20e5ef8e;
    *(uint64_t*)0x203aefc8 = 0;
    *(uint64_t*)0x203aefd0 = 0x206e7f12;
    *(uint64_t*)0x203aefd8 = 0;
    *(uint64_t*)0x203aefe0 = 0x20d5bfea;
    *(uint64_t*)0x203aefe8 = 0;
    *(uint64_t*)0x203aeff0 = 0x2075b000;
    *(uint64_t*)0x203aeff8 = 0;
    *(uint64_t*)0x20384e60 = 0x10;
    *(uint32_t*)0x20384e68 = 6;
    *(uint32_t*)0x20384e6c = 4;
    *(uint64_t*)0x20384e70 = 0x10;
    *(uint32_t*)0x20384e78 = 0x110;
    *(uint32_t*)0x20384e7c = 0;
    *(uint64_t*)0x20384e80 = 0x10;
    *(uint32_t*)0x20384e88 = 0x11f;
    *(uint32_t*)0x20384e8c = 0;
    *(uint64_t*)0x20384e90 = 0x10;
    *(uint32_t*)0x20384e98 = 0x11b;
    *(uint32_t*)0x20384e9c = 8;
    syscall(__NR_sendmsg, r[0], 0x20c5cfc8, 0x4000);
    break;
  case 4:
    *(uint16_t*)0x20745000 = 0x27;
    *(uint32_t*)0x20745004 = 0;
    *(uint32_t*)0x20745008 = -1;
    *(uint32_t*)0x2074500c = 3;
    syscall(__NR_bind, -1, 0x20745000, 0x10);
    break;
  case 5:
    *(uint32_t*)0x20265000 = 0x3fc;
    *(uint32_t*)0x20265004 = 0;
    *(uint32_t*)0x20265008 = 0;
    *(uint32_t*)0x2026500c = 0;
    syscall(__NR_setsockopt, r[0], 0x10f, 0x87, 0x20265000, 0x10);
    break;
  case 6:
    *(uint32_t*)0x20ef5000 = r[0];
    *(uint16_t*)0x20ef5004 = 0;
    *(uint16_t*)0x20ef5006 = 0;
    *(uint32_t*)0x20ef5008 = r[0];
    *(uint16_t*)0x20ef500c = 0x40;
    *(uint16_t*)0x20ef500e = 0;
    *(uint32_t*)0x20ef5010 = r[0];
    *(uint16_t*)0x20ef5014 = 0xf023;
    *(uint16_t*)0x20ef5016 = 0;
    *(uint32_t*)0x20ef5018 = r[0];
    *(uint16_t*)0x20ef501c = 0x9000;
    *(uint16_t*)0x20ef501e = 0;
    *(uint32_t*)0x20ef5020 = r[0];
    *(uint16_t*)0x20ef5024 = 8;
    *(uint16_t*)0x20ef5026 = 0;
    *(uint32_t*)0x20ef5028 = r[0];
    *(uint16_t*)0x20ef502c = 0x400;
    *(uint16_t*)0x20ef502e = 0;
    *(uint32_t*)0x20ef5030 = r[0];
    *(uint16_t*)0x20ef5034 = 0x2008;
    *(uint16_t*)0x20ef5036 = 0;
    *(uint32_t*)0x20ef5038 = r[0];
    *(uint16_t*)0x20ef503c = 0x8000;
    *(uint16_t*)0x20ef503e = 0;
    *(uint32_t*)0x20ef5040 = r[0];
    *(uint16_t*)0x20ef5044 = 0x2000;
    *(uint16_t*)0x20ef5046 = 0;
    *(uint32_t*)0x20ef5048 = r[0];
    *(uint16_t*)0x20ef504c = 0x10;
    *(uint16_t*)0x20ef504e = 0;
    syscall(__NR_poll, 0x20ef5000, 0xa, 0x7fff);
    break;
  }
}

void test()
{
  memset(r, -1, sizeof(r));
  execute(7);
  collide = 1;
  execute(7);
}

int main()
{
  for (procid = 0; procid < 8; procid++) {
    if (fork() == 0) {
      for (;;) {
        loop();
      }
    }
  }
  sleep(1000000);
  return 0;
}
