patch "staging: wlan-ng: fix out of bounds read in prism2sta_probe_usb()" added to staging-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
staging: wlan-ng: fix out of bounds read in prism2sta_probe_usb()
to my staging git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
in the staging-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From fea22e159d51c766ba70473f473a0ec914cc7e92 Mon Sep 17 00:00:00 2001
From: Rustam Kovhaev <[email protected]>
Date: Tue, 4 Aug 2020 07:56:14 -0700
Subject: staging: wlan-ng: fix out of bounds read in prism2sta_probe_usb()
let's use usb_find_common_endpoints() to discover endpoints, it does all necessary checks for type and xfer direction
remove memset() in hfa384x_create(), because we now assign endpoints in prism2sta_probe_usb() and because create_wlan() uses kzalloc() to allocate hfa384x struct before calling hfa384x_create()
--- drivers/staging/wlan-ng/hfa384x_usb.c | 5 ----- drivers/staging/wlan-ng/prism2usb.c | 19 ++++++------------- 2 files changed, 6 insertions(+), 18 deletions(-)
drivers/staging/wlan-ng/hfa384x_usb.c +0 -5
@@ -524,13 +524,8 @@ static void hfa384x_usb_defer(struct work_struct *data)*/ void hfa384x_create (struct hfa384x *hw,struct usb_device *usb) { -memset (hw,0 ,sizeof (*hw)); hw->usb = usb; -/* set up the endpoints */ - hw->endp_in =usb_rcvbulkpipe (usb,1 ); - hw->endp_out =usb_sndbulkpipe (usb,2 ); -/* Set up the waitq */ init_waitqueue_head (&hw->cmdq);
drivers/staging/wlan-ng/prism2usb.c +6 -13
@@ -61,23 +61,14 @@ static int prism2sta_probe_usb(struct usb_interface *interface, const struct usb_device_id *id) {struct usb_device *dev; -const struct usb_endpoint_descriptor *epd; -const struct usb_host_interface *iface_desc = interface->cur_altsetting; +struct usb_endpoint_descriptor *bulk_in, *bulk_out; +struct usb_host_interface *iface_desc = interface->cur_altsetting;struct wlandevice *wlandev =NULL ;struct hfa384x *hw =NULL ;int result =0 ; -if (iface_desc->desc.bNumEndpoints !=2 ) { - result = -ENODEV ; - goto failed; - } - - result = -EINVAL ; - epd = &iface_desc->endpoint[1 ].desc; -if (!usb_endpoint_is_bulk_in (epd)) - goto failed; - epd = &iface_desc->endpoint[2 ].desc; -if (!usb_endpoint_is_bulk_out (epd)) + result =usb_find_common_endpoints (iface_desc, &bulk_in, &bulk_out,NULL ,NULL ); +if (result) goto failed; dev =interface_to_usbdev (interface);
@@ -96,6 +87,8 @@ static int prism2sta_probe_usb(struct usb_interface *interface, }/* Initialize the hw data */ + hw->endp_in =usb_rcvbulkpipe (dev, bulk_in->bEndpointAddress); + hw->endp_out =usb_sndbulkpipe (dev, bulk_out->bEndpointAddress);hfa384x_create (hw, dev); hw->wlandev = wlandev;
Signature · 1 line
2.28.0