From 77da2c4bcf843980fe27d4878a468741bdad3a38 Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Sun, 27 Mar 2011 21:35:03 +0300 Subject: alsa-mixer: Get rid of a compiler warning. 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 | 31 +++++++++++++++++++++++-------- src/pulsecore/core-util.h | 1 + 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c index 286931f4..3b13879d 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 48231985..f769b325 100644 --- a/src/pulsecore/core-util.c +++ b/src/pulsecore/core-util.c @@ -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; diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h index 32641a3f..0b34a183 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, ...); -- cgit