aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2008-02-05 12:21:33 +0100
committerTakashi Iwai <tiwai@suse.de>2008-02-05 12:21:33 +0100
commitd31e8f85727f948bd64b929e694fe2cd96d68889 (patch)
treede4e706dcfec0f2011d5ab06433bba9325f78a34
parent2b0bf1d0a1d731307ed19f5927b2726a77b7470f (diff)
downloadsalsa-lib-d31e8f85727f948bd64b929e694fe2cd96d68889.tar.gz
Fix memleaks
-rw-r--r--src/pcm.c8
-rw-r--r--src/pcm_params.c4
2 files changed, 9 insertions, 3 deletions
diff --git a/src/pcm.c b/src/pcm.c
index b31b7ba..7101194 100644
--- a/src/pcm.c
+++ b/src/pcm.c
@@ -78,7 +78,7 @@ int snd_pcm_open(snd_pcm_t **pcmp, const char *name,
char filename[32];
int card, dev, subdev;
int fd, err, fmode, ver;
- snd_pcm_t *pcm;
+ snd_pcm_t *pcm = NULL;
*pcmp = NULL;
@@ -115,7 +115,7 @@ int snd_pcm_open(snd_pcm_t **pcmp, const char *name,
snd_pcm_info_t info;
memset(&info, 0, sizeof(info));
if (ioctl(fd, SNDRV_PCM_IOCTL_INFO, &info) < 0) {
- return -errno;
+ err = -errno;
goto error;
}
subdev = info.subdevice;
@@ -146,6 +146,7 @@ int snd_pcm_open(snd_pcm_t **pcmp, const char *name,
return 0;
error:
+ free(pcm);
if (fd >= 0)
close(fd);
return err;
@@ -750,6 +751,9 @@ int _snd_pcm_mmap(snd_pcm_t *pcm)
{
unsigned int c;
+ /* clear first */
+ _snd_pcm_munmap(pcm);
+
pcm->mmap_channels = calloc(pcm->channels, sizeof(*pcm->mmap_channels));
if (!pcm->mmap_channels)
return -ENOMEM;
diff --git a/src/pcm_params.c b/src/pcm_params.c
index beb0e21..5c7bb1f 100644
--- a/src/pcm_params.c
+++ b/src/pcm_params.c
@@ -989,8 +989,10 @@ static int _snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
pcm->access == SND_PCM_ACCESS_MMAP_NONINTERLEAVED ||
pcm->access == SND_PCM_ACCESS_MMAP_COMPLEX) {
err = _snd_pcm_mmap(pcm);
- if (err < 0)
+ if (err < 0) {
+ _snd_pcm_munmap(pcm);
return err;
+ }
}
_snd_pcm_sync_ptr(pcm, 0);