aboutsummaryrefslogtreecommitdiffstats
path: root/executor
diff options
context:
space:
mode:
Diffstat (limited to 'executor')
-rw-r--r--executor/common_usb.h55
-rw-r--r--executor/defs.h10
2 files changed, 54 insertions, 11 deletions
diff --git a/executor/common_usb.h b/executor/common_usb.h
index fbb4e2128..11e92565c 100644
--- a/executor/common_usb.h
+++ b/executor/common_usb.h
@@ -5,6 +5,8 @@
// Implementation of syz_usb_* pseudo-syscalls.
+#define USB_DEBUG 0
+
#define USB_MAX_EP_NUM 32
struct usb_device_index {
@@ -305,13 +307,13 @@ static volatile long syz_usb_connect(volatile long a0, volatile long a1, volatil
if (event.ctrl.bRequestType & USB_DIR_IN) {
NONFAILING(response_found = lookup_connect_response(descs, &index, &event.ctrl, &response_data, &response_length));
if (!response_found) {
- debug("syz_usb_connect: unknown IN request\n");
+ debug("syz_usb_connect: unknown control IN request\n");
return -1;
}
} else {
if ((event.ctrl.bRequestType & USB_TYPE_MASK) != USB_TYPE_STANDARD ||
event.ctrl.bRequest != USB_REQ_SET_CONFIGURATION) {
- fail("syz_usb_connect: unknown OUT request");
+ fail("syz_usb_connect: unknown control OUT request");
return -1;
}
done = true;
@@ -397,8 +399,8 @@ struct vusb_responses {
struct vusb_response* resps[0];
} __attribute__((packed));
-static bool lookup_control_io_response(struct vusb_descriptors* descs, struct vusb_responses* resps,
- struct usb_ctrlrequest* ctrl, char** response_data, uint32* response_length)
+static bool lookup_control_response(struct vusb_descriptors* descs, struct vusb_responses* resps,
+ struct usb_ctrlrequest* ctrl, char** response_data, uint32* response_length)
{
int descs_num = (descs->len - offsetof(struct vusb_descriptors, descs)) / sizeof(descs->descs[0]);
int resps_num = (resps->len - offsetof(struct vusb_responses, resps)) / sizeof(resps->resps[0]);
@@ -456,6 +458,44 @@ static bool lookup_control_io_response(struct vusb_descriptors* descs, struct vu
return false;
}
+#if USB_DEBUG
+#include <linux/hid.h>
+#include <linux/usb/cdc.h>
+#include <linux/usb/ch11.h>
+#include <linux/usb/ch9.h>
+
+static void analyze_control_request(struct usb_ctrlrequest* ctrl)
+{
+ 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:
+ case USB_DT_CONFIG:
+ case USB_DT_STRING:
+ case HID_DT_REPORT:
+ case USB_DT_BOS:
+ case USB_DT_HUB:
+ case USB_DT_SS_HUB:
+ return;
+ }
+ }
+ break;
+ case USB_TYPE_CLASS:
+ switch (ctrl->bRequest) {
+ case USB_REQ_GET_INTERFACE:
+ case USB_REQ_GET_CONFIGURATION:
+ case USB_REQ_GET_STATUS:
+ case USB_CDC_GET_NTB_PARAMETERS:
+ return;
+ }
+ }
+ fail("analyze_control_request: unknown control request (0x%x, 0x%x, 0x%x)",
+ ctrl->bRequestType, ctrl->bRequest, ctrl->wValue);
+}
+#endif
+
static volatile long syz_usb_control_io(volatile long a0, volatile long a1, volatile long a2)
{
int fd = a0;
@@ -484,9 +524,12 @@ static volatile long syz_usb_control_io(volatile long a0, volatile long a1, vola
uint32 response_length = 0;
if (event.ctrl.bRequestType & USB_DIR_IN) {
- NONFAILING(response_found = lookup_control_io_response(descs, resps, &event.ctrl, &response_data, &response_length));
+ NONFAILING(response_found = lookup_control_response(descs, resps, &event.ctrl, &response_data, &response_length));
if (!response_found) {
- debug("syz_usb_control_io: no response found\n");
+#if USB_DEBUG
+ analyze_control_request(&event.ctrl);
+#endif
+ debug("syz_usb_control_io: unknown control IN request\n");
return -1;
}
} else {
diff --git a/executor/defs.h b/executor/defs.h
index 8aa9355a3..9be26a25e 100644
--- a/executor/defs.h
+++ b/executor/defs.h
@@ -70,7 +70,7 @@
#if GOARCH_386
#define GOARCH "386"
-#define SYZ_REVISION "e6852411760a2a78058472eaf4813af2801ed202"
+#define SYZ_REVISION "ccc2cdeb1bb485261e99acfaa2cdf88c89136043"
#define SYZ_EXECUTOR_USES_FORK_SERVER 1
#define SYZ_EXECUTOR_USES_SHMEM 1
#define SYZ_PAGE_SIZE 4096
@@ -80,7 +80,7 @@
#if GOARCH_amd64
#define GOARCH "amd64"
-#define SYZ_REVISION "dcbebec84b823ea25f3b394a09856311b9dd1ca0"
+#define SYZ_REVISION "3ad0caf28b47f3c27a8f69b938b8f93073f6611c"
#define SYZ_EXECUTOR_USES_FORK_SERVER 1
#define SYZ_EXECUTOR_USES_SHMEM 1
#define SYZ_PAGE_SIZE 4096
@@ -90,7 +90,7 @@
#if GOARCH_arm
#define GOARCH "arm"
-#define SYZ_REVISION "e1dc4882544d6442aef7732b455d7285ae1eb641"
+#define SYZ_REVISION "0aea57e00bdd385a6598b158d35ac8f03cb3915b"
#define SYZ_EXECUTOR_USES_FORK_SERVER 1
#define SYZ_EXECUTOR_USES_SHMEM 1
#define SYZ_PAGE_SIZE 4096
@@ -100,7 +100,7 @@
#if GOARCH_arm64
#define GOARCH "arm64"
-#define SYZ_REVISION "d2380e739438289715ad5793155eba1a5ec89c5b"
+#define SYZ_REVISION "8cd19665e25b860288db2dbdc6ecd8638c78592b"
#define SYZ_EXECUTOR_USES_FORK_SERVER 1
#define SYZ_EXECUTOR_USES_SHMEM 1
#define SYZ_PAGE_SIZE 4096
@@ -110,7 +110,7 @@
#if GOARCH_ppc64le
#define GOARCH "ppc64le"
-#define SYZ_REVISION "3c6f9896b7cb868b391014be969a0359572922f5"
+#define SYZ_REVISION "5e7246d3cadcc34a6acaa0542495c1056a555bef"
#define SYZ_EXECUTOR_USES_FORK_SERVER 1
#define SYZ_EXECUTOR_USES_SHMEM 1
#define SYZ_PAGE_SIZE 4096