[pulseaudio-discuss] [PATCH] alsa-mixer: Get rid of a compiler warning.

Tanu Kaskinen tanuk at iki.fi
Sun Mar 27 11:20:53 PDT 2011


On 64-bit systems LONG_MAX is greater than the largest possible value of a
uint32_t variable, which caused the compiler to warn about a comparison that is
always false. On 32-bit systems pa_atou() can return a value that will overflow
when assigned to e->volume_limit, which has type long, so the comparison was
necessary.

This dilemma is resolved by using pa_atol() instead of pa_atou().
---
 src/modules/alsa/alsa-mixer.c |    4 ++--
 src/pulsecore/core-util.c     |   30 +++++++++++++++++++++++-------
 src/pulsecore/core-util.h     |    1 +
 3 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 286931f..3b13879 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1920,14 +1920,14 @@ static int element_parse_volume_limit(
 
     pa_alsa_path *p = userdata;
     pa_alsa_element *e;
-    uint32_t volume_limit;
+    long volume_limit;
 
     if (!(e = element_get(p, section, TRUE))) {
         pa_log("[%s:%u] volume-limit makes no sense in '%s'", filename, line, section);
         return -1;
     }
 
-    if (pa_atou(rvalue, &volume_limit) < 0 || volume_limit > LONG_MAX) {
+    if (pa_atol(rvalue, &volume_limit) < 0 || volume_limit < 0) {
         pa_log("[%s:%u] Invalid value for volume-limit", filename, line);
         return -1;
     }
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 4823198..890efde 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2018,14 +2018,8 @@ int pa_atoi(const char *s, int32_t *ret_i) {
     pa_assert(s);
     pa_assert(ret_i);
 
-    errno = 0;
-    l = strtol(s, &x, 0);
-
-    if (!x || *x || errno) {
-        if (!errno)
-            errno = EINVAL;
+    if (pa_atol(s, &l) < 0)
         return -1;
-    }
 
     if ((int32_t) l != l) {
         errno = ERANGE;
@@ -2064,6 +2058,28 @@ int pa_atou(const char *s, uint32_t *ret_u) {
     return 0;
 }
 
+/* Convert the string s to a signed long integer in *ret_l. */
+int pa_atol(const char *s, long *ret_l) {
+    char *x = NULL;
+    long l;
+
+    pa_assert(s);
+    pa_assert(ret_l);
+
+    errno = 0;
+    l = strtol(s, &x, 0);
+
+    if (!x || *x || errno) {
+        if (!errno)
+            errno = EINVAL;
+        return -1;
+    }
+
+    *ret_l = l;
+
+    return 0;
+}
+
 #ifdef HAVE_STRTOF_L
 static locale_t c_locale = NULL;
 
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index 32641a3..0b34a18 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -135,6 +135,7 @@ char *pa_state_path(const char *fn, pa_bool_t prepend_machine_id);
 
 int pa_atoi(const char *s, int32_t *ret_i);
 int pa_atou(const char *s, uint32_t *ret_u);
+int pa_atol(const char *s, long *ret_l);
 int pa_atod(const char *s, double *ret_d);
 
 size_t pa_snprintf(char *str, size_t size, const char *format, ...);
-- 
1.7.4.1




More information about the pulseaudio-discuss mailing list