]> code.delx.au - pulseaudio/commitdiff
alsa-mixer: Get rid of a compiler warning.
authorTanu Kaskinen <tanuk@iki.fi>
Sun, 27 Mar 2011 18:35:03 +0000 (21:35 +0300)
committerColin Guthrie <colin@mageia.org>
Mon, 28 Mar 2011 08:52:55 +0000 (09:52 +0100)
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
src/pulsecore/core-util.c
src/pulsecore/core-util.h

index 286931f4526210d13e455e5b6677ea54837940dc..3b13879d0b38fe49a93832573172724aa00aaa11 100644 (file)
@@ -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;
     }
index 482319858851b677da71e6e0a1c3417491b90365..f769b3252567e6a300d2079b694f2c14dac3752b 100644 (file)
@@ -2012,20 +2012,13 @@ char *pa_state_path(const char *fn, pa_bool_t appendmid) {
 
 /* Convert the string s to a signed integer in *ret_i */
 int pa_atoi(const char *s, int32_t *ret_i) {
-    char *x = NULL;
     long l;
 
     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 +2057,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;
 
index 32641a3fb0645ac6d3410077ac95a1f2548899eb..0b34a183ae450b0e6e416534ff656aa9b84119df 100644 (file)
@@ -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, ...);