]> git.alsa-project.org Git - alsa-lib.git/commitdiff
topology: use snd_config_get_llong() in tplg_get_integer/unsigned()
authorJaroslav Kysela <perex@perex.cz>
Fri, 31 Jul 2026 09:37:55 +0000 (11:37 +0200)
committerJaroslav Kysela <perex@perex.cz>
Fri, 31 Jul 2026 10:26:29 +0000 (12:26 +0200)
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 <perex@perex.cz>
src/topology/parser.c

index 9814a9f7af7d99961f7325e7c4697777bdac3c32..d43c21e312f2907cf369f17e706e2ed674ac900b 100644 (file)
  */
 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;
 }
 
 /*