From: Jaroslav Kysela Date: Tue, 4 Jun 2013 13:58:34 +0000 (+0200) Subject: pcm_direct: fix the memory leak when parsing the slave definitions X-Git-Tag: android-x86-9.0-r1~847 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=ca487c9511c1500184023dfea803a5e785d725e2;p=android-x86%2Fexternal-alsa-lib.git pcm_direct: fix the memory leak when parsing the slave definitions Reported-by: Signed-off-by: Jaroslav Kysela --- diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c index 38c6c662..101d3c8a 100644 --- a/src/pcm/pcm_direct.c +++ b/src/pcm/pcm_direct.c @@ -1453,7 +1453,7 @@ static int _snd_pcm_direct_get_slave_ipc_offset(snd_config_t *root, int hop) { snd_config_iterator_t i, next; - snd_config_t *pcm_conf; + snd_config_t *pcm_conf, *pcm_conf2; int err; long card = 0, device = 0, subdevice = 0; const char *str; @@ -1484,14 +1484,28 @@ static int _snd_pcm_direct_get_slave_ipc_offset(snd_config_t *root, } #endif - if (snd_config_search(sconf, "slave", &pcm_conf) >= 0 && - (snd_config_search(pcm_conf, "pcm", &pcm_conf) >= 0 || - (snd_config_get_string(pcm_conf, &str) >= 0 && - snd_config_search_definition(root, "pcm_slave", str, &pcm_conf) >= 0 && - snd_config_search(pcm_conf, "pcm", &pcm_conf) >= 0))) - return _snd_pcm_direct_get_slave_ipc_offset(root, pcm_conf, - direction, - hop + 1); + if (snd_config_search(sconf, "slave", &pcm_conf) >= 0) { + if (snd_config_search(pcm_conf, "pcm", &pcm_conf) >= 0) { + return _snd_pcm_direct_get_slave_ipc_offset(root, + pcm_conf, + direction, + hop + 1); + } else { + if (snd_config_get_string(pcm_conf, &str) >= 0 && + snd_config_search_definition(root, "pcm_slave", + str, &pcm_conf) >= 0) { + if (snd_config_search(pcm_conf, "pcm", + &pcm_conf2) >= 0) { + err = + _snd_pcm_direct_get_slave_ipc_offset( + root, pcm_conf2, direction, hop + 1); + snd_config_delete(pcm_conf); + return err; + } + snd_config_delete(pcm_conf); + } + } + } snd_config_for_each(i, next, sconf) { snd_config_t *n = snd_config_iterator_entry(i);