// KASAN: use-after-free Read in pppol2tp_release
// https://syzkaller.appspot.com/bug?id=426c45d0de1d60454704c7ef57e7fbb48712a56e
// 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;
      }
    }
  }
}

long r[4];
void execute_call(int call)
{
  switch (call) {
  case 0:
    syscall(__NR_mmap, 0x20000000, 0xe7a000, 3, 0x32, -1, 0);
    break;
  case 1:
    r[0] = syscall(__NR_socket, 0x18, 0, 1);
    break;
  case 2:
    *(uint32_t*)0x20245ffc = 8;
    syscall(__NR_getsockname, r[0], 0x20e78000, 0x20245ffc);
    break;
  case 3:
    *(uint16_t*)0x206f2ff0 = 0x1a;
    *(uint16_t*)0x206f2ff2 = htobe16(0);
    *(uint8_t*)0x206f2ff4 = -1;
    *(uint8_t*)0x206f2ff5 = 1;
    *(uint8_t*)0x206f2ff6 = 1;
    *(uint8_t*)0x206f2ff7 = 6;
    *(uint8_t*)0x206f2ff8 = -1;
    *(uint8_t*)0x206f2ff9 = -1;
    *(uint8_t*)0x206f2ffa = -1;
    *(uint8_t*)0x206f2ffb = -1;
    *(uint8_t*)0x206f2ffc = -1;
    *(uint8_t*)0x206f2ffd = -1;
    *(uint8_t*)0x206f2ffe = 0;
    *(uint8_t*)0x206f2fff = 0;
    syscall(__NR_bind, r[0], 0x206f2ff0, 0x10);
    break;
  case 4:
    *(uint16_t*)0x20002000 = 0x1f;
    *(uint8_t*)0x20002002 = 1;
    *(uint8_t*)0x20002003 = 0;
    *(uint8_t*)0x20002004 = 0;
    *(uint8_t*)0x20002005 = 0;
    *(uint8_t*)0x20002006 = 0;
    *(uint8_t*)0x20002007 = 0;
    syscall(__NR_connect, r[0], 0x20002000, 0x32);
    break;
  case 5:
    r[1] = syscall(__NR_socket, 0xa, 2, 0);
    break;
  case 6:
    r[2] = syscall(__NR_socket, 0x18, 1, 1);
    break;
  case 7:
    *(uint16_t*)0x20e71000 = 0x18;
    *(uint32_t*)0x20e71002 = 1;
    *(uint32_t*)0x20e71006 = 0;
    *(uint32_t*)0x20e7100a = r[1];
    *(uint16_t*)0x20e7100e = 2;
    *(uint16_t*)0x20e71010 = 0;
    *(uint16_t*)0x20e71012 = 2;
    *(uint16_t*)0x20e71014 = 0;
    *(uint16_t*)0x20e71016 = 0xa;
    *(uint16_t*)0x20e71018 = htobe16(0x4e21);
    *(uint32_t*)0x20e7101a = 3;
    *(uint8_t*)0x20e7101e = -1;
    *(uint8_t*)0x20e7101f = 1;
    *(uint8_t*)0x20e71020 = 0;
    *(uint8_t*)0x20e71021 = 0;
    *(uint8_t*)0x20e71022 = 0;
    *(uint8_t*)0x20e71023 = 0;
    *(uint8_t*)0x20e71024 = 0;
    *(uint8_t*)0x20e71025 = 0;
    *(uint8_t*)0x20e71026 = 0;
    *(uint8_t*)0x20e71027 = 0;
    *(uint8_t*)0x20e71028 = 0;
    *(uint8_t*)0x20e71029 = 0;
    *(uint8_t*)0x20e7102a = 0;
    *(uint8_t*)0x20e7102b = 0;
    *(uint8_t*)0x20e7102c = 0;
    *(uint8_t*)0x20e7102d = 1;
    *(uint32_t*)0x20e7102e = 4;
    syscall(__NR_connect, r[2], 0x20e71000, 0x32);
    break;
  case 8:
    r[3] = syscall(__NR_socket, 0x18, 1, 1);
    break;
  case 9:
    syscall(__NR_close, r[2]);
    break;
  case 10:
    syscall(__NR_dup2, r[3], r[1]);
    break;
  }
}

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

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