// WARNING in reuseport_add_sock
// https://syzkaller.appspot.com/bug?id=35f812a0e2c0282e40450d4dbaf6f9c5f90924d7
// status:open
// autogenerated by syzkaller (http://github.com/google/syzkaller)

#define _GNU_SOURCE
#include <endian.h>
#include <linux/futex.h>
#include <pthread.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <sys/syscall.h>
#include <unistd.h>

static void test();

void loop()
{
  while (1) {
    test();
  }
}

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

#ifndef __NR_setsockopt
#define __NR_setsockopt 366
#endif
#ifndef __NR_bind
#define __NR_bind 361
#endif
#ifndef __NR_listen
#define __NR_listen 363
#endif
#ifndef __NR_mmap
#define __NR_mmap 192
#endif
#ifndef __NR_socket
#define __NR_socket 359
#endif
#undef __NR_mmap
#define __NR_mmap __NR_mmap2

long r[1];
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, 2, 1, 0);
    break;
  case 2:
    syscall(__NR_socket, 2, 1, 0);
    break;
  case 3:
    *(uint32_t*)0x2056effc = 1;
    syscall(__NR_setsockopt, r[0], 6, 0x13, 0x2056effc, 4);
    break;
  case 4:
    *(uint32_t*)0x20f11000 = 0xffffff40;
    syscall(__NR_setsockopt, r[0], 1, 0xf, 0x20f11000, 4);
    break;
  case 5:
    *(uint16_t*)0x20e15000 = 2;
    *(uint16_t*)0x20e15002 = htobe16(0x4e20);
    *(uint32_t*)0x20e15004 = htobe32(0);
    *(uint8_t*)0x20e15008 = 0;
    *(uint8_t*)0x20e15009 = 0;
    *(uint8_t*)0x20e1500a = 0;
    *(uint8_t*)0x20e1500b = 0;
    *(uint8_t*)0x20e1500c = 0;
    *(uint8_t*)0x20e1500d = 0;
    *(uint8_t*)0x20e1500e = 0;
    *(uint8_t*)0x20e1500f = 0;
    syscall(__NR_bind, r[0], 0x20e15000, 0x10);
    break;
  case 6:
    *(uint16_t*)0x200a2000 = 1;
    *(uint32_t*)0x200a2004 = 0x20f07000;
    *(uint16_t*)0x20f07000 = 6;
    *(uint8_t*)0x20f07002 = 0;
    *(uint8_t*)0x20f07003 = 0;
    *(uint32_t*)0x20f07004 = 0;
    syscall(__NR_setsockopt, r[0], 1, 0x33, 0x200a2000, 0x10);
    break;
  case 7:
    syscall(__NR_listen, r[0], 0);
    break;
  }
}

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

int main()
{
  for (;;) {
    loop();
  }
}
