summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@perex.cz>2023-01-15 18:32:20 +0100
committerJaroslav Kysela <perex@perex.cz>2023-01-15 18:37:40 +0100
commitc083417b723a3485657234a21da3264419da1411 (patch)
tree23f3c38835d06a74e0ed2bfc366a5e1577a3c16b
parent436cd5b6d01edf7aedd58c209dc0d3b9adb111c6 (diff)
downloadalsa-lib-c083417b723a3485657234a21da3264419da1411.tar.gz
ucm: simplify and fix the previous patch (geti)
Use macro to maintain only one code. The status may be 0 or 1 - handle both values correctly. Also, fix the possible memory leak in snd_use_case_geti() - string str should be freed even when the error is returned. Fixes: 436cd5b6 ("ucm: add existence checks to geti calls") Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r--src/ucm/main.c90
1 files changed, 20 insertions, 70 deletions
diff --git a/src/ucm/main.c b/src/ucm/main.c
index ebbbf0b5..346c5dc8 100644
--- a/src/ucm/main.c
+++ b/src/ucm/main.c
@@ -2415,67 +2415,23 @@ int snd_use_case_get(snd_use_case_mgr_t *uc_mgr,
return err;
}
-/**
- * \brief check device status and existance
- * \param uc_mgr Use case manager
- * \param str device identifier
- * \param value Value pointer
- * \return Zero if success, otherwise a negative error code
- */
-static long check_device(snd_use_case_mgr_t *uc_mgr,
- const char *str,
- long *value)
-{
- struct use_case_device *dev;
- int err;
-
- if (!str) {
- return -EINVAL;
- }
- err = device_status(uc_mgr, str);
- if (err > 0) {
- *value = err;
- err = 0;
- } else if (err < 0) {
- return err;
- }
- dev = find_device(uc_mgr, uc_mgr->active_verb, str, 0);
- if (!dev) {
- return -ENOENT;
- }
- return 0;
-}
-
-/**
- * \brief check modifier status and existance
- * \param uc_mgr Use case manager
- * \param str modifier identifier
- * \param value Value pointer
- * \return Zero if success, otherwise a negative error code
+/*
+ * a helper macro to obtain status and existence
*/
-static long check_modifier(snd_use_case_mgr_t *uc_mgr,
- const char *str,
- long *value)
-{
- struct use_case_modifier *mod;
- long err;
-
- if (!str) {
- return -EINVAL;
- }
- err = modifier_status(uc_mgr, str);
- if (err > 0) {
- *value = err;
- return 0;
- } else if (err < 0) {
- return err;
- }
- mod = find_modifier(uc_mgr, uc_mgr->active_verb, str, 0);
- if (!mod) {
- return -ENOENT;
- }
- return 0;
-}
+#define geti(uc_mgr, status, ifind, str, value) ({ \
+ long val = -EINVAL; \
+ if (str) { \
+ val = (status)((uc_mgr), (str)); \
+ if (val >= 0) { \
+ if ((ifind)((uc_mgr), (uc_mgr)->active_verb, (str), 0)) { \
+ *(value) = val; \
+ } else { \
+ val = -ENOENT; \
+ } \
+ } \
+ } \
+ ; val; /* return value */ \
+})
/**
* \brief Get current - integer
@@ -2488,7 +2444,7 @@ int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
long *value)
{
char *str, *str1;
- long err;
+ int err;
pthread_mutex_lock(&uc_mgr->mutex);
if (0) {
@@ -2505,21 +2461,15 @@ int snd_use_case_geti(snd_use_case_mgr_t *uc_mgr,
str = NULL;
}
if (check_identifier(identifier, "_devstatus")) {
- err = check_device(uc_mgr, str, value);
- if (err < 0) {
- goto __end;
- }
+ err = geti(uc_mgr, device_status, find_device, str, value);
} else if (check_identifier(identifier, "_modstatus")) {
- err = check_modifier(uc_mgr, str, value);
- if (err < 0) {
- goto __end;
- }
+ err = geti(uc_mgr, modifier_status, find_modifier, str, value);
#if 0
/*
* enable this block if the else clause below is expanded to query
* user-supplied values
*/
- } else if (identifier[0] == '_')
+ } else if (identifier[0] == '_') {
err = -ENOENT;
#endif
} else