diff options
author | Johan Hovold <johan@kernel.org> | 2017-03-13 08:53:57 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-05-25 09:44:42 -0400 |
commit | 1b24b8c070230d4a539063ca3291233fa0cd80a6 (patch) | |
tree | 80af672751c77d81bfaa9626eaaa8ceae5373fe3 /drivers | |
parent | 40616929f87e1bb236f5daa0dffa3a95553ac76a (diff) |
cx231xx-audio: fix init error path
commit fff1abc4d54e469140a699612b4db8d6397bfcba upstream.
Make sure to release the snd_card also on a late allocation error.
Fixes: e0d3bafd0258 ("V4L/DVB (10954): Add cx231xx USB driver")
Cc: Sri Deevi <Srinivasa.Deevi@conexant.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/usb/cx231xx/cx231xx-audio.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/drivers/media/usb/cx231xx/cx231xx-audio.c b/drivers/media/usb/cx231xx/cx231xx-audio.c index 8263c4b0610b..2ca713b1c086 100644 --- a/drivers/media/usb/cx231xx/cx231xx-audio.c +++ b/drivers/media/usb/cx231xx/cx231xx-audio.c | |||
@@ -674,10 +674,8 @@ static int cx231xx_audio_init(struct cx231xx *dev) | |||
674 | 674 | ||
675 | spin_lock_init(&adev->slock); | 675 | spin_lock_init(&adev->slock); |
676 | err = snd_pcm_new(card, "Cx231xx Audio", 0, 0, 1, &pcm); | 676 | err = snd_pcm_new(card, "Cx231xx Audio", 0, 0, 1, &pcm); |
677 | if (err < 0) { | 677 | if (err < 0) |
678 | snd_card_free(card); | 678 | goto err_free_card; |
679 | return err; | ||
680 | } | ||
681 | 679 | ||
682 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, | 680 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, |
683 | &snd_cx231xx_pcm_capture); | 681 | &snd_cx231xx_pcm_capture); |
@@ -691,10 +689,9 @@ static int cx231xx_audio_init(struct cx231xx *dev) | |||
691 | INIT_WORK(&dev->wq_trigger, audio_trigger); | 689 | INIT_WORK(&dev->wq_trigger, audio_trigger); |
692 | 690 | ||
693 | err = snd_card_register(card); | 691 | err = snd_card_register(card); |
694 | if (err < 0) { | 692 | if (err < 0) |
695 | snd_card_free(card); | 693 | goto err_free_card; |
696 | return err; | 694 | |
697 | } | ||
698 | adev->sndcard = card; | 695 | adev->sndcard = card; |
699 | adev->udev = dev->udev; | 696 | adev->udev = dev->udev; |
700 | 697 | ||
@@ -713,9 +710,10 @@ static int cx231xx_audio_init(struct cx231xx *dev) | |||
713 | "audio EndPoint Addr 0x%x, Alternate settings: %i\n", | 710 | "audio EndPoint Addr 0x%x, Alternate settings: %i\n", |
714 | adev->end_point_addr, adev->num_alt); | 711 | adev->end_point_addr, adev->num_alt); |
715 | adev->alt_max_pkt_size = kmalloc(32 * adev->num_alt, GFP_KERNEL); | 712 | adev->alt_max_pkt_size = kmalloc(32 * adev->num_alt, GFP_KERNEL); |
716 | 713 | if (!adev->alt_max_pkt_size) { | |
717 | if (adev->alt_max_pkt_size == NULL) | 714 | err = -ENOMEM; |
718 | return -ENOMEM; | 715 | goto err_free_card; |
716 | } | ||
719 | 717 | ||
720 | for (i = 0; i < adev->num_alt; i++) { | 718 | for (i = 0; i < adev->num_alt; i++) { |
721 | u16 tmp = | 719 | u16 tmp = |
@@ -729,6 +727,11 @@ static int cx231xx_audio_init(struct cx231xx *dev) | |||
729 | } | 727 | } |
730 | 728 | ||
731 | return 0; | 729 | return 0; |
730 | |||
731 | err_free_card: | ||
732 | snd_card_free(card); | ||
733 | |||
734 | return err; | ||
732 | } | 735 | } |
733 | 736 | ||
734 | static int cx231xx_audio_fini(struct cx231xx *dev) | 737 | static int cx231xx_audio_fini(struct cx231xx *dev) |