ALSA: pcm: Set config update bits only when really changed
authorTakashi Iwai <tiwai@suse.de>
Tue, 2 Jan 2018 10:00:57 +0000 (11:00 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 2 Jan 2018 17:04:30 +0000 (18:04 +0100)
The PCM config space refine codes touch the parameter rmask and cmask
bits when the given config parameter is changed.  But in most places
it checks only whether the changed value is non-zero or not, and they
don't consider whether a negative error value is returned.  This will
lead to the incorrect update bits set upon the error path.

Fix the codes to check properly the return code whether it's really
updated or an error.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/oss/pcm_oss.c
sound/core/pcm_lib.c

index e49f448ee04f4af00a7c7c00755f8a29b226bb6f..5d131088ac7cb6b2b8c36942e169c4b4bfcda239 100644 (file)
@@ -186,7 +186,7 @@ static int _snd_pcm_hw_param_mask(struct snd_pcm_hw_params *params,
 {
        int changed;
        changed = snd_mask_refine(hw_param_mask(params, var), val);
-       if (changed) {
+       if (changed > 0) {
                params->cmask |= 1 << var;
                params->rmask |= 1 << var;
        }
@@ -233,7 +233,7 @@ static int _snd_pcm_hw_param_min(struct snd_pcm_hw_params *params,
                                                  val, open);
        else
                return -EINVAL;
-       if (changed) {
+       if (changed > 0) {
                params->cmask |= 1 << var;
                params->rmask |= 1 << var;
        }
@@ -294,7 +294,7 @@ static int _snd_pcm_hw_param_max(struct snd_pcm_hw_params *params,
                                                  val, open);
        else
                return -EINVAL;
-       if (changed) {
+       if (changed > 0) {
                params->cmask |= 1 << var;
                params->rmask |= 1 << var;
        }
@@ -500,7 +500,7 @@ static int _snd_pcm_hw_param_set(struct snd_pcm_hw_params *params,
                }
        } else
                return -EINVAL;
-       if (changed) {
+       if (changed > 0) {
                params->cmask |= 1 << var;
                params->rmask |= 1 << var;
        }
@@ -540,7 +540,7 @@ static int _snd_pcm_hw_param_setinteger(struct snd_pcm_hw_params *params,
 {
        int changed;
        changed = snd_interval_setinteger(hw_param_interval(params, var));
-       if (changed) {
+       if (changed > 0) {
                params->cmask |= 1 << var;
                params->rmask |= 1 << var;
        }
index 10e7ef7a8804b1ba0d88b6a0c4ad478f38a9397e..bfff8d001466916cb9400183e2c595b4943cd6f3 100644 (file)
@@ -1603,7 +1603,7 @@ static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params,
                changed = snd_interval_refine_first(hw_param_interval(params, var));
        else
                return -EINVAL;
-       if (changed) {
+       if (changed > 0) {
                params->cmask |= 1 << var;
                params->rmask |= 1 << var;
        }
@@ -1649,7 +1649,7 @@ static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params,
                changed = snd_interval_refine_last(hw_param_interval(params, var));
        else
                return -EINVAL;
-       if (changed) {
+       if (changed > 0) {
                params->cmask |= 1 << var;
                params->rmask |= 1 << var;
        }