[alsa-devel] [PATCH] ALSA: pcm: Fix possible inconsistent appl_ptr update via mmap
Clemens Ladisch
clemens at ladisch.de
Sun Jun 18 20:03:34 CEST 2017
Takashi Iwai wrote:
> The ALSA PCM core refers to the appl_ptr value stored on the mmapped
> page that is shared between kernel and user-space. Although the
> reference is performed in the PCM stream lock, it doesn't guarantee
> the atomic access when the value gets updated concurrently from the
> user-space on another CPU.
>
> In most of codes, this is no big problem, but still there are a few
> places that may result in slight inconsistencies because they access
> runtime->control->appl_ptr multiple times; that is, the second read
> might be a different value from the first value. It can be even
> backward or jumping, as we have no control for it. Hence, the
> calculation may give an unexpected value. Luckily, there is no
> security vulnerability by that, as far as I've checked. But still we
> should address it.
>
> This patch tries to reduce such possible cases. The fix is simple --
> we just read once, store it to a local variable and use it for the
> rest calculations.
It is likely that the compiler's optimizer already merged multiple
accesses and used a temporary register.
However, if the compiler can do this transformation, it can also do the
reverse transformation. So this new code does not actually guarantee
that there is a single atomic access. That can be enforced only with
READ_ONCE():
> if (runtime->silence_size < runtime->boundary) {
> snd_pcm_sframes_t noise_dist, n;
> - if (runtime->silence_start != runtime->control->appl_ptr) {
> - n = runtime->control->appl_ptr - runtime->silence_start;
> + snd_pcm_uframes_t appl_ptr = runtime->control->appl_ptr;
snd_pcm_uframes_t appl_ptr = READ_ONCE(runtime->control->appl_ptr);
etc.
Regards,
Clemens
More information about the Alsa-devel
mailing list