Patch "can: gs_usb: Don't use stack memory for USB transfers" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
can: gs_usb: Don't use stack memory for USB transfers
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
can-gs_usb-don-t-use-stack-memory-for-usb-transfers.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
c919a3069c775c1c876bec55e00b2305d5125caaMon Sep 17 00:00:00 2001
From: Ethan Zonca <[email protected]>
Date: Fri, 24 Feb 2017 11:27:36 -0500
Subject: can: gs_usb: Don't use stack memory for USB transfers
From: Ethan Zonca <[email protected]>
commit c919a3069c775c1c876bec55e00b2305d5125caa upstream.
The gs_usb driver is performing USB transfers using buffers allocated on the stack. This causes the driver to not function with vmapped stacks. Instead, allocate memory for the transfer buffers.
--- drivers/net/can/usb/gs_usb.c | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-)
drivers/net/can/usb/gs_usb.c +29 -11
@@ -908,10 +908,14 @@ static int gs_usb_probe(struct usb_interstruct gs_usb *dev;int rc = -ENOMEM ;unsigned int icount, i; -struct gs_host_config hconf = { - .byte_order =0x0000beef , - }; -struct gs_device_config dconf; +struct gs_host_config *hconf; +struct gs_device_config *dconf; + + hconf =kmalloc (sizeof (*hconf),GFP_KERNEL ); +if (!hconf) +return -ENOMEM ; + + hconf->byte_order =0x0000beef ;/* send host config */ rc = usb_control_msg(interface_to_usbdev(intf),
@@ -920,16 +924,22 @@ static int gs_usb_probe(struct usb_interUSB_DIR_OUT |USB_TYPE_VENDOR |USB_RECIP_INTERFACE ,1 , intf->altsetting[0 ].desc.bInterfaceNumber, - &hconf, -sizeof (hconf), + hconf, +sizeof (*hconf), 1000); +kfree (hconf); +if (rc <0 ) {dev_err (&intf->dev,"Couldn't send data format (err=%d)\n" , rc);return rc; } + dconf =kmalloc (sizeof (*dconf),GFP_KERNEL ); +if (!dconf) +return -ENOMEM ; +/* read device config */ rc = usb_control_msg(interface_to_usbdev(intf), usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
@@ -937,28 +947,33 @@ static int gs_usb_probe(struct usb_interUSB_DIR_IN |USB_TYPE_VENDOR |USB_RECIP_INTERFACE ,1 , intf->altsetting[0 ].desc.bInterfaceNumber, - &dconf, -sizeof (dconf), + dconf, +sizeof (*dconf), 1000);if (rc <0 ) {dev_err (&intf->dev,"Couldn't get device config: (err=%d)\n" , rc); +kfree (dconf);return rc; } - icount = dconf.icount +1 ; + icount = dconf->icount +1 ;dev_info (&intf->dev,"Configuring for %d interfaces\n" , icount);if (icount >GS_MAX_INTF ) {dev_err (&intf->dev,"Driver cannot handle more that %d CAN interfaces\n" ,GS_MAX_INTF ); +kfree (dconf);return -EINVAL ; } dev =kzalloc (sizeof (*dev),GFP_KERNEL ); -if (!dev) +if (!dev) { +kfree (dconf);return -ENOMEM ; + } +init_usb_anchor (&dev->rx_submitted);atomic_set (&dev->active_channels,0 );
@@ -967,7 +982,7 @@ static int gs_usb_probe(struct usb_inter dev->udev =interface_to_usbdev (intf);for (i =0 ; i < icount; i++) { - dev->canch[i] =gs_make_candev (i, intf, &dconf); + dev->canch[i] =gs_make_candev (i, intf, dconf);if (IS_ERR_OR_NULL (dev->canch[i])) {/* save error code to return later */ rc =PTR_ERR (dev->canch[i]);
@@ -978,12 +993,15 @@ static int gs_usb_probe(struct usb_intergs_destroy_candev (dev->canch[i]);usb_kill_anchored_urbs (&dev->rx_submitted); +kfree (dconf);kfree (dev);return rc; } dev->canch[i]->parent = dev; } +kfree (dconf); +return 0 ; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/can-gs_usb-don-t-use-stack-memory-for-usb-transfers.patch