diff options
author | Takashi Iwai <tiwai@suse.de> | 2008-02-05 12:21:33 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2008-02-05 12:21:33 +0100 |
commit | d31e8f85727f948bd64b929e694fe2cd96d68889 (patch) | |
tree | de4e706dcfec0f2011d5ab06433bba9325f78a34 | |
parent | 2b0bf1d0a1d731307ed19f5927b2726a77b7470f (diff) | |
download | salsa-lib-d31e8f85727f948bd64b929e694fe2cd96d68889.tar.gz |
Fix memleaks
-rw-r--r-- | src/pcm.c | 8 | ||||
-rw-r--r-- | src/pcm_params.c | 4 |
2 files changed, 9 insertions, 3 deletions
@@ -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); |