[alsa-devel] [PATCH 4/5] ALSA: usb-audio: deallocate memory objects in error path

Takashi Sakamoto o-takashi at sakamocchi.jp
Mon Feb 20 21:09:20 CET 2017


Some functions for quirks of Tascam US-16x08 have memory leaks.

This commit fixes the bugs.

Fixes: d2bb390a2081 ("ALSA: usb-audio: Tascam US-16x08 DSP mixer quirk")
Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
---
 sound/usb/mixer_us16x08.c | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/sound/usb/mixer_us16x08.c b/sound/usb/mixer_us16x08.c
index 5dae63c..d34dd1c 100644
--- a/sound/usb/mixer_us16x08.c
+++ b/sound/usb/mixer_us16x08.c
@@ -1082,8 +1082,8 @@ static int add_new_ctl(struct usb_mixer_interface *mixer,
 
 	kctl = snd_ctl_new1(ncontrol, elem);
 	if (!kctl) {
-		kfree(elem);
-		return -ENOMEM;
+		err = -ENOMEM;
+		goto end;
 	}
 
 	kctl->private_free = freeer;
@@ -1092,11 +1092,12 @@ static int add_new_ctl(struct usb_mixer_interface *mixer,
 
 	err = snd_usb_mixer_add_control(&elem->head, kctl);
 	if (err < 0)
-		return err;
+		goto end;
 
 	if (elem_ret)
 		*elem_ret = elem;
-
+end:
+	kfree(elem);
 	return 0;
 }
 
@@ -1367,7 +1368,7 @@ int snd_us16x08_controls_create(struct usb_mixer_interface *mixer)
 			usb_audio_dbg(mixer->chip,
 				"Failed to create route control, err:%d\n",
 				err);
-			return err;
+			goto err_allocated;
 		}
 		for (i = 0; i < 8; i++)
 			elem->cache_val[i] = i < 2 ? i : i + 2;
@@ -1388,7 +1389,7 @@ int snd_us16x08_controls_create(struct usb_mixer_interface *mixer)
 				comp_store,
 				master_controls[i].freeer, &elem);
 			if (err < 0)
-				return err;
+				goto err_allocated;
 			elem->cache_val[0] = master_controls[i].default_val;
 			elem->cached = 1;
 		}
@@ -1408,7 +1409,7 @@ int snd_us16x08_controls_create(struct usb_mixer_interface *mixer)
 				comp_store,
 				channel_controls[i].freeer, &elem);
 			if (err < 0)
-				return err;
+				goto err_allocated;
 			for (j = 0; j < SND_US16X08_MAX_CHANNELS; j++) {
 				elem->cache_val[j] =
 					channel_controls[i].default_val;
@@ -1429,7 +1430,7 @@ int snd_us16x08_controls_create(struct usb_mixer_interface *mixer)
 				eq_store,
 				eq_controls[i].freeer, NULL);
 			if (err < 0)
-				return err;
+				goto err_allocated;
 		}
 
 		/* add compressor controls */
@@ -1447,7 +1448,7 @@ int snd_us16x08_controls_create(struct usb_mixer_interface *mixer)
 				comp_store,
 				comp_controls[i].freeer, NULL);
 			if (err < 0)
-				return err;
+				goto err_allocated;
 		}
 
 		/* meter function 'get' must access to compressor store
@@ -1458,9 +1459,13 @@ int snd_us16x08_controls_create(struct usb_mixer_interface *mixer)
 			SND_US16X08_ID_METER, USB_MIXER_U16, 0, "Level Meter",
 			(void *) meter_store, snd_usb_mixer_elem_free, NULL);
 		if (err < 0)
-			return err;
+			goto err_allocated;
 	}
 
 	return 0;
+err_allocated:
+	kfree(meter_store);
+	kfree(eq_store);
+	kfree(comp_store);
+	return err;
 }
-
-- 
2.9.3



More information about the Alsa-devel mailing list