lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <4D959683.7040503@silka.with-linux.com>
Date:	Fri, 01 Apr 2011 03:10:27 -0600
From:	Kelly Anderson <kelly@...ka.with-linux.com>
To:	Clemens Ladisch <clemens@...isch.de>
CC:	"Christopher K." <c.krooss@...glemail.com>,
	Nix <nix@...eri.org.uk>, linux-kernel@...r.kernel.org,
	alsa-devel@...a-project.org
Subject: Re: Linux 2.6.38 freeze because of sound/core/pcm_lib.c commit 59ff878ffb26bc0be812ca8295799164f413ae88

On 04/01/11 01:47, Clemens Ladisch wrote:
>
> Kelly, to apply this patch I need a Signed-off-by tag from you (see
> Documentation/SubmittingPatches).
It works fine Clemens.


--8<---------------------------------------------------------------->8--

ALSA: pcm: fix infinite loop in snd_pcm_update_hw_ptr0()

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 reaching 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@...eri.org.uk>
Reported-by: "Christopher K." <c.krooss@...glemail.com>
Reported-by: Kelly Anderson <kelly@...ka.with-linux.com>
[cl: remove unneeded casts; use a temp variable]
Signed-off-by: Clemens Ladisch <clemens@...isch.de>
Signed-off-by: Kelly Anderson <kelly@...ka.with-linux.com>

--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -375,6 +375,7 @@ static int snd_pcm_update_hw_ptr0(struct 
snd_pcm_substream *substream,
      }

      if (runtime->no_period_wakeup) {
+        snd_pcm_sframes_t xrun_threshold;
          /*
           * Without regular period interrupts, we have to check
           * the elapsed time to detect xruns.
@@ -383,7 +384,8 @@ static int snd_pcm_update_hw_ptr0(struct 
snd_pcm_substream *substream,
          if (jdelta < runtime->hw_ptr_buffer_jiffies / 2)
              goto no_delta_check;
          hdelta = jdelta - delta * HZ / runtime->rate;
+        xrun_threshold = runtime->hw_ptr_buffer_jiffies / 2 + 1;
-        while (hdelta > runtime->hw_ptr_buffer_jiffies / 2 + 1) {
+        while (hdelta > xrun_threshold) {
              delta += runtime->buffer_size;
              hw_base += runtime->buffer_size;
              if (hw_base >= runtime->boundary)
--

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ