aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJody Bruchon <jody@nctritech.com>2010-02-06 10:46:26 -0500
committerTakashi Iwai <tiwai@suse.de>2010-02-09 15:33:33 -0500
commitfed08d036f2aabd8d0c684439de37f8ebec2bbc2 (patch)
tree508e27908042763bc2f2c4debbea415e6fe4ff92
parent9492837a6f54b069e13e40e3c89898bb8837a386 (diff)
ALSA: hda-intel: Avoid divide by zero crash
On my AMD780V chipset, hda_intel.c can crash the kernel with a divide by zero for as-yet unknown reasons. A simple check for zero prevents it, though the problem that causes it remains. Since the workaround is harmless and won't affect anyone except victims of this bug, it should be safe; moreover, because this crash can be triggered by a user-mode application, there are denial of service implications on the systems affected by the bug without the patch. Signed-off-by: Jody Bruchon <jody@nctritech.com> Cc: <stable@kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/pci/hda/hda_intel.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index b8faa6dc5abe..e767c3f395ab 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -1893,6 +1893,12 @@ static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
1893 1893
1894 if (!bdl_pos_adj[chip->dev_index]) 1894 if (!bdl_pos_adj[chip->dev_index])
1895 return 1; /* no delayed ack */ 1895 return 1; /* no delayed ack */
1896 if (azx_dev->period_bytes == 0) {
1897 printk(KERN_WARNING
1898 "hda-intel: Divide by zero was avoided "
1899 "in azx_dev->period_bytes.\n");
1900 return 0;
1901 }
1896 if (pos % azx_dev->period_bytes > azx_dev->period_bytes / 2) 1902 if (pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
1897 return 0; /* NG - it's below the period boundary */ 1903 return 0; /* NG - it's below the period boundary */
1898 return 1; /* OK, it's fine */ 1904 return 1; /* OK, it's fine */