ALSA: echoaudio: Race conditions around "opencount"
authorMark Hills <mark@xwax.org>
Wed, 8 Jul 2020 10:18:45 +0000 (11:18 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 9 Jul 2020 10:58:35 +0000 (12:58 +0200)
commit027c70021b905eb23e2f36c64add062ba218b841
treee31ba3386c152bc8515b16d3022eb674d2d0859b
parentdb091b0e14239f0ebd5709f3f9b5a1d662483adc
ALSA: echoaudio: Race conditions around "opencount"

Use of atomics does not make these statements robust:

       atomic_inc(&chip->opencount);
       if (atomic_read(&chip->opencount) > 1 && chip->rate_set)
               chip->can_set_rate=0;

and

       if (atomic_read(&chip->opencount)) {
               if (chip->opencount) {
                       changed = -EAGAIN;
               } else {
                       changed = set_digital_mode(chip, dmode);

It would be necessary to atomically increment or decrement the value
and use the returned result. And yet we still need to prevent other
threads making use of "can_set_rate" while we set it.

However in all but one case the atomic is misleading as they are already
running with "mode_mutex" held.

Decisions are made on mode setting are often intrinsically connected
to "opencount" because some operations are not permitted unless
there is sole ownership.

So instead simplify this, and use "mode_mutex" as a lock for all reference
counting and mode setting.

Signed-off-by: Mark Hills <mark@xwax.org>
Link: https://lore.kernel.org/r/20200708101848.3457-2-mark@xwax.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/echoaudio/echoaudio.c
sound/pci/echoaudio/echoaudio.h