aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Khoroshilov <khoroshilov@ispras.ru>2013-12-27 16:18:39 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-01-07 05:55:58 -0500
commitcd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c (patch)
tree6819e3e9cf6bd615dc64144f366a178b02ee274a
parent42f8f39e278b834ab2b90419f9acbdb02472cdeb (diff)
[media] as102: fix leaks at failure paths in as102_usb_probe()
Failure handling is incomplete in as102_usb_probe(). The patch implements proper resource deallocations. Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/staging/media/as102/as102_usb_drv.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/staging/media/as102/as102_usb_drv.c b/drivers/staging/media/as102/as102_usb_drv.c
index 8759553decac..e4a69454ebeb 100644
--- a/drivers/staging/media/as102/as102_usb_drv.c
+++ b/drivers/staging/media/as102/as102_usb_drv.c
@@ -401,14 +401,21 @@ static int as102_usb_probe(struct usb_interface *intf,
401 /* request buffer allocation for streaming */ 401 /* request buffer allocation for streaming */
402 ret = as102_alloc_usb_stream_buffer(as102_dev); 402 ret = as102_alloc_usb_stream_buffer(as102_dev);
403 if (ret != 0) 403 if (ret != 0)
404 goto failed; 404 goto failed_stream;
405 405
406 /* register dvb layer */ 406 /* register dvb layer */
407 ret = as102_dvb_register(as102_dev); 407 ret = as102_dvb_register(as102_dev);
408 if (ret != 0)
409 goto failed_dvb;
408 410
409 return ret; 411 return ret;
410 412
413failed_dvb:
414 as102_free_usb_stream_buffer(as102_dev);
415failed_stream:
416 usb_deregister_dev(intf, &as102_usb_class_driver);
411failed: 417failed:
418 usb_put_dev(as102_dev->bus_adap.usb_dev);
412 usb_set_intfdata(intf, NULL); 419 usb_set_intfdata(intf, NULL);
413 kfree(as102_dev); 420 kfree(as102_dev);
414 return ret; 421 return ret;