From a068cf08ad67447893b707cddfce31c9cafee643 Mon Sep 17 00:00:00 2001 From: Mike Gilbert Date: Mon, 8 Dec 2025 23:46:17 -0500 Subject: [PATCH 1/3] ucm: use closefrom instead of close_range closefrom is a library function with a fallback mechanism for when the kernel does not support the close_range syscall. Also check for the function properly instead of assuming it is available with _GNU_SOURCE defined. Closes: https://github.com/alsa-project/alsa-lib/pull/486 Fixes: https://github.com/alsa-project/alsa-lib/issues/485 Signed-off-by: Mike Gilbert Signed-off-by: Jaroslav Kysela --- configure.ac | 1 + src/ucm/ucm_exec.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 8f4bd0de..f4862f64 100644 --- a/configure.ac +++ b/configure.ac @@ -52,6 +52,7 @@ dnl Checks for library functions. AC_PROG_GCC_TRADITIONAL AC_CHECK_FUNCS([uselocale]) AC_CHECK_FUNCS([eaccess]) +AC_CHECK_DECLS([closefrom]) dnl Enable largefile support AC_SYS_LARGEFILE diff --git a/src/ucm/ucm_exec.c b/src/ucm/ucm_exec.c index b5a22023..713039b4 100644 --- a/src/ucm/ucm_exec.c +++ b/src/ucm/ucm_exec.c @@ -259,8 +259,8 @@ int uc_mgr_exec(const char *prog) close(f); -#if defined(_GNU_SOURCE) - close_range(3, maxfd, 0); +#if HAVE_DECL_CLOSEFROM + closefrom(3); #else for (f = 3; f < maxfd; f++) close(f); -- 2.51.1 From 813ffe34ff6c720dcc56e4549338bf9e9184af1f Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 9 Dec 2025 17:48:34 +0100 Subject: [PATCH 2/3] ucm: exec - fix maxfd used warning Fixes: a068cf08 ("ucm: use closefrom instead of close_range") Signed-off-by: Jaroslav Kysela --- src/ucm/ucm_exec.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ucm/ucm_exec.c b/src/ucm/ucm_exec.c index 713039b4..c16a4cfd 100644 --- a/src/ucm/ucm_exec.c +++ b/src/ucm/ucm_exec.c @@ -183,7 +183,7 @@ static int parse_args(char ***argv, int argc, const char *cmd) */ int uc_mgr_exec(const char *prog) { - pid_t p, f, maxfd; + pid_t p, f; int err = 0, status; char bin[PATH_MAX]; struct sigaction sa; @@ -212,8 +212,6 @@ int uc_mgr_exec(const char *prog) prog = bin; } - maxfd = sysconf(_SC_OPEN_MAX); - /* * block SIGCHLD signal * ignore SIGINT and SIGQUIT in parent @@ -262,8 +260,11 @@ int uc_mgr_exec(const char *prog) #if HAVE_DECL_CLOSEFROM closefrom(3); #else - for (f = 3; f < maxfd; f++) - close(f); + { + pid_t maxfd = sysconf(_SC_OPEN_MAX); + for (f = 3; f < maxfd; f++) + close(f); + } #endif /* install default handlers for the forked process */ -- 2.51.1 From a6238053c4fa518b214f99d91a01b96c5ef6e3ca Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 9 Dec 2025 18:04:07 +0100 Subject: [PATCH 3/3] conf: merge card specific contents per file (whole) after parsing Unfortunately, mentioned fix caused a regression for items stored in one file. Merge the file contents after parsing not inside parsing process. BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=2420645 Fixes: eda76146 ("conf: fix load_for_all_cards() - do not merge the card specific contents") Signed-off-by: Jaroslav Kysela --- src/conf.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/conf.c b/src/conf.c index 49499ecd..b1ec9b38 100644 --- a/src/conf.c +++ b/src/conf.c @@ -4119,14 +4119,21 @@ static int config_filename_filter(const struct dirent64 *dirent) static int config_file_open(snd_config_t *root, const char *filename, int merge) { snd_input_t *in; + snd_config_t *top; int err; err = snd_input_stdio_open(&in, filename, "r"); if (err >= 0) { - if (merge) + if (merge) { err = snd_config_load(root, in); - else - err = snd_config_load_override(root, in); + } else { + err = snd_config_top(&top); + if (err >= 0) { + err = snd_config_load(top, in); + if (err >= 0) + err = snd_config_merge(root, top, 1); + } + } snd_input_close(in); if (err < 0) snd_error(CORE, "%s may be old or corrupted: consider to remove or fix it", filename); -- 2.51.1