summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Greenslade <sean@seangreenslade.com>2022-06-04 00:24:49 -0700
committerTanu Kaskinen <tanuk@iki.fi>2022-06-20 14:01:26 +0300
commit8299a7f100f3a061fa0700e8b320bb525ad557d8 (patch)
tree8b9705c7d10f14eeaa993af3436a39c95923567d
parent237c5a5c36d49a51b1b7831b091ea250367c9102 (diff)
downloadpulseaudio-8299a7f100f3a061fa0700e8b320bb525ad557d8.tar.gz
pactl: fix parsing of percentages with decimal points
The logic for detecting which type of volume was given incorrectly interpreted any value with a decimal as a VOL_LINEAR. It also could set multiple flags, which would put the flags variable into an indeterminate state. Additionally, the flags stack variable was uninitialized which could also lead to an indeterminate flag state. Percentages are now prioritized over all other types, and only one type flag can be set.
-rw-r--r--src/utils/pactl.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/utils/pactl.c b/src/utils/pactl.c
index 35163f277..2761ebaaf 100644
--- a/src/utils/pactl.c
+++ b/src/utils/pactl.c
@@ -2527,16 +2527,16 @@ static int parse_volume(const char *vol_spec, pa_volume_t *vol, enum volume_flag
vs = pa_xstrdup(vol_spec);
*vol_flags = (pa_startswith(vs, "+") || pa_startswith(vs, "-")) ? VOL_RELATIVE : VOL_ABSOLUTE;
- if (strchr(vs, '.'))
- *vol_flags |= VOL_LINEAR;
if (pa_endswith(vs, "%")) {
*vol_flags |= VOL_PERCENT;
vs[strlen(vs)-1] = 0;
}
- if (pa_endswith(vs, "db") || pa_endswith(vs, "dB")) {
+ else if (pa_endswith(vs, "db") || pa_endswith(vs, "dB")) {
*vol_flags |= VOL_DECIBEL;
vs[strlen(vs)-2] = 0;
}
+ else if (strchr(vs, '.'))
+ *vol_flags |= VOL_LINEAR;
atod_input = vs;
@@ -2597,7 +2597,7 @@ static int parse_volumes(char *args[], unsigned n) {
volume.channels = n;
for (i = 0; i < volume.channels; i++) {
- enum volume_flags flags;
+ enum volume_flags flags = 0;
if (parse_volume(args[i], &volume.values[i], &flags) < 0)
return -1;