Commit f1801523 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

V4L/DVB (10296): uvcvideo: Fix memory leak in input device handling

The dynamically allocated input_dev->phys buffer isn't freed when
unregistering the device. As the input layer doesn't provide any release
callback, use a fixed-size buffer inside the uvc_device structure.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@skynet.be>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent efdc8a95
...@@ -24,26 +24,19 @@ ...@@ -24,26 +24,19 @@
#ifdef CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV #ifdef CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV
static int uvc_input_init(struct uvc_device *dev) static int uvc_input_init(struct uvc_device *dev)
{ {
struct usb_device *udev = dev->udev;
struct input_dev *input; struct input_dev *input;
char *phys = NULL;
int ret; int ret;
input = input_allocate_device(); input = input_allocate_device();
if (input == NULL) if (input == NULL)
return -ENOMEM; return -ENOMEM;
phys = kmalloc(6 + strlen(udev->bus->bus_name) + strlen(udev->devpath), usb_make_path(dev->udev, dev->input_phys, sizeof(dev->input_phys));
GFP_KERNEL); strlcat(dev->input_phys, "/button", sizeof(dev->input_phys));
if (phys == NULL) {
ret = -ENOMEM;
goto error;
}
sprintf(phys, "usb-%s-%s", udev->bus->bus_name, udev->devpath);
input->name = dev->name; input->name = dev->name;
input->phys = phys; input->phys = dev->input_phys;
usb_to_input_id(udev, &input->id); usb_to_input_id(dev->udev, &input->id);
input->dev.parent = &dev->intf->dev; input->dev.parent = &dev->intf->dev;
__set_bit(EV_KEY, input->evbit); __set_bit(EV_KEY, input->evbit);
...@@ -57,7 +50,6 @@ static int uvc_input_init(struct uvc_device *dev) ...@@ -57,7 +50,6 @@ static int uvc_input_init(struct uvc_device *dev)
error: error:
input_free_device(input); input_free_device(input);
kfree(phys);
return ret; return ret;
} }
......
...@@ -647,6 +647,7 @@ struct uvc_device { ...@@ -647,6 +647,7 @@ struct uvc_device {
struct urb *int_urb; struct urb *int_urb;
__u8 *status; __u8 *status;
struct input_dev *input; struct input_dev *input;
char input_phys[64];
/* Video Streaming interfaces */ /* Video Streaming interfaces */
struct list_head streaming; struct list_head streaming;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment