summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2022-05-17 19:25:20 +0200
committerJaroslav Kysela <perex@perex.cz>2022-05-17 19:25:28 +0200
commit55340cf96aefcd476ff9b504507e3d3f25dfd72a (patch)
tree7329f5b284f8ba5e92f05bfefc12bd99935eb306
parent80ac6f986685f3bb7872fcdfcb81c16611dfb3af (diff)
downloadalsa-lib-55340cf96aefcd476ff9b504507e3d3f25dfd72a.tar.gz
ucm: macro - add deep call protection (recursion)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r--src/ucm/parser.c6
-rw-r--r--src/ucm/ucm_local.h1
2 files changed, 7 insertions, 0 deletions
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 53588494..71b95f0e 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -575,7 +575,13 @@ int uc_mgr_evaluate_inplace(snd_use_case_mgr_t *uc_mgr,
/* conditions may depend on them */
if (err2 == 0)
continue;
+ uc_mgr->macro_hops++;
+ if (uc_mgr->macro_hops > 100) {
+ uc_error("Maximal macro hops reached!");
+ return -EINVAL;
+ }
err3 = evaluate_macro(uc_mgr, cfg);
+ uc_mgr->macro_hops--;
if (err3 < 0)
return err3;
if (err3 == 0)
diff --git a/src/ucm/ucm_local.h b/src/ucm/ucm_local.h
index 3f59bb2c..2c8d004d 100644
--- a/src/ucm/ucm_local.h
+++ b/src/ucm/ucm_local.h
@@ -264,6 +264,7 @@ struct snd_use_case_mgr {
/* tree with macros */
snd_config_t *macros;
+ int macro_hops;
/* local library configuration */
snd_config_t *local_config;