diff options
author | Alexey Khoroshilov <khoroshilov@ispras.ru> | 2013-12-27 16:18:39 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-01-07 05:55:58 -0500 |
commit | cd19f7d3e39b3160595d56bb3e3a2bf4f7f4669c (patch) | |
tree | 6819e3e9cf6bd615dc64144f366a178b02ee274a | |
parent | 42f8f39e278b834ab2b90419f9acbdb02472cdeb (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.c | 9 |
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 | ||
413 | failed_dvb: | ||
414 | as102_free_usb_stream_buffer(as102_dev); | ||
415 | failed_stream: | ||
416 | usb_deregister_dev(intf, &as102_usb_class_driver); | ||
411 | failed: | 417 | failed: |
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; |