// WARNING: ODEBUG bug in smsusb_term_device
// https://syzkaller.appspot.com/bug?id=4d0496a0f2226a6a7efe1f7b2f2903651a4c3026
// status:open
// autogenerated by syzkaller (https://github.com/google/syzkaller)

#define _GNU_SOURCE

#include <endian.h>
#include <errno.h>
#include <fcntl.h>
#include <sched.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mount.h>
#include <sys/prctl.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#include <linux/capability.h>
#include <linux/usb/ch9.h>

unsigned long long procid;

static void sleep_ms(uint64_t ms)
{
  usleep(ms * 1000);
}

static bool write_file(const char* file, const char* what, ...)
{
  char buf[1024];
  va_list args;
  va_start(args, what);
  vsnprintf(buf, sizeof(buf), what, args);
  va_end(args);
  buf[sizeof(buf) - 1] = 0;
  int len = strlen(buf);
  int fd = open(file, O_WRONLY | O_CLOEXEC);
  if (fd == -1)
    return false;
  if (write(fd, buf, len) != len) {
    int err = errno;
    close(fd);
    errno = err;
    return false;
  }
  close(fd);
  return true;
}

#define USB_DEBUG 0

#define USB_MAX_EP_NUM 32

struct usb_device_index {
  struct usb_device_descriptor* dev;
  struct usb_config_descriptor* config;
  unsigned config_length;
  struct usb_interface_descriptor* iface;
  struct usb_endpoint_descriptor* eps[USB_MAX_EP_NUM];
  unsigned eps_num;
};

static bool parse_usb_descriptor(char* buffer, size_t length,
                                 struct usb_device_index* index)
{
  if (length <
      sizeof(*index->dev) + sizeof(*index->config) + sizeof(*index->iface))
    return false;
  index->dev = (struct usb_device_descriptor*)buffer;
  index->config = (struct usb_config_descriptor*)(buffer + sizeof(*index->dev));
  index->config_length = length - sizeof(*index->dev);
  index->iface =
      (struct usb_interface_descriptor*)(buffer + sizeof(*index->dev) +
                                         sizeof(*index->config));
  index->eps_num = 0;
  size_t offset = 0;
  while (true) {
    if (offset + 1 >= length)
      break;
    uint8_t desc_length = buffer[offset];
    uint8_t desc_type = buffer[offset + 1];
    if (desc_length <= 2)
      break;
    if (offset + desc_length > length)
      break;
    if (desc_type == USB_DT_ENDPOINT) {
      index->eps[index->eps_num] =
          (struct usb_endpoint_descriptor*)(buffer + offset);
      index->eps_num++;
    }
    if (index->eps_num == USB_MAX_EP_NUM)
      break;
    offset += desc_length;
  }
  return true;
}

enum usb_fuzzer_event_type {
  USB_FUZZER_EVENT_INVALID,
  USB_FUZZER_EVENT_CONNECT,
  USB_FUZZER_EVENT_DISCONNECT,
  USB_FUZZER_EVENT_SUSPEND,
  USB_FUZZER_EVENT_RESUME,
  USB_FUZZER_EVENT_CONTROL,
};

struct usb_fuzzer_event {
  uint32_t type;
  uint32_t length;
  char data[0];
};

struct usb_fuzzer_init {
  uint64_t speed;
  const char* driver_name;
  const char* device_name;
};

struct usb_fuzzer_ep_io {
  uint16_t ep;
  uint16_t flags;
  uint32_t length;
  char data[0];
};

#define USB_FUZZER_IOCTL_INIT _IOW('U', 0, struct usb_fuzzer_init)
#define USB_FUZZER_IOCTL_RUN _IO('U', 1)
#define USB_FUZZER_IOCTL_EVENT_FETCH _IOR('U', 2, struct usb_fuzzer_event)
#define USB_FUZZER_IOCTL_EP0_WRITE _IOW('U', 3, struct usb_fuzzer_ep_io)
#define USB_FUZZER_IOCTL_EP0_READ _IOWR('U', 4, struct usb_fuzzer_ep_io)
#define USB_FUZZER_IOCTL_EP_ENABLE _IOW('U', 5, struct usb_endpoint_descriptor)
#define USB_FUZZER_IOCTL_EP_WRITE _IOW('U', 7, struct usb_fuzzer_ep_io)
#define USB_FUZZER_IOCTL_EP_READ _IOWR('U', 8, struct usb_fuzzer_ep_io)
#define USB_FUZZER_IOCTL_CONFIGURE _IO('U', 9)
#define USB_FUZZER_IOCTL_VBUS_DRAW _IOW('U', 10, uint32_t)

int usb_fuzzer_open()
{
  return open("/sys/kernel/debug/usb-fuzzer", O_RDWR);
}

int usb_fuzzer_init(int fd, uint32_t speed, const char* driver,
                    const char* device)
{
  struct usb_fuzzer_init arg;
  arg.speed = speed;
  arg.driver_name = driver;
  arg.device_name = device;
  return ioctl(fd, USB_FUZZER_IOCTL_INIT, &arg);
}

int usb_fuzzer_run(int fd)
{
  return ioctl(fd, USB_FUZZER_IOCTL_RUN, 0);
}

int usb_fuzzer_event_fetch(int fd, struct usb_fuzzer_event* event)
{
  return ioctl(fd, USB_FUZZER_IOCTL_EVENT_FETCH, event);
}

int usb_fuzzer_ep0_write(int fd, struct usb_fuzzer_ep_io* io)
{
  return ioctl(fd, USB_FUZZER_IOCTL_EP0_WRITE, io);
}

int usb_fuzzer_ep0_read(int fd, struct usb_fuzzer_ep_io* io)
{
  return ioctl(fd, USB_FUZZER_IOCTL_EP0_READ, io);
}

int usb_fuzzer_ep_write(int fd, struct usb_fuzzer_ep_io* io)
{
  return ioctl(fd, USB_FUZZER_IOCTL_EP_WRITE, io);
}

int usb_fuzzer_ep_read(int fd, struct usb_fuzzer_ep_io* io)
{
  return ioctl(fd, USB_FUZZER_IOCTL_EP_READ, io);
}

int usb_fuzzer_ep_enable(int fd, struct usb_endpoint_descriptor* desc)
{
  return ioctl(fd, USB_FUZZER_IOCTL_EP_ENABLE, desc);
}

int usb_fuzzer_configure(int fd)
{
  return ioctl(fd, USB_FUZZER_IOCTL_CONFIGURE, 0);
}

int usb_fuzzer_vbus_draw(int fd, uint32_t power)
{
  return ioctl(fd, USB_FUZZER_IOCTL_VBUS_DRAW, power);
}

#define USB_MAX_PACKET_SIZE 1024

struct usb_fuzzer_control_event {
  struct usb_fuzzer_event inner;
  struct usb_ctrlrequest ctrl;
  char data[USB_MAX_PACKET_SIZE];
};

struct usb_fuzzer_ep_io_data {
  struct usb_fuzzer_ep_io inner;
  char data[USB_MAX_PACKET_SIZE];
};

struct vusb_connect_string_descriptor {
  uint32_t len;
  char* str;
} __attribute__((packed));

struct vusb_connect_descriptors {
  uint32_t qual_len;
  char* qual;
  uint32_t bos_len;
  char* bos;
  uint32_t strs_len;
  struct vusb_connect_string_descriptor strs[0];
} __attribute__((packed));

static const char* default_string = "syzkaller";

static bool lookup_connect_response(struct vusb_connect_descriptors* descs,
                                    struct usb_device_index* index,
                                    struct usb_ctrlrequest* ctrl,
                                    char** response_data,
                                    uint32_t* response_length)
{
  uint8_t str_idx;
  switch (ctrl->bRequestType & USB_TYPE_MASK) {
  case USB_TYPE_STANDARD:
    switch (ctrl->bRequest) {
    case USB_REQ_GET_DESCRIPTOR:
      switch (ctrl->wValue >> 8) {
      case USB_DT_DEVICE:
        *response_data = (char*)index->dev;
        *response_length = sizeof(*index->dev);
        return true;
      case USB_DT_CONFIG:
        *response_data = (char*)index->config;
        *response_length = index->config_length;
        return true;
      case USB_DT_STRING:
        str_idx = (uint8_t)ctrl->wValue;
        if (str_idx >= descs->strs_len) {
          *response_data = (char*)default_string;
          *response_length = strlen(default_string);
        } else {
          *response_data = descs->strs[str_idx].str;
          *response_length = descs->strs[str_idx].len;
        }
        return true;
      case USB_DT_BOS:
        *response_data = descs->bos;
        *response_length = descs->bos_len;
        return true;
      case USB_DT_DEVICE_QUALIFIER:
        *response_data = descs->qual;
        *response_length = descs->qual_len;
        return true;
      default:
        exit(1);
        return false;
      }
      break;
    default:
      exit(1);
      return false;
    }
    break;
  default:
    exit(1);
    return false;
  }
  return false;
}

static volatile long syz_usb_connect(volatile long a0, volatile long a1,
                                     volatile long a2, volatile long a3)
{
  uint64_t speed = a0;
  uint64_t dev_len = a1;
  char* dev = (char*)a2;
  struct vusb_connect_descriptors* descs = (struct vusb_connect_descriptors*)a3;
  if (!dev) {
    return -1;
  }
  struct usb_device_index index;
  memset(&index, 0, sizeof(index));
  int rv = 0;
  rv = parse_usb_descriptor(dev, dev_len, &index);
  if (!rv) {
    return rv;
  }
  int fd = usb_fuzzer_open();
  if (fd < 0) {
    return fd;
  }
  char device[32];
  sprintf(&device[0], "dummy_udc.%llu", procid);
  rv = usb_fuzzer_init(fd, speed, "dummy_udc", &device[0]);
  if (rv < 0) {
    return rv;
  }
  rv = usb_fuzzer_run(fd);
  if (rv < 0) {
    return rv;
  }
  bool done = false;
  while (!done) {
    struct usb_fuzzer_control_event event;
    event.inner.type = 0;
    event.inner.length = sizeof(event.ctrl);
    rv = usb_fuzzer_event_fetch(fd, (struct usb_fuzzer_event*)&event);
    if (rv < 0) {
      return rv;
    }
    if (event.inner.type != USB_FUZZER_EVENT_CONTROL)
      continue;
    bool response_found = false;
    char* response_data = NULL;
    uint32_t response_length = 0;
    if (event.ctrl.bRequestType & USB_DIR_IN) {
      response_found = lookup_connect_response(
          descs, &index, &event.ctrl, &response_data, &response_length);
      if (!response_found) {
        return -1;
      }
    } else {
      if ((event.ctrl.bRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD ||
          event.ctrl.bRequest != USB_REQ_SET_CONFIGURATION) {
        exit(1);
        return -1;
      }
      done = true;
    }
    if (done) {
      rv = usb_fuzzer_vbus_draw(fd, index.config->bMaxPower);
      if (rv < 0) {
        return rv;
      }
      rv = usb_fuzzer_configure(fd);
      if (rv < 0) {
        return rv;
      }
      unsigned ep;
      for (ep = 0; ep < index.eps_num; ep++) {
        rv = usb_fuzzer_ep_enable(fd, index.eps[ep]);
        if (rv < 0) {
        } else {
        }
      }
    }
    struct usb_fuzzer_ep_io_data response;
    response.inner.ep = 0;
    response.inner.flags = 0;
    if (response_length > sizeof(response.data))
      response_length = 0;
    if (event.ctrl.wLength < response_length)
      response_length = event.ctrl.wLength;
    response.inner.length = response_length;
    if (response_data)
      memcpy(&response.data[0], response_data, response_length);
    else
      memset(&response.data[0], 0, response_length);
    if (event.ctrl.bRequestType & USB_DIR_IN)
      rv = usb_fuzzer_ep0_write(fd, (struct usb_fuzzer_ep_io*)&response);
    else
      rv = usb_fuzzer_ep0_read(fd, (struct usb_fuzzer_ep_io*)&response);
    if (rv < 0) {
      return rv;
    }
  }
  sleep_ms(200);
  return fd;
}

static void setup_common()
{
  if (mount(0, "/sys/fs/fuse/connections", "fusectl", 0, 0)) {
  }
}

static void loop();

static void sandbox_common()
{
  prctl(PR_SET_PDEATHSIG, SIGKILL, 0, 0, 0);
  setpgrp();
  setsid();
  struct rlimit rlim;
  rlim.rlim_cur = rlim.rlim_max = (200 << 20);
  setrlimit(RLIMIT_AS, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 32 << 20;
  setrlimit(RLIMIT_MEMLOCK, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 136 << 20;
  setrlimit(RLIMIT_FSIZE, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 1 << 20;
  setrlimit(RLIMIT_STACK, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 0;
  setrlimit(RLIMIT_CORE, &rlim);
  rlim.rlim_cur = rlim.rlim_max = 256;
  setrlimit(RLIMIT_NOFILE, &rlim);
  if (unshare(CLONE_NEWNS)) {
  }
  if (unshare(CLONE_NEWIPC)) {
  }
  if (unshare(0x02000000)) {
  }
  if (unshare(CLONE_NEWUTS)) {
  }
  if (unshare(CLONE_SYSVSEM)) {
  }
  typedef struct {
    const char* name;
    const char* value;
  } sysctl_t;
  static const sysctl_t sysctls[] = {
      {"/proc/sys/kernel/shmmax", "16777216"},
      {"/proc/sys/kernel/shmall", "536870912"},
      {"/proc/sys/kernel/shmmni", "1024"},
      {"/proc/sys/kernel/msgmax", "8192"},
      {"/proc/sys/kernel/msgmni", "1024"},
      {"/proc/sys/kernel/msgmnb", "1024"},
      {"/proc/sys/kernel/sem", "1024 1048576 500 1024"},
  };
  unsigned i;
  for (i = 0; i < sizeof(sysctls) / sizeof(sysctls[0]); i++)
    write_file(sysctls[i].name, sysctls[i].value);
}

int wait_for_loop(int pid)
{
  if (pid < 0)
    exit(1);
  int status = 0;
  while (waitpid(-1, &status, __WALL) != pid) {
  }
  return WEXITSTATUS(status);
}

static void drop_caps(void)
{
  struct __user_cap_header_struct cap_hdr = {};
  struct __user_cap_data_struct cap_data[2] = {};
  cap_hdr.version = _LINUX_CAPABILITY_VERSION_3;
  cap_hdr.pid = getpid();
  if (syscall(SYS_capget, &cap_hdr, &cap_data))
    exit(1);
  const int drop = (1 << CAP_SYS_PTRACE) | (1 << CAP_SYS_NICE);
  cap_data[0].effective &= ~drop;
  cap_data[0].permitted &= ~drop;
  cap_data[0].inheritable &= ~drop;
  if (syscall(SYS_capset, &cap_hdr, &cap_data))
    exit(1);
}

static int do_sandbox_none(void)
{
  if (unshare(CLONE_NEWPID)) {
  }
  int pid = fork();
  if (pid != 0)
    return wait_for_loop(pid);
  setup_common();
  sandbox_common();
  drop_caps();
  if (unshare(CLONE_NEWNET)) {
  }
  loop();
  exit(1);
}

void loop(void)
{
  *(uint8_t*)0x20000080 = 0x12;
  *(uint8_t*)0x20000081 = 1;
  *(uint16_t*)0x20000082 = 0x200;
  *(uint8_t*)0x20000084 = 0x2e;
  *(uint8_t*)0x20000085 = 0x48;
  *(uint8_t*)0x20000086 = 0x2d;
  *(uint8_t*)0x20000087 = 0x10;
  *(uint16_t*)0x20000088 = 0x2040;
  *(uint16_t*)0x2000008a = 0xc000;
  *(uint16_t*)0x2000008c = 0xea2d;
  *(uint8_t*)0x2000008e = 4;
  *(uint8_t*)0x2000008f = 1;
  *(uint8_t*)0x20000090 = 0;
  *(uint8_t*)0x20000091 = 1;
  *(uint8_t*)0x20000092 = 9;
  *(uint8_t*)0x20000093 = 2;
  *(uint16_t*)0x20000094 = 0x72;
  *(uint8_t*)0x20000096 = 1;
  *(uint8_t*)0x20000097 = 0;
  *(uint8_t*)0x20000098 = 1;
  *(uint8_t*)0x20000099 = 0x30;
  *(uint8_t*)0x2000009a = 5;
  *(uint8_t*)0x2000009b = 9;
  *(uint8_t*)0x2000009c = 4;
  *(uint8_t*)0x2000009d = 0;
  *(uint8_t*)0x2000009e = 0xfb;
  *(uint8_t*)0x2000009f = 0xa;
  *(uint8_t*)0x200000a0 = 0x1e;
  *(uint8_t*)0x200000a1 = 0x3d;
  *(uint8_t*)0x200000a2 = 0x7b;
  *(uint8_t*)0x200000a3 = 8;
  *(uint8_t*)0x200000a4 = 9;
  *(uint8_t*)0x200000a5 = 5;
  *(uint8_t*)0x200000a6 = 0xf;
  *(uint8_t*)0x200000a7 = 0;
  *(uint16_t*)0x200000a8 = -1;
  *(uint8_t*)0x200000aa = 4;
  *(uint8_t*)0x200000ab = 1;
  *(uint8_t*)0x200000ac = 1;
  *(uint8_t*)0x200000ad = 9;
  *(uint8_t*)0x200000ae = 5;
  *(uint8_t*)0x200000af = 5;
  *(uint8_t*)0x200000b0 = 0;
  *(uint16_t*)0x200000b1 = 5;
  *(uint8_t*)0x200000b3 = 6;
  *(uint8_t*)0x200000b4 = 5;
  *(uint8_t*)0x200000b5 = 9;
  *(uint8_t*)0x200000b6 = 9;
  *(uint8_t*)0x200000b7 = 5;
  *(uint8_t*)0x200000b8 = 6;
  *(uint8_t*)0x200000b9 = 0x10;
  *(uint16_t*)0x200000ba = 8;
  *(uint8_t*)0x200000bc = 0x1f;
  *(uint8_t*)0x200000bd = 9;
  *(uint8_t*)0x200000be = 8;
  *(uint8_t*)0x200000bf = 9;
  *(uint8_t*)0x200000c0 = 5;
  *(uint8_t*)0x200000c1 = 5;
  *(uint8_t*)0x200000c2 = 1;
  *(uint16_t*)0x200000c3 = 2;
  *(uint8_t*)0x200000c5 = 3;
  *(uint8_t*)0x200000c6 = 1;
  *(uint8_t*)0x200000c7 = 0x67;
  *(uint8_t*)0x200000c8 = 9;
  *(uint8_t*)0x200000c9 = 5;
  *(uint8_t*)0x200000ca = 0xe;
  *(uint8_t*)0x200000cb = 1;
  *(uint16_t*)0x200000cc = 3;
  *(uint8_t*)0x200000ce = 5;
  *(uint8_t*)0x200000cf = 9;
  *(uint8_t*)0x200000d0 = 0xe6;
  *(uint8_t*)0x200000d1 = 9;
  *(uint8_t*)0x200000d2 = 5;
  *(uint8_t*)0x200000d3 = 1;
  *(uint8_t*)0x200000d4 = 1;
  *(uint16_t*)0x200000d5 = 0;
  *(uint8_t*)0x200000d7 = 2;
  *(uint8_t*)0x200000d8 = 0x20;
  *(uint8_t*)0x200000d9 = 1;
  *(uint8_t*)0x200000da = 9;
  *(uint8_t*)0x200000db = 5;
  *(uint8_t*)0x200000dc = 8;
  *(uint8_t*)0x200000dd = 0;
  *(uint16_t*)0x200000de = 0x7fff;
  *(uint8_t*)0x200000e0 = 0;
  *(uint8_t*)0x200000e1 = 0x3f;
  *(uint8_t*)0x200000e2 = 0x3f;
  *(uint8_t*)0x200000e3 = 2;
  *(uint8_t*)0x200000e4 = 0xe;
  *(uint8_t*)0x200000e5 = 9;
  *(uint8_t*)0x200000e6 = 5;
  *(uint8_t*)0x200000e7 = 0x8e;
  *(uint8_t*)0x200000e8 = 2;
  *(uint16_t*)0x200000e9 = 0x400;
  *(uint8_t*)0x200000eb = 5;
  *(uint8_t*)0x200000ec = 0x8a;
  *(uint8_t*)0x200000ed = 0xee;
  *(uint8_t*)0x200000ee = 9;
  *(uint8_t*)0x200000ef = 5;
  *(uint8_t*)0x200000f0 = 5;
  *(uint8_t*)0x200000f1 = 3;
  *(uint16_t*)0x200000f2 = -1;
  *(uint8_t*)0x200000f4 = 2;
  *(uint8_t*)0x200000f5 = 5;
  *(uint8_t*)0x200000f6 = 2;
  *(uint8_t*)0x200000f7 = 9;
  *(uint8_t*)0x200000f8 = 5;
  *(uint8_t*)0x200000f9 = 3;
  *(uint8_t*)0x200000fa = 1;
  *(uint16_t*)0x200000fb = 6;
  *(uint8_t*)0x200000fd = 7;
  *(uint8_t*)0x200000fe = 1;
  *(uint8_t*)0x200000ff = 7;
  *(uint8_t*)0x20000100 = 2;
  *(uint8_t*)0x20000101 = 0x31;
  *(uint8_t*)0x20000102 = 2;
  *(uint8_t*)0x20000103 = 0x33;
  *(uint32_t*)0x20000500 = 0;
  *(uint64_t*)0x20000504 = 0;
  *(uint32_t*)0x2000050c = 0;
  *(uint64_t*)0x20000510 = 0;
  *(uint32_t*)0x20000518 = 3;
  *(uint32_t*)0x2000051c = 0;
  *(uint64_t*)0x20000520 = 0;
  *(uint32_t*)0x20000528 = 0;
  *(uint64_t*)0x2000052c = 0;
  *(uint32_t*)0x20000534 = 0;
  *(uint64_t*)0x20000538 = 0;
  syz_usb_connect(3, 0x84, 0x20000080, 0x20000500);
}
int main(void)
{
  syscall(__NR_mmap, 0x20000000, 0x1000000, 3, 0x32, -1, 0);
  do_sandbox_none();
  return 0;
}
