summaryrefslogtreecommitdiff
path: root/drivers/media
diff options
context:
space:
mode:
authorJames Patrick-Evans <james@jmp-e.com>2016-07-15 18:40:45 +0300
committerSasha Levin <alexander.levin@verizon.com>2016-08-08 04:58:44 +0300
commitd380c88d88ed317a7493e5cba85fa0ebecf38ac9 (patch)
tree93ea435d7b790e2c32e8968ea8094ab5f12aae32 /drivers/media
parent5f51fe4b87db1002807eb448cd644afeab74339a (diff)
downloadlinux-d380c88d88ed317a7493e5cba85fa0ebecf38ac9.tar.xz
media: fix airspy usb probe error path
[ Upstream commit aa93d1fee85c890a34f2510a310e55ee76a27848 ] Fix a memory leak on probe error of the airspy usb device driver. The problem is triggered when more than 64 usb devices register with v4l2 of type VFL_TYPE_SDR or VFL_TYPE_SUBDEV. The memory leak is caused by the probe function of the airspy driver mishandeling errors and not freeing the corresponding control structures when an error occours registering the device to v4l2 core. A badusb device can emulate 64 of these devices, and then through continual emulated connect/disconnect of the 65th device, cause the kernel to run out of RAM and crash the kernel, thus causing a local DOS vulnerability. Fixes CVE-2016-5400 Signed-off-by: James Patrick-Evans <james@jmp-e.com> Reviewed-by: Kees Cook <keescook@chromium.org> Cc: stable@vger.kernel.org # 3.17+ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/usb/airspy/airspy.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/media/usb/airspy/airspy.c b/drivers/media/usb/airspy/airspy.c
index 4069234abed5..cc92ae7ba462 100644
--- a/drivers/media/usb/airspy/airspy.c
+++ b/drivers/media/usb/airspy/airspy.c
@@ -1072,7 +1072,7 @@ static int airspy_probe(struct usb_interface *intf,
if (ret) {
dev_err(s->dev, "Failed to register as video device (%d)\n",
ret);
- goto err_unregister_v4l2_dev;
+ goto err_free_controls;
}
dev_info(s->dev, "Registered as %s\n",
video_device_node_name(&s->vdev));
@@ -1081,7 +1081,6 @@ static int airspy_probe(struct usb_interface *intf,
err_free_controls:
v4l2_ctrl_handler_free(&s->hdl);
-err_unregister_v4l2_dev:
v4l2_device_unregister(&s->v4l2_dev);
err_free_mem:
kfree(s);