Commit f74ae15f authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai

ALSA: pcm: return error immediately for parameters handling

When refining mask/interval parameters, helper functions can return error
code. This error is not handled immediately. This seems to return
parameters to userspace applications in its meddle of processing.

However, in general, when receiving error from system calls, the
application might not handle argument buffer. It's reasonable to
judge the above design as superfluity.

This commit handles the error immediately.
Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 6baca010
...@@ -276,14 +276,14 @@ static int constrain_mask_params(struct snd_pcm_substream *substream, ...@@ -276,14 +276,14 @@ static int constrain_mask_params(struct snd_pcm_substream *substream,
old_mask = *m; old_mask = *m;
changed = snd_mask_refine(m, constrs_mask(constrs, k)); changed = snd_mask_refine(m, constrs_mask(constrs, k));
if (changed < 0)
return changed;
trace_hw_mask_param(substream, k, 0, &old_mask, m); trace_hw_mask_param(substream, k, 0, &old_mask, m);
/* Set corresponding flag so that the caller gets it. */ /* Set corresponding flag so that the caller gets it. */
if (changed) if (changed)
params->cmask |= 1 << k; params->cmask |= 1 << k;
if (changed < 0)
return changed;
} }
return 0; return 0;
...@@ -312,14 +312,14 @@ static int constrain_interval_params(struct snd_pcm_substream *substream, ...@@ -312,14 +312,14 @@ static int constrain_interval_params(struct snd_pcm_substream *substream,
old_interval = *i; old_interval = *i;
changed = snd_interval_refine(i, constrs_interval(constrs, k)); changed = snd_interval_refine(i, constrs_interval(constrs, k));
if (changed < 0)
return changed;
trace_hw_interval_param(substream, k, 0, &old_interval, i); trace_hw_interval_param(substream, k, 0, &old_interval, i);
/* Set corresponding flag so that the caller gets it. */ /* Set corresponding flag so that the caller gets it. */
if (changed) if (changed)
params->cmask |= 1 << k; params->cmask |= 1 << k;
if (changed < 0)
return changed;
} }
return 0; return 0;
...@@ -406,6 +406,8 @@ static int constrain_params_by_rules(struct snd_pcm_substream *substream, ...@@ -406,6 +406,8 @@ static int constrain_params_by_rules(struct snd_pcm_substream *substream,
} }
changed = r->func(params, r); changed = r->func(params, r);
if (changed < 0)
return changed;
if (hw_is_mask(r->var)) { if (hw_is_mask(r->var)) {
trace_hw_mask_param(substream, r->var, k + 1, trace_hw_mask_param(substream, r->var, k + 1,
...@@ -428,8 +430,7 @@ static int constrain_params_by_rules(struct snd_pcm_substream *substream, ...@@ -428,8 +430,7 @@ static int constrain_params_by_rules(struct snd_pcm_substream *substream,
vstamps[r->var] = stamp; vstamps[r->var] = stamp;
again = true; again = true;
} }
if (changed < 0)
return changed;
stamp++; stamp++;
} }
...@@ -527,13 +528,16 @@ static int snd_pcm_hw_refine_user(struct snd_pcm_substream *substream, ...@@ -527,13 +528,16 @@ static int snd_pcm_hw_refine_user(struct snd_pcm_substream *substream,
return PTR_ERR(params); return PTR_ERR(params);
err = snd_pcm_hw_refine(substream, params); err = snd_pcm_hw_refine(substream, params);
if (err >= 0) if (err < 0)
goto end;
err = fixup_unreferenced_params(substream, params); err = fixup_unreferenced_params(substream, params);
if (copy_to_user(_params, params, sizeof(*params))) { if (err < 0)
if (!err) goto end;
err = -EFAULT;
}
if (copy_to_user(_params, params, sizeof(*params)))
err = -EFAULT;
end:
kfree(params); kfree(params);
return err; return err;
} }
...@@ -749,11 +753,12 @@ static int snd_pcm_hw_params_user(struct snd_pcm_substream *substream, ...@@ -749,11 +753,12 @@ static int snd_pcm_hw_params_user(struct snd_pcm_substream *substream,
return PTR_ERR(params); return PTR_ERR(params);
err = snd_pcm_hw_params(substream, params); err = snd_pcm_hw_params(substream, params);
if (copy_to_user(_params, params, sizeof(*params))) { if (err < 0)
if (!err) goto end;
err = -EFAULT;
}
if (copy_to_user(_params, params, sizeof(*params)))
err = -EFAULT;
end:
kfree(params); kfree(params);
return err; return err;
} }
...@@ -3699,14 +3704,17 @@ static int snd_pcm_hw_refine_old_user(struct snd_pcm_substream *substream, ...@@ -3699,14 +3704,17 @@ static int snd_pcm_hw_refine_old_user(struct snd_pcm_substream *substream,
} }
snd_pcm_hw_convert_from_old_params(params, oparams); snd_pcm_hw_convert_from_old_params(params, oparams);
err = snd_pcm_hw_refine(substream, params); err = snd_pcm_hw_refine(substream, params);
if (err >= 0) if (err < 0)
goto out_old;
err = fixup_unreferenced_params(substream, params); err = fixup_unreferenced_params(substream, params);
if (err < 0)
goto out_old;
snd_pcm_hw_convert_to_old_params(oparams, params); snd_pcm_hw_convert_to_old_params(oparams, params);
if (copy_to_user(_oparams, oparams, sizeof(*oparams))) { if (copy_to_user(_oparams, oparams, sizeof(*oparams)))
if (!err)
err = -EFAULT; err = -EFAULT;
} out_old:
kfree(oparams); kfree(oparams);
out: out:
kfree(params); kfree(params);
...@@ -3729,14 +3737,16 @@ static int snd_pcm_hw_params_old_user(struct snd_pcm_substream *substream, ...@@ -3729,14 +3737,16 @@ static int snd_pcm_hw_params_old_user(struct snd_pcm_substream *substream,
err = PTR_ERR(oparams); err = PTR_ERR(oparams);
goto out; goto out;
} }
snd_pcm_hw_convert_from_old_params(params, oparams); snd_pcm_hw_convert_from_old_params(params, oparams);
err = snd_pcm_hw_params(substream, params); err = snd_pcm_hw_params(substream, params);
if (err < 0)
goto out_old;
snd_pcm_hw_convert_to_old_params(oparams, params); snd_pcm_hw_convert_to_old_params(oparams, params);
if (copy_to_user(_oparams, oparams, sizeof(*oparams))) { if (copy_to_user(_oparams, oparams, sizeof(*oparams)))
if (!err)
err = -EFAULT; err = -EFAULT;
} out_old:
kfree(oparams); kfree(oparams);
out: out:
kfree(params); kfree(params);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment