提交 f0e164f6 编写于 作者: T Takashi Iwai 提交者: Greg Kroah-Hartman

ALSA: usb-audio: Unify the release of usb_mixer_elem_info objects

commit 52c3e317a857091fd746e15179a637f32be4d337 upstream.

Instead of the direct kfree() calls, introduce a new local helper to
release the usb_mixer_elem_info object.  This will be extended to do
more than a single kfree() in the later patches.

Also, use the standard goto instead of multiple calls in
parse_audio_selector_unit() error paths.
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 dae4d839
...@@ -1041,10 +1041,15 @@ static struct usb_feature_control_info audio_feature_info[] = { ...@@ -1041,10 +1041,15 @@ static struct usb_feature_control_info audio_feature_info[] = {
{ UAC2_FU_PHASE_INVERTER, "Phase Inverter Control", USB_MIXER_BOOLEAN, -1 }, { UAC2_FU_PHASE_INVERTER, "Phase Inverter Control", USB_MIXER_BOOLEAN, -1 },
}; };
static void usb_mixer_elem_info_free(struct usb_mixer_elem_info *cval)
{
kfree(cval);
}
/* private_free callback */ /* private_free callback */
void snd_usb_mixer_elem_free(struct snd_kcontrol *kctl) void snd_usb_mixer_elem_free(struct snd_kcontrol *kctl)
{ {
kfree(kctl->private_data); usb_mixer_elem_info_free(kctl->private_data);
kctl->private_data = NULL; kctl->private_data = NULL;
} }
...@@ -1567,7 +1572,7 @@ static void __build_feature_ctl(struct usb_mixer_interface *mixer, ...@@ -1567,7 +1572,7 @@ static void __build_feature_ctl(struct usb_mixer_interface *mixer,
ctl_info = get_feature_control_info(control); ctl_info = get_feature_control_info(control);
if (!ctl_info) { if (!ctl_info) {
kfree(cval); usb_mixer_elem_info_free(cval);
return; return;
} }
if (mixer->protocol == UAC_VERSION_1) if (mixer->protocol == UAC_VERSION_1)
...@@ -1600,7 +1605,7 @@ static void __build_feature_ctl(struct usb_mixer_interface *mixer, ...@@ -1600,7 +1605,7 @@ static void __build_feature_ctl(struct usb_mixer_interface *mixer,
if (!kctl) { if (!kctl) {
usb_audio_err(mixer->chip, "cannot malloc kcontrol\n"); usb_audio_err(mixer->chip, "cannot malloc kcontrol\n");
kfree(cval); usb_mixer_elem_info_free(cval);
return; return;
} }
kctl->private_free = snd_usb_mixer_elem_free; kctl->private_free = snd_usb_mixer_elem_free;
...@@ -1770,7 +1775,7 @@ static void build_connector_control(struct usb_mixer_interface *mixer, ...@@ -1770,7 +1775,7 @@ static void build_connector_control(struct usb_mixer_interface *mixer,
kctl = snd_ctl_new1(&usb_connector_ctl_ro, cval); kctl = snd_ctl_new1(&usb_connector_ctl_ro, cval);
if (!kctl) { if (!kctl) {
usb_audio_err(mixer->chip, "cannot malloc kcontrol\n"); usb_audio_err(mixer->chip, "cannot malloc kcontrol\n");
kfree(cval); usb_mixer_elem_info_free(cval);
return; return;
} }
get_connector_control_name(mixer, term, is_input, kctl->id.name, get_connector_control_name(mixer, term, is_input, kctl->id.name,
...@@ -1823,7 +1828,7 @@ static int parse_clock_source_unit(struct mixer_build *state, int unitid, ...@@ -1823,7 +1828,7 @@ static int parse_clock_source_unit(struct mixer_build *state, int unitid,
kctl = snd_ctl_new1(&usb_bool_master_control_ctl_ro, cval); kctl = snd_ctl_new1(&usb_bool_master_control_ctl_ro, cval);
if (!kctl) { if (!kctl) {
kfree(cval); usb_mixer_elem_info_free(cval);
return -ENOMEM; return -ENOMEM;
} }
...@@ -2089,7 +2094,7 @@ static void build_mixer_unit_ctl(struct mixer_build *state, ...@@ -2089,7 +2094,7 @@ static void build_mixer_unit_ctl(struct mixer_build *state,
kctl = snd_ctl_new1(&usb_feature_unit_ctl, cval); kctl = snd_ctl_new1(&usb_feature_unit_ctl, cval);
if (!kctl) { if (!kctl) {
usb_audio_err(state->chip, "cannot malloc kcontrol\n"); usb_audio_err(state->chip, "cannot malloc kcontrol\n");
kfree(cval); usb_mixer_elem_info_free(cval);
return; return;
} }
kctl->private_free = snd_usb_mixer_elem_free; kctl->private_free = snd_usb_mixer_elem_free;
...@@ -2487,7 +2492,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, ...@@ -2487,7 +2492,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
kctl = snd_ctl_new1(&mixer_procunit_ctl, cval); kctl = snd_ctl_new1(&mixer_procunit_ctl, cval);
if (!kctl) { if (!kctl) {
kfree(cval); usb_mixer_elem_info_free(cval);
return -ENOMEM; return -ENOMEM;
} }
kctl->private_free = snd_usb_mixer_elem_free; kctl->private_free = snd_usb_mixer_elem_free;
...@@ -2625,7 +2630,7 @@ static void usb_mixer_selector_elem_free(struct snd_kcontrol *kctl) ...@@ -2625,7 +2630,7 @@ static void usb_mixer_selector_elem_free(struct snd_kcontrol *kctl)
if (kctl->private_data) { if (kctl->private_data) {
struct usb_mixer_elem_info *cval = kctl->private_data; struct usb_mixer_elem_info *cval = kctl->private_data;
num_ins = cval->max; num_ins = cval->max;
kfree(cval); usb_mixer_elem_info_free(cval);
kctl->private_data = NULL; kctl->private_data = NULL;
} }
if (kctl->private_value) { if (kctl->private_value) {
...@@ -2697,10 +2702,10 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, ...@@ -2697,10 +2702,10 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid,
break; break;
} }
namelist = kmalloc_array(desc->bNrInPins, sizeof(char *), GFP_KERNEL); namelist = kcalloc(desc->bNrInPins, sizeof(char *), GFP_KERNEL);
if (!namelist) { if (!namelist) {
kfree(cval); err = -ENOMEM;
return -ENOMEM; goto error_cval;
} }
#define MAX_ITEM_NAME_LEN 64 #define MAX_ITEM_NAME_LEN 64
for (i = 0; i < desc->bNrInPins; i++) { for (i = 0; i < desc->bNrInPins; i++) {
...@@ -2708,11 +2713,8 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, ...@@ -2708,11 +2713,8 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid,
len = 0; len = 0;
namelist[i] = kmalloc(MAX_ITEM_NAME_LEN, GFP_KERNEL); namelist[i] = kmalloc(MAX_ITEM_NAME_LEN, GFP_KERNEL);
if (!namelist[i]) { if (!namelist[i]) {
while (i--) err = -ENOMEM;
kfree(namelist[i]); goto error_name;
kfree(namelist);
kfree(cval);
return -ENOMEM;
} }
len = check_mapped_selector_name(state, unitid, i, namelist[i], len = check_mapped_selector_name(state, unitid, i, namelist[i],
MAX_ITEM_NAME_LEN); MAX_ITEM_NAME_LEN);
...@@ -2726,10 +2728,8 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, ...@@ -2726,10 +2728,8 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid,
kctl = snd_ctl_new1(&mixer_selectunit_ctl, cval); kctl = snd_ctl_new1(&mixer_selectunit_ctl, cval);
if (! kctl) { if (! kctl) {
usb_audio_err(state->chip, "cannot malloc kcontrol\n"); usb_audio_err(state->chip, "cannot malloc kcontrol\n");
for (i = 0; i < desc->bNrInPins; i++) err = -ENOMEM;
kfree(namelist[i]); goto error_name;
kfree(namelist);
kfree(cval);
return -ENOMEM; return -ENOMEM;
} }
kctl->private_value = (unsigned long)namelist; kctl->private_value = (unsigned long)namelist;
...@@ -2776,6 +2776,14 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid, ...@@ -2776,6 +2776,14 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid,
usb_audio_dbg(state->chip, "[%d] SU [%s] items = %d\n", usb_audio_dbg(state->chip, "[%d] SU [%s] items = %d\n",
cval->head.id, kctl->id.name, desc->bNrInPins); cval->head.id, kctl->id.name, desc->bNrInPins);
return snd_usb_mixer_add_control(&cval->head, kctl); return snd_usb_mixer_add_control(&cval->head, kctl);
error_name:
for (i = 0; i < desc->bNrInPins; i++)
kfree(namelist[i]);
kfree(namelist);
error_cval:
usb_mixer_elem_info_free(cval);
return err;
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册