pcm_direct: fix the memory leak when parsing the slave definitions

Reported-by: <bolsunov@telum.ru>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2013-06-04 15:58:34 +02:00
parent f2d39afe61
commit ca487c9511

View file

@ -1453,7 +1453,7 @@ static int _snd_pcm_direct_get_slave_ipc_offset(snd_config_t *root,
int hop) int hop)
{ {
snd_config_iterator_t i, next; snd_config_iterator_t i, next;
snd_config_t *pcm_conf; snd_config_t *pcm_conf, *pcm_conf2;
int err; int err;
long card = 0, device = 0, subdevice = 0; long card = 0, device = 0, subdevice = 0;
const char *str; const char *str;
@ -1484,14 +1484,28 @@ static int _snd_pcm_direct_get_slave_ipc_offset(snd_config_t *root,
} }
#endif #endif
if (snd_config_search(sconf, "slave", &pcm_conf) >= 0 && if (snd_config_search(sconf, "slave", &pcm_conf) >= 0) {
(snd_config_search(pcm_conf, "pcm", &pcm_conf) >= 0 || if (snd_config_search(pcm_conf, "pcm", &pcm_conf) >= 0) {
(snd_config_get_string(pcm_conf, &str) >= 0 && return _snd_pcm_direct_get_slave_ipc_offset(root,
snd_config_search_definition(root, "pcm_slave", str, &pcm_conf) >= 0 && pcm_conf,
snd_config_search(pcm_conf, "pcm", &pcm_conf) >= 0))) direction,
return _snd_pcm_direct_get_slave_ipc_offset(root, pcm_conf, hop + 1);
direction, } else {
hop + 1); 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_for_each(i, next, sconf) {
snd_config_t *n = snd_config_iterator_entry(i); snd_config_t *n = snd_config_iterator_entry(i);