Skip to content

Commit

Permalink
usb: misc: legousbtower: Fix buffers on stack
Browse files Browse the repository at this point in the history
Allocate buffers on HEAP instead of STACK for local structures
that are to be received using usb_control_msg().

Signed-off-by: Maksim Salau <maksim.salau@gmail.com>
Tested-by: Alfredo Rafael Vicente Boix <alviboi@gmail.com>;
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Maksim Salau authored and Greg Kroah-Hartman committed Apr 26, 2017
1 parent 1944581 commit 942a487
Showing 1 changed file with 27 additions and 10 deletions.
37 changes: 27 additions & 10 deletions drivers/usb/misc/legousbtower.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,9 +317,16 @@ static int tower_open (struct inode *inode, struct file *file)
int subminor;
int retval = 0;
struct usb_interface *interface;
struct tower_reset_reply reset_reply;
struct tower_reset_reply *reset_reply;
int result;

reset_reply = kmalloc(sizeof(*reset_reply), GFP_KERNEL);

if (!reset_reply) {
retval = -ENOMEM;
goto exit;
}

nonseekable_open(inode, file);
subminor = iminor(inode);

Expand Down Expand Up @@ -364,8 +371,8 @@ static int tower_open (struct inode *inode, struct file *file)
USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
0,
0,
&reset_reply,
sizeof(reset_reply),
reset_reply,
sizeof(*reset_reply),
1000);
if (result < 0) {
dev_err(&dev->udev->dev,
Expand Down Expand Up @@ -406,6 +413,7 @@ static int tower_open (struct inode *inode, struct file *file)
mutex_unlock(&dev->lock);

exit:
kfree(reset_reply);
return retval;
}

Expand Down Expand Up @@ -806,7 +814,7 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device
struct device *idev = &interface->dev;
struct usb_device *udev = interface_to_usbdev(interface);
struct lego_usb_tower *dev = NULL;
struct tower_get_version_reply get_version_reply;
struct tower_get_version_reply *get_version_reply = NULL;
int retval = -ENOMEM;
int result;

Expand Down Expand Up @@ -871,25 +879,33 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device
dev->interrupt_in_interval = interrupt_in_interval ? interrupt_in_interval : dev->interrupt_in_endpoint->bInterval;
dev->interrupt_out_interval = interrupt_out_interval ? interrupt_out_interval : dev->interrupt_out_endpoint->bInterval;

get_version_reply = kmalloc(sizeof(*get_version_reply), GFP_KERNEL);

if (!get_version_reply) {
retval = -ENOMEM;
goto error;
}

/* get the firmware version and log it */
result = usb_control_msg (udev,
usb_rcvctrlpipe(udev, 0),
LEGO_USB_TOWER_REQUEST_GET_VERSION,
USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_DEVICE,
0,
0,
&get_version_reply,
sizeof(get_version_reply),
get_version_reply,
sizeof(*get_version_reply),
1000);
if (result < 0) {
dev_err(idev, "LEGO USB Tower get version control request failed\n");
retval = result;
goto error;
}
dev_info(&interface->dev, "LEGO USB Tower firmware version is %d.%d "
"build %d\n", get_version_reply.major,
get_version_reply.minor,
le16_to_cpu(get_version_reply.build_no));
dev_info(&interface->dev,
"LEGO USB Tower firmware version is %d.%d build %d\n",
get_version_reply->major,
get_version_reply->minor,
le16_to_cpu(get_version_reply->build_no));

/* we can register the device now, as it is ready */
usb_set_intfdata (interface, dev);
Expand All @@ -913,6 +929,7 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device
return retval;

error:
kfree(get_version_reply);
tower_delete(dev);
return retval;
}
Expand Down

0 comments on commit 942a487

Please sign in to comment.