mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-04 13:30:08 -05:00
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:
parent
f2d39afe61
commit
ca487c9511
1 changed files with 23 additions and 9 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue