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