ALSA: emu10k1 - fix possible memory leak in memory allocation routines
authorJaroslav Kysela <perex@perex.cz>
Tue, 17 Jun 2008 14:20:13 +0000 (16:20 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 17 Jun 2008 14:20:13 +0000 (16:20 +0200)
The leak was introduced in "[ALSA] emu10k1 - simplify page allocation
for synth" commit.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
sound/pci/emu10k1/memory.c

index 42943b4fcb7b675d4db0446768ac47221c818975..759e29f894785d407dccc69701c02fe08461192a 100644 (file)
@@ -464,11 +464,17 @@ static int synth_alloc_pages(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk
                /* first try to allocate from <4GB zone */
                struct page *p = alloc_page(GFP_KERNEL | GFP_DMA32 |
                                            __GFP_NOWARN);
-               if (!p || (page_to_pfn(p) & ~(emu->dma_mask >> PAGE_SHIFT)))
+               if (!p || (page_to_pfn(p) & ~(emu->dma_mask >> PAGE_SHIFT))) {
                        /* try to allocate from <16MB zone */
-                       p = alloc_page(GFP_ATOMIC | GFP_DMA |
+                       struct page *p1 =
+                               alloc_page(GFP_ATOMIC | GFP_DMA |
                                       __GFP_NORETRY | /* no OOM-killer */
                                       __GFP_NOWARN);
+                       /* free page outside dma_mask range */
+                       if (p)
+                               free_page((unsigned long)page_address(p));
+                       p = p1;
+               }
                if (!p) {
                        __synth_free_pages(emu, first_page, page - 1);
                        return -ENOMEM;