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>
This commit is contained in:
Jaroslav Kysela 2023-01-15 18:32:20 +01:00
parent 436cd5b6d0
commit c083417b72

View file

@ -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
/*
* a helper macro to obtain status and existence
*/
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
*/
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