Skip to content

Commit

Permalink
ucm: simplify and fix the previous patch (geti)
Browse files Browse the repository at this point in the history
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: 436cd5b ("ucm: add existence checks to geti calls")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
  • Loading branch information
perexg committed Jan 15, 2023
1 parent 436cd5b commit c083417
Showing 1 changed file with 20 additions and 70 deletions.
90 changes: 20 additions & 70 deletions src/ucm/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) {
Expand All @@ -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
Expand Down

0 comments on commit c083417

Please sign in to comment.