aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorMaksim Salau <maksim.salau@gmail.com>2017-04-23 13:31:40 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-05-03 11:36:39 -0400
commit4684be169a6700a1c1c5647d6f83f987f45d81fa (patch)
tree0a809c13bf8442917203f5de10813c77aed91c59 /drivers/net
parent07389a140f48a3d5d223881bb01cef9f389e2844 (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.c17
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 = {
740static int gs_usb_set_identify(struct net_device *netdev, bool do_identify) 740static 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