diff options
| author | Maksim Salau <maksim.salau@gmail.com> | 2017-04-23 13:31:40 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-05-03 11:36:39 -0400 |
| commit | 4684be169a6700a1c1c5647d6f83f987f45d81fa (patch) | |
| tree | 0a809c13bf8442917203f5de10813c77aed91c59 /drivers/net | |
| parent | 07389a140f48a3d5d223881bb01cef9f389e2844 (diff) | |
net: can: usb: gs_usb: Fix buffer on stack
commit b05c73bd1e3ec60357580eb042ee932a5ed754d5 upstream.
Allocate buffers on HEAP instead of STACK for local structures
that are to be sent using usb_control_msg().
Signed-off-by: Maksim Salau <maksim.salau@gmail.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/can/usb/gs_usb.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index a0dabd4038ba..7ab24c5262f3 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c | |||
| @@ -740,13 +740,18 @@ static const struct net_device_ops gs_usb_netdev_ops = { | |||
| 740 | static int gs_usb_set_identify(struct net_device *netdev, bool do_identify) | 740 | static int gs_usb_set_identify(struct net_device *netdev, bool do_identify) |
| 741 | { | 741 | { |
| 742 | struct gs_can *dev = netdev_priv(netdev); | 742 | struct gs_can *dev = netdev_priv(netdev); |
| 743 | struct gs_identify_mode imode; | 743 | struct gs_identify_mode *imode; |
| 744 | int rc; | 744 | int rc; |
| 745 | 745 | ||
| 746 | imode = kmalloc(sizeof(*imode), GFP_KERNEL); | ||
| 747 | |||
| 748 | if (!imode) | ||
| 749 | return -ENOMEM; | ||
| 750 | |||
| 746 | if (do_identify) | 751 | if (do_identify) |
| 747 | imode.mode = GS_CAN_IDENTIFY_ON; | 752 | imode->mode = GS_CAN_IDENTIFY_ON; |
| 748 | else | 753 | else |
| 749 | imode.mode = GS_CAN_IDENTIFY_OFF; | 754 | imode->mode = GS_CAN_IDENTIFY_OFF; |
| 750 | 755 | ||
| 751 | rc = usb_control_msg(interface_to_usbdev(dev->iface), | 756 | rc = usb_control_msg(interface_to_usbdev(dev->iface), |
| 752 | usb_sndctrlpipe(interface_to_usbdev(dev->iface), | 757 | usb_sndctrlpipe(interface_to_usbdev(dev->iface), |
| @@ -756,10 +761,12 @@ static int gs_usb_set_identify(struct net_device *netdev, bool do_identify) | |||
| 756 | USB_RECIP_INTERFACE, | 761 | USB_RECIP_INTERFACE, |
| 757 | dev->channel, | 762 | dev->channel, |
| 758 | 0, | 763 | 0, |
| 759 | &imode, | 764 | imode, |
| 760 | sizeof(imode), | 765 | sizeof(*imode), |
| 761 | 100); | 766 | 100); |
| 762 | 767 | ||
| 768 | kfree(imode); | ||
| 769 | |||
| 763 | return (rc > 0) ? 0 : rc; | 770 | return (rc > 0) ? 0 : rc; |
| 764 | } | 771 | } |
| 765 | 772 | ||
