diff options
author | Jaroslav Kysela <perex@perex.cz> | 2022-05-17 19:25:20 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2022-05-17 19:25:28 +0200 |
commit | 55340cf96aefcd476ff9b504507e3d3f25dfd72a (patch) | |
tree | 7329f5b284f8ba5e92f05bfefc12bd99935eb306 | |
parent | 80ac6f986685f3bb7872fcdfcb81c16611dfb3af (diff) | |
download | alsa-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.c | 6 | ||||
-rw-r--r-- | src/ucm/ucm_local.h | 1 |
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; |