Skip to content
This repository has been archived by the owner on Sep 18, 2022. It is now read-only.

Commit

Permalink
ALSA: hda - Fix memory leaks in Realtek & Conexant codec parsers
Browse files Browse the repository at this point in the history
When moved to the helper code, forgot to release the verb arrays.

Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
tiwai committed Jun 26, 2012
1 parent befae82 commit ee48df5
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 2 deletions.
1 change: 0 additions & 1 deletion sound/pci/hda/hda_auto_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,6 @@ int snd_hda_gen_add_verbs(struct hda_gen_spec *spec,
const struct hda_verb *list)
{
const struct hda_verb **v;
snd_array_init(&spec->verbs, sizeof(struct hda_verb *), 8);
v = snd_array_new(&spec->verbs);
if (!v)
return -ENOMEM;
Expand Down
10 changes: 10 additions & 0 deletions sound/pci/hda/hda_auto_parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,4 +157,14 @@ void snd_hda_pick_fixup(struct hda_codec *codec,
const struct snd_pci_quirk *quirk,
const struct hda_fixup *fixlist);

static inline void snd_hda_gen_init(struct hda_gen_spec *spec)
{
snd_array_init(&spec->verbs, sizeof(struct hda_verb *), 8);
}

static inline void snd_hda_gen_free(struct hda_gen_spec *spec)
{
snd_array_free(&spec->verbs);
}

#endif /* __SOUND_HDA_AUTO_PARSER_H */
5 changes: 4 additions & 1 deletion sound/pci/hda/patch_conexant.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,8 +445,10 @@ static int conexant_init(struct hda_codec *codec)

static void conexant_free(struct hda_codec *codec)
{
struct conexant_spec *spec = codec->spec;
snd_hda_gen_free(&spec->gen);
snd_hda_detach_beep_device(codec);
kfree(codec->spec);
kfree(spec);
}

static const struct snd_kcontrol_new cxt_capture_mixers[] = {
Expand Down Expand Up @@ -4498,6 +4500,7 @@ static int patch_conexant_auto(struct hda_codec *codec)
if (!spec)
return -ENOMEM;
codec->spec = spec;
snd_hda_gen_init(&spec->gen);

switch (codec->vendor_id) {
case 0x14f15045:
Expand Down
2 changes: 2 additions & 0 deletions sound/pci/hda/patch_realtek.c
Original file line number Diff line number Diff line change
Expand Up @@ -2289,6 +2289,7 @@ static void alc_free(struct hda_codec *codec)
alc_shutup(codec);
alc_free_kctls(codec);
alc_free_bind_ctls(codec);
snd_hda_gen_free(&spec->gen);
kfree(spec);
snd_hda_detach_beep_device(codec);
}
Expand Down Expand Up @@ -4253,6 +4254,7 @@ static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
return -ENOMEM;
codec->spec = spec;
spec->mixer_nid = mixer_nid;
snd_hda_gen_init(&spec->gen);

err = alc_codec_rename_from_preset(codec);
if (err < 0) {
Expand Down

0 comments on commit ee48df5

Please sign in to comment.