// general protection fault in __ip_options_echo (2)
// https://syzkaller.appspot.com/bug?id=cc189ce25e829ed0b5c1c9eda86fac558b39c0a9
// status:fixed
// autogenerated by syzkaller (http://github.com/google/syzkaller)

#define _GNU_SOURCE

#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <linux/if.h>
#include <linux/if_ether.h>
#include <linux/if_tun.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <net/if_arp.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <unistd.h>

const int kFailStatus = 67;
const int kRetryStatus = 69;

__attribute__((noreturn)) static void doexit(int status)
{
  volatile unsigned i;
  syscall(__NR_exit_group, status);
  for (i = 0;; i++) {
  }
}

__attribute__((noreturn)) static void fail(const char* msg, ...)
{
  int e = errno;
  fflush(stdout);
  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);
}

#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 vsnprintf_check(char* str, size_t size, const char* format,
                            va_list args)
{
  int rv;

  rv = vsnprintf(str, size, format, args);
  if (rv < 0)
    fail("tun: snprintf failed");
  if ((size_t)rv >= size)
    fail("tun: string '%s...' doesn't fit into buffer", str);
}

static void snprintf_check(char* str, size_t size, const char* format,
                           ...)
{
  va_list args;

  va_start(args, format);
  vsnprintf_check(str, size, format, args);
  va_end(args);
}

#define COMMAND_MAX_LEN 128

static void execute_command(const char* format, ...)
{
  va_list args;
  char command[COMMAND_MAX_LEN];
  int rv;

  va_start(args, format);

  vsnprintf_check(command, sizeof(command), format, args);
  rv = system(command);
  if (rv != 0)
    fail("tun: command \"%s\" failed with code %d", &command[0], rv);

  va_end(args);
}

static int tunfd = -1;

#define SYZ_TUN_MAX_PACKET_SIZE 1000

#define MAX_PIDS 32
#define ADDR_MAX_LEN 32

#define LOCAL_MAC "aa:aa:aa:aa:aa:%02hx"
#define REMOTE_MAC "bb:bb:bb:bb:bb:%02hx"

#define LOCAL_IPV4 "172.20.%d.170"
#define REMOTE_IPV4 "172.20.%d.187"

#define LOCAL_IPV6 "fe80::%02hxaa"
#define REMOTE_IPV6 "fe80::%02hxbb"

static void initialize_tun(uint64_t pid)
{
  if (pid >= MAX_PIDS)
    fail("tun: no more than %d executors", MAX_PIDS);
  int id = pid;

  tunfd = open("/dev/net/tun", O_RDWR | O_NONBLOCK);
  if (tunfd == -1)
    fail("tun: can't open /dev/net/tun");

  char iface[IFNAMSIZ];
  snprintf_check(iface, sizeof(iface), "syz%d", id);

  struct ifreq ifr;
  memset(&ifr, 0, sizeof(ifr));
  strncpy(ifr.ifr_name, iface, IFNAMSIZ);
  ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
  if (ioctl(tunfd, TUNSETIFF, (void*)&ifr) < 0)
    fail("tun: ioctl(TUNSETIFF) failed");

  char local_mac[ADDR_MAX_LEN];
  snprintf_check(local_mac, sizeof(local_mac), LOCAL_MAC, id);
  char remote_mac[ADDR_MAX_LEN];
  snprintf_check(remote_mac, sizeof(remote_mac), REMOTE_MAC, id);

  char local_ipv4[ADDR_MAX_LEN];
  snprintf_check(local_ipv4, sizeof(local_ipv4), LOCAL_IPV4, id);
  char remote_ipv4[ADDR_MAX_LEN];
  snprintf_check(remote_ipv4, sizeof(remote_ipv4), REMOTE_IPV4, id);

  char local_ipv6[ADDR_MAX_LEN];
  snprintf_check(local_ipv6, sizeof(local_ipv6), LOCAL_IPV6, id);
  char remote_ipv6[ADDR_MAX_LEN];
  snprintf_check(remote_ipv6, sizeof(remote_ipv6), REMOTE_IPV6, id);

  execute_command("sysctl -w net.ipv6.conf.%s.accept_dad=0", iface);

  execute_command("sysctl -w net.ipv6.conf.%s.router_solicitations=0",
                  iface);

  execute_command("ip link set dev %s address %s", iface, local_mac);
  execute_command("ip addr add %s/24 dev %s", local_ipv4, iface);
  execute_command("ip -6 addr add %s/120 dev %s", local_ipv6, iface);
  execute_command("ip neigh add %s lladdr %s dev %s nud permanent",
                  remote_ipv4, remote_mac, iface);
  execute_command("ip -6 neigh add %s lladdr %s dev %s nud permanent",
                  remote_ipv6, remote_mac, iface);
  execute_command("ip link set dev %s up", iface);
}

static void setup_tun(uint64_t pid, bool enable_tun)
{
  if (enable_tun)
    initialize_tun(pid);
}

struct csum_inet {
  uint32_t acc;
};

static void csum_inet_init(struct csum_inet* csum)
{
  csum->acc = 0;
}

static void csum_inet_update(struct csum_inet* csum,
                             const uint8_t* data, size_t length)
{
  if (length == 0)
    return;

  size_t i;
  for (i = 0; i < length - 1; i += 2)
    csum->acc += *(uint16_t*)&data[i];

  if (length & 1)
    csum->acc += (uint16_t)data[length - 1];

  while (csum->acc > 0xffff)
    csum->acc = (csum->acc & 0xffff) + (csum->acc >> 16);
}

static uint16_t csum_inet_digest(struct csum_inet* csum)
{
  return ~csum->acc;
}

static uintptr_t syz_emit_ethernet(uintptr_t a0, uintptr_t a1)
{

  if (tunfd < 0)
    return (uintptr_t)-1;

  int64_t length = a0;
  char* data = (char*)a1;
  return write(tunfd, data, length);
}

long r[87];
void loop()
{
  memset(r, -1, sizeof(r));
  r[0] = syscall(__NR_mmap, 0x20000000ul, 0xf0b000ul, 0x3ul, 0x32ul,
                 0xfffffffffffffffful, 0x0ul);
  r[1] = syscall(__NR_socket, 0x2ul, 0x2ul, 0x0ul);
  *(uint16_t*)0x20afbff0 = (uint16_t)0x2;
  *(uint16_t*)0x20afbff2 = (uint16_t)0x224e;
  *(uint32_t*)0x20afbff4 = (uint32_t)0x10000e0;
  *(uint8_t*)0x20afbff8 = (uint8_t)0x0;
  *(uint8_t*)0x20afbff9 = (uint8_t)0x0;
  *(uint8_t*)0x20afbffa = (uint8_t)0x0;
  *(uint8_t*)0x20afbffb = (uint8_t)0x0;
  *(uint8_t*)0x20afbffc = (uint8_t)0x0;
  *(uint8_t*)0x20afbffd = (uint8_t)0x0;
  *(uint8_t*)0x20afbffe = (uint8_t)0x0;
  *(uint8_t*)0x20afbfff = (uint8_t)0x0;
  r[13] = syscall(__NR_bind, r[1], 0x20afbff0ul, 0x10ul);
  *(uint32_t*)0x20f07d9d = (uint32_t)0x0;
  *(uint32_t*)0x20f07da1 = (uint32_t)0x0;
  *(uint32_t*)0x20f07da5 = (uint32_t)0xffffffffffffffff;
  r[17] = syscall(__NR_ioctl, 0xfffffffffffffffful, 0xc00c642dul,
                  0x20f07d9dul);
  *(uint8_t*)0x20f07fba = (uint8_t)0xbb;
  *(uint8_t*)0x20f07fbb = (uint8_t)0xbb;
  *(uint8_t*)0x20f07fbc = (uint8_t)0xbb;
  *(uint8_t*)0x20f07fbd = (uint8_t)0xbb;
  *(uint8_t*)0x20f07fbe = (uint8_t)0xbb;
  *(uint8_t*)0x20f07fbf = (uint8_t)0x0;
  *(uint8_t*)0x20f07fc0 = (uint8_t)0xaa;
  *(uint8_t*)0x20f07fc1 = (uint8_t)0xaa;
  *(uint8_t*)0x20f07fc2 = (uint8_t)0xaa;
  *(uint8_t*)0x20f07fc3 = (uint8_t)0xaa;
  *(uint8_t*)0x20f07fc4 = (uint8_t)0xaa;
  *(uint8_t*)0x20f07fc5 = (uint8_t)0x0;
  *(uint16_t*)0x20f07fc6 = (uint16_t)0x8;
  STORE_BY_BITMASK(uint8_t, 0x20f07fc8, 0xc, 0, 4);
  STORE_BY_BITMASK(uint8_t, 0x20f07fc8, 0x4, 4, 4);
  STORE_BY_BITMASK(uint8_t, 0x20f07fc9, 0x0, 0, 2);
  STORE_BY_BITMASK(uint8_t, 0x20f07fc9, 0x0, 2, 6);
  *(uint16_t*)0x20f07fca = (uint16_t)0x3800;
  *(uint16_t*)0x20f07fcc = (uint16_t)0x6400;
  *(uint16_t*)0x20f07fce = (uint16_t)0x0;
  *(uint8_t*)0x20f07fd0 = (uint8_t)0x0;
  *(uint8_t*)0x20f07fd1 = (uint8_t)0x11;
  *(uint16_t*)0x20f07fd2 = (uint16_t)0x0;
  *(uint32_t*)0x20f07fd4 = (uint32_t)0x0;
  *(uint32_t*)0x20f07fd8 = (uint32_t)0x10000e0;
  *(uint8_t*)0x20f07fdc = (uint8_t)0x44;
  *(uint8_t*)0x20f07fdd = (uint8_t)0x18;
  *(uint8_t*)0x20f07fde = (uint8_t)0x7;
  STORE_BY_BITMASK(uint8_t, 0x20f07fdf, 0x3, 0, 4);
  STORE_BY_BITMASK(uint8_t, 0x20f07fdf, 0x20000, 4, 4);
  *(uint32_t*)0x20f07fe0 = (uint32_t)0x100007f;
  *(uint32_t*)0x20f07fe4 = (uint32_t)0x40000000;
  *(uint32_t*)0x20f07fe8 = (uint32_t)0x100007f;
  *(uint32_t*)0x20f07fec = (uint32_t)0x0;
  *(uint32_t*)0x20f07ff0 = (uint32_t)0x7000000;
  *(uint8_t*)0x20f07ff4 = (uint8_t)0x0;
  *(uint16_t*)0x20f07ff8 = (uint16_t)0x204e;
  *(uint16_t*)0x20f07ffa = (uint16_t)0x224e;
  *(uint16_t*)0x20f07ffc = (uint16_t)0x800;
  *(uint16_t*)0x20f07ffe = (uint16_t)0x0;
  struct csum_inet csum_58;
  csum_inet_init(&csum_58);
  csum_inet_update(&csum_58, (const uint8_t*)0x20f07fd4, 4);
  csum_inet_update(&csum_58, (const uint8_t*)0x20f07fd8, 4);
  uint16_t csum_58_chunk_2 = 0x1100;
  csum_inet_update(&csum_58, (const uint8_t*)&csum_58_chunk_2, 2);
  uint16_t csum_58_chunk_3 = 0x800;
  csum_inet_update(&csum_58, (const uint8_t*)&csum_58_chunk_3, 2);
  csum_inet_update(&csum_58, (const uint8_t*)0x20f07ff8, 8);
  *(uint16_t*)0x20f07ffe = csum_inet_digest(&csum_58);
  struct csum_inet csum_59;
  csum_inet_init(&csum_59);
  csum_inet_update(&csum_59, (const uint8_t*)0x20f07fc8, 48);
  *(uint16_t*)0x20f07fd2 = csum_inet_digest(&csum_59);
  r[60] = syz_emit_ethernet(0x46ul, 0x20f07fbaul);
  memcpy((void*)0x20ee0f7f, "\xb3", 1);
  r[62] =
      syscall(__NR_setsockopt, r[1], 0x0ul, 0x7ul, 0x20ee0f7ful, 0x1ul);
  *(uint16_t*)0x20558000 = (uint16_t)0x2;
  *(uint16_t*)0x20558002 = (uint16_t)0x214e;
  *(uint32_t*)0x20558004 = (uint32_t)0x0;
  *(uint8_t*)0x20558008 = (uint8_t)0x0;
  *(uint8_t*)0x20558009 = (uint8_t)0x0;
  *(uint8_t*)0x2055800a = (uint8_t)0x0;
  *(uint8_t*)0x2055800b = (uint8_t)0x0;
  *(uint8_t*)0x2055800c = (uint8_t)0x0;
  *(uint8_t*)0x2055800d = (uint8_t)0x0;
  *(uint8_t*)0x2055800e = (uint8_t)0x0;
  *(uint8_t*)0x2055800f = (uint8_t)0x0;
  r[74] = syscall(__NR_recvfrom, r[1], 0x20f0bff5ul, 0x0ul, 0x2ul,
                  0x20558000ul, 0x10ul);
  *(uint16_t*)0x200c0ff0 = (uint16_t)0x2;
  *(uint16_t*)0x200c0ff2 = (uint16_t)0x224e;
  *(uint32_t*)0x200c0ff4 = (uint32_t)0x10000e0;
  *(uint8_t*)0x200c0ff8 = (uint8_t)0x0;
  *(uint8_t*)0x200c0ff9 = (uint8_t)0x0;
  *(uint8_t*)0x200c0ffa = (uint8_t)0x0;
  *(uint8_t*)0x200c0ffb = (uint8_t)0x0;
  *(uint8_t*)0x200c0ffc = (uint8_t)0x0;
  *(uint8_t*)0x200c0ffd = (uint8_t)0x0;
  *(uint8_t*)0x200c0ffe = (uint8_t)0x0;
  *(uint8_t*)0x200c0fff = (uint8_t)0x0;
  r[86] = syscall(__NR_recvfrom, r[1], 0x20bc0000ul, 0x0ul, 0x0ul,
                  0x200c0ff0ul, 0x10ul);
}

int main()
{
  setup_tun(0, true);
  loop();
  return 0;
}
