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().
This commit is contained in:
Tanu Kaskinen 2011-03-27 21:35:03 +03:00 committed by Colin Guthrie
parent 60f191941b
commit 77da2c4bcf
3 changed files with 26 additions and 10 deletions

View file

@ -1920,14 +1920,14 @@ static int element_parse_volume_limit(
pa_alsa_path *p = userdata; pa_alsa_path *p = userdata;
pa_alsa_element *e; pa_alsa_element *e;
uint32_t volume_limit; long volume_limit;
if (!(e = element_get(p, section, TRUE))) { if (!(e = element_get(p, section, TRUE))) {
pa_log("[%s:%u] volume-limit makes no sense in '%s'", filename, line, section); pa_log("[%s:%u] volume-limit makes no sense in '%s'", filename, line, section);
return -1; 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); pa_log("[%s:%u] Invalid value for volume-limit", filename, line);
return -1; return -1;
} }

View 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 */ /* Convert the string s to a signed integer in *ret_i */
int pa_atoi(const char *s, int32_t *ret_i) { int pa_atoi(const char *s, int32_t *ret_i) {
char *x = NULL;
long l; long l;
pa_assert(s); pa_assert(s);
pa_assert(ret_i); pa_assert(ret_i);
errno = 0; if (pa_atol(s, &l) < 0)
l = strtol(s, &x, 0);
if (!x || *x || errno) {
if (!errno)
errno = EINVAL;
return -1; return -1;
}
if ((int32_t) l != l) { if ((int32_t) l != l) {
errno = ERANGE; errno = ERANGE;
@ -2064,6 +2057,28 @@ int pa_atou(const char *s, uint32_t *ret_u) {
return 0; 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 #ifdef HAVE_STRTOF_L
static locale_t c_locale = NULL; static locale_t c_locale = NULL;

View 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_atoi(const char *s, int32_t *ret_i);
int pa_atou(const char *s, uint32_t *ret_u); 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); int pa_atod(const char *s, double *ret_d);
size_t pa_snprintf(char *str, size_t size, const char *format, ...); size_t pa_snprintf(char *str, size_t size, const char *format, ...);