Wrong page freed on preallocate_pmds() failure exit
authorAl Viro <viro@ZenIV.linux.org.uk>
Wed, 20 Nov 2013 22:16:36 +0000 (22:16 +0000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 20 Nov 2013 22:22:14 +0000 (14:22 -0800)
Note that pmds[i] is simply uninitialized at that point...

Granted, it's very hard to hit (you need split page locks *and*
kmalloc(sizeof(spinlock_t), GFP_KERNEL) failing), but the code is
obviously bogus.

Introduced by commit 09ef4939850a ("x86: add missed
pgtable_pmd_page_ctor/dtor calls for preallocated pmds")

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/x86/mm/pgtable.c

index a7cccb6d7fec680e184a57c197106a7d475467b1..36aa999b26318888bc9bf5b39d8966a4e084701a 100644 (file)
@@ -209,7 +209,7 @@ static int preallocate_pmds(pmd_t *pmds[])
                if (!pmd)
                        failed = true;
                if (pmd && !pgtable_pmd_page_ctor(virt_to_page(pmd))) {
-                       free_page((unsigned long)pmds[i]);
+                       free_page((unsigned long)pmd);
                        pmd = NULL;
                        failed = true;
                }