diff options
author | Takashi Iwai <tiwai@suse.de> | 2012-08-03 14:51:21 +0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2012-08-03 14:51:21 +0400 |
commit | fcfb7866af9a5d0280b7e51dd772990c636b7dec (patch) | |
tree | 48f69f0f63ad101d7b1835363786f91156d52c47 /sound/pci/emu10k1 | |
parent | c810f9039f040681ec9d9f2983b748c193037297 (diff) | |
download | linux-fcfb7866af9a5d0280b7e51dd772990c636b7dec.tar.xz |
ALSA: emu10k1: Avoid access to invalid pages when period=1
When period=1, the driver tries to allocate a bit bigger buffer than
requested by the user due to the irq latency tolerance. This may lead
to accesses over the actually allocated pages.
This patch adds a check of the page index and assigns the silent page
when it's over the given buffer size.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/emu10k1')
-rw-r--r-- | sound/pci/emu10k1/memory.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c index 4f502a2bdc3c..0a436626182b 100644 --- a/sound/pci/emu10k1/memory.c +++ b/sound/pci/emu10k1/memory.c @@ -326,7 +326,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst for (page = blk->first_page; page <= blk->last_page; page++, idx++) { unsigned long ofs = idx << PAGE_SHIFT; dma_addr_t addr; - addr = snd_pcm_sgbuf_get_addr(substream, ofs); + if (ofs >= runtime->dma_bytes) + addr = emu->silent_page.addr; + else + addr = snd_pcm_sgbuf_get_addr(substream, ofs); if (! is_valid_page(emu, addr)) { printk(KERN_ERR "emu: failure page = %d\n", idx); mutex_unlock(&hdr->block_mutex); |