From 1453c68fa47f56db250b775acde6954d3ca60aa6 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Fri, 31 Jul 2026 11:37:55 +0200 Subject: [PATCH] topology: use snd_config_get_llong() in tplg_get_integer/unsigned() Replace the per-type INTEGER/INTEGER64/STRING parsing in both functions with the new snd_config_get_llong() helper. In tplg_get_unsigned(), the string path now goes through safe_strtoll_base() instead of strtoul(); a negative value still wraps to the same unsigned result via the existing wraparound check, and values within the UINT_MAX range never overflow long long. In tplg_get_integer(), INTEGER64 config nodes are now also accepted (previously rejected), subject to the same INT_MIN/INT_MAX range check as before. Signed-off-by: Jaroslav Kysela --- src/topology/parser.c | 76 ++++++++----------------------------------- 1 file changed, 14 insertions(+), 62 deletions(-) diff --git a/src/topology/parser.c b/src/topology/parser.c index 9814a9f7..d43c21e3 100644 --- a/src/topology/parser.c +++ b/src/topology/parser.c @@ -25,31 +25,15 @@ */ int tplg_get_integer(snd_config_t *n, int *val, int base) { - const char *str; - long lval; + long long llval; int err; - switch (snd_config_get_type(n)) { - case SND_CONFIG_TYPE_INTEGER: - err = snd_config_get_integer(n, &lval); - if (err < 0) - return err; - goto __retval; - case SND_CONFIG_TYPE_STRING: - err = snd_config_get_string(n, &str); - if (err < 0) - return err; - err = safe_strtol_base(str, &lval, base); - if (err < 0) - return err; - goto __retval; - default: - return -EINVAL; - } - __retval: - if (lval < INT_MIN || lval > INT_MAX) + err = snd_config_get_llong(n, &llval, base); + if (err < 0) + return err; + if (llval < INT_MIN || llval > INT_MAX) return -ERANGE; - *val = lval; + *val = llval; return 0; } @@ -58,50 +42,18 @@ int tplg_get_integer(snd_config_t *n, int *val, int base) */ int tplg_get_unsigned(snd_config_t *n, unsigned *val, int base) { - const char *str; - long lval; long long llval; - unsigned long uval; int err; - switch (snd_config_get_type(n)) { - case SND_CONFIG_TYPE_INTEGER: - err = snd_config_get_integer(n, &lval); - if (err < 0) - return err; - if (lval < 0 && lval >= INT_MIN) - lval = UINT_MAX + lval + 1; - if (lval < 0 || lval > UINT_MAX) - return -ERANGE; - *val = lval; - return err; - case SND_CONFIG_TYPE_INTEGER64: - err = snd_config_get_integer64(n, &llval); - if (err < 0) - return err; - if (llval < 0 && llval >= INT_MIN) - llval = UINT_MAX + llval + 1; - if (llval < 0 || llval > UINT_MAX) - return -ERANGE; - *val = llval; + err = snd_config_get_llong(n, &llval, base); + if (err < 0) return err; - case SND_CONFIG_TYPE_STRING: - err = snd_config_get_string(n, &str); - if (err < 0) - return err; - errno = 0; - uval = strtoul(str, NULL, base); - if (errno == ERANGE && uval == ULONG_MAX) - return -ERANGE; - if (errno && uval == 0) - return -EINVAL; - if (uval > UINT_MAX) - return -ERANGE; - *val = uval; - return 0; - default: - return -EINVAL; - } + if (llval < 0 && llval >= INT_MIN) + llval = UINT_MAX + llval + 1; + if (llval < 0 || llval > UINT_MAX) + return -ERANGE; + *val = llval; + return 0; } /* -- 2.52.0