diff options
author | Mark Hills <mark@xwax.org> | 2020-07-08 11:18:45 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2020-07-09 12:58:35 +0200 |
commit | 027c70021b905eb23e2f36c64add062ba218b841 (patch) | |
tree | e31ba3386c152bc8515b16d3022eb674d2d0859b /drivers/mtd | |
parent | db091b0e14239f0ebd5709f3f9b5a1d662483adc (diff) |
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>
Diffstat (limited to 'drivers/mtd')
0 files changed, 0 insertions, 0 deletions