[PATCH 2/2] ALSA: gus: Fix memory leaks at error paths in memory allocations
Jaroslav Kysela
perex at perex.cz
Mon Dec 13 15:02:46 CET 2021
On 13. 12. 21 14:24, Takashi Iwai wrote:
> When snd_gf1_mem_xalloc() returns NULL, the current code still leaves
> the formerly allocated block.name string but returns an error
> immediately. This patch covers the all callers to deal with the
> release of leftover name strings in the error paths.
>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
It may be easier to pass the name to snd_gf1_mem_xalloc() - the code flow is more readable:
diff --git a/sound/isa/gus/gus_mem.c b/sound/isa/gus/gus_mem.c
index ff9480f249fe..cd087267b3ea 100644
--- a/sound/isa/gus/gus_mem.c
+++ b/sound/isa/gus/gus_mem.c
@@ -25,14 +25,22 @@ void snd_gf1_mem_lock(struct snd_gf1_mem * alloc, int xup)
}
static struct snd_gf1_mem_block *snd_gf1_mem_xalloc(struct snd_gf1_mem * alloc,
- struct snd_gf1_mem_block * block)
+ struct snd_gf1_mem_block * block,
+ const char * _name)
{
struct snd_gf1_mem_block *pblock, *nblock;
+ char *name;
+ name = kstrdup(_name, GFP_KERNEL);
+ if (name == NULL)
+ return NULL
nblock = kmalloc(sizeof(struct snd_gf1_mem_block), GFP_KERNEL);
- if (nblock == NULL)
+ if (nblock == NULL) {
+ kfree(name);
return NULL;
+ }
*nblock = *block;
+ nblock->name = name;
pblock = alloc->first;
while (pblock) {
if (pblock->ptr > nblock->ptr) {
@@ -198,8 +206,7 @@ struct snd_gf1_mem_block *snd_gf1_mem_alloc(struct snd_gf1_mem * alloc, int owne
if (share_id != NULL)
memcpy(&block.share_id, share_id, sizeof(block.share_id));
block.owner = owner;
- block.name = kstrdup(name, GFP_KERNEL);
- nblock = snd_gf1_mem_xalloc(alloc, &block);
+ nblock = snd_gf1_mem_xalloc(alloc, &block, name);
snd_gf1_mem_lock(alloc, 1);
return nblock;
}
@@ -236,14 +243,12 @@ int snd_gf1_mem_init(struct snd_gus_card * gus)
if (gus->gf1.enh_mode) {
block.ptr = 0;
block.size = 1024;
- block.name = kstrdup("InterWave LFOs", GFP_KERNEL);
- if (snd_gf1_mem_xalloc(alloc, &block) == NULL)
+ if (snd_gf1_mem_xalloc(alloc, &block, "InterWave LFOs") == NULL)
return -ENOMEM;
}
block.ptr = gus->gf1.default_voice_address;
block.size = 4;
- block.name = kstrdup("Voice default (NULL's)", GFP_KERNEL);
- if (snd_gf1_mem_xalloc(alloc, &block) == NULL)
+ if (snd_gf1_mem_xalloc(alloc, &block, "Voice default (NULL's)") == NULL)
return -ENOMEM;
#ifdef CONFIG_SND_DEBUG
snd_card_ro_proc_new(gus->card, "gusmem", gus, snd_gf1_mem_info_read);
Jaroslav
--
Jaroslav Kysela <perex at perex.cz>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.
More information about the Alsa-devel
mailing list