Fix memory leak of init_vdso_vars(). Signed-off-by: Zhitong Wang Reviewed-by: Coly Li --- arch/x86/vdso/vma.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/arch/x86/vdso/vma.c b/arch/x86/vdso/vma.c index 4b5d26f..8d9d652 100644 --- a/arch/x86/vdso/vma.c +++ b/arch/x86/vdso/vma.c @@ -44,19 +44,19 @@ static int __init init_vdso_vars(void) vdso_size = npages << PAGE_SHIFT; vdso_pages = kmalloc(sizeof(struct page *) * npages, GFP_KERNEL); if (!vdso_pages) - goto oom; + goto oom1; for (i = 0; i < npages; i++) { struct page *p; p = alloc_page(GFP_KERNEL); if (!p) - goto oom; + goto oom2; vdso_pages[i] = p; copy_page(page_address(p), vdso_start + i*PAGE_SIZE); } vbase = vmap(vdso_pages, npages, 0, PAGE_KERNEL); if (!vbase) - goto oom; + goto oom2; if (memcmp(vbase, "\177ELF", 4)) { printk("VDSO: I'm broken; not ELF\n"); @@ -70,7 +70,13 @@ static int __init init_vdso_vars(void) vunmap(vbase); return 0; - oom: +oom2: + i--; + for (; i >= 0; i--) + __free_page(vdso_pages[i]); +oom1: + __free_page(vdso_pages); + printk("Cannot allocate vdso\n"); vdso_enabled = 0; return -ENOMEM; -- 1.7.1