]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
ALSA: pcm: fix infinite loop in snd_pcm_update_hw_ptr0()
authorKelly Anderson <kelly@silka.with-linux.com>
Fri, 1 Apr 2011 09:58:25 +0000 (11:58 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 14 Apr 2011 20:02:08 +0000 (13:02 -0700)
commit254e648fde86796dd76175133448d9c0470e57ab
treeaa567284aa35ff4aba2bd61b1710154bf1b39b24
parent4454ec7e0b90ab5b26d9d9dcd7a025a40bfa7c1d
ALSA: pcm: fix infinite loop in snd_pcm_update_hw_ptr0()

commit 12ff414e2e4512f59fe191dc18e856e2939a1c79 upstream.

When period interrupts are disabled, snd_pcm_update_hw_ptr0() compares
the current time against the time estimated for the current hardware
pointer to detect xruns.  The somewhat fuzzy threshold in the while loop
makes it possible that hdelta becomes negative; the comparison being
done with unsigned types then makes the loop go through the entire 263
negative range, and, depending on the value, never reach an unsigned
value that is small enough to stop the loop.  Doing this with interrupts
disabled results in the machine locking up.

To prevent this, ensure that the loop condition uses signed types for
both operands so that the comparison is correctly done.

Many thanks to Kelly Anderson for debugging this.

Reported-by: Nix <nix@esperi.org.uk>
Reported-by: "Christopher K." <c.krooss@googlemail.com>
Reported-and-tested-by: Kelly Anderson <kelly@silka.with-linux.com>
Signed-off-by: Kelly Anderson <kelly@silka.with-linux.com>
[cl: remove unneeded casts; use a temp variable]
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
sound/core/pcm_lib.c