From 4d3ae0b784e183141c5ffcc7dd9e709b6b4f0d86 Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Thu, 19 Sep 2019 18:48:35 +0200 Subject: executor: handle USB IN requests with wLength == 0 --- executor/common_usb.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'executor/common_usb.h') diff --git a/executor/common_usb.h b/executor/common_usb.h index c4b9e96ac..a7a5530e3 100644 --- a/executor/common_usb.h +++ b/executor/common_usb.h @@ -572,7 +572,7 @@ static volatile long syz_usb_control_io(volatile long a0, volatile long a1, vola char* response_data = NULL; uint32 response_length = 0; - if (event.ctrl.bRequestType & USB_DIR_IN) { + if ((event.ctrl.bRequestType & USB_DIR_IN) && event.ctrl.wLength) { NONFAILING(response_found = lookup_control_response(descs, resps, &event.ctrl, &response_data, &response_length)); if (!response_found) { #if USB_DEBUG @@ -592,20 +592,24 @@ static volatile long syz_usb_control_io(volatile long a0, volatile long a1, vola response_length = 0; if (event.ctrl.wLength < response_length) response_length = event.ctrl.wLength; + if ((event.ctrl.bRequestType & USB_DIR_IN) && !event.ctrl.wLength) { + // Something fishy is going on, try to read more data. + response_length = USB_MAX_PACKET_SIZE; + } 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) { + if ((event.ctrl.bRequestType & USB_DIR_IN) && event.ctrl.wLength) { debug("syz_usb_control_io: writing %d bytes\n", response.inner.length); debug_dump_data(&response.data[0], response.inner.length); 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); debug("syz_usb_control_io: read %d bytes\n", response.inner.length); - debug_dump_data(&event.data[0], response.inner.length); + debug_dump_data(&response.data[0], response.inner.length); } if (rv < 0) { debug("syz_usb_control_io: usb_fuzzer_ep0_read/write failed with %d\n", rv); -- cgit mrf-deployment