do_swap_page() can map random data if swap read fails
Subsystems (2)
PATCH 1/1 do_swap_page() can map random data if swap read fails
against 2.6.12-rc4
There is a bug in do_swap_page(): when swap page happens to be unreadable, page filled with random data is mapped into user address space.
The fix is to check for PageUptodate and send SIGBUS in case of error.
Signed-off-by Kirill Korotaev <[email protected]>
Signed-off-by Alexey Kuznetsov <[email protected]>
mm/memory.c renamed from mm/memory.c.swaperr +12 -5
@@ -1701,12 +1701,13 @@ static int do_swap_page(struct mm_structspin_lock (&mm->page_table_lock); page_table =pte_offset_map (pmd, address);if (unlikely (!pte_same (*page_table, orig_pte))) { -pte_unmap (page_table); -spin_unlock (&mm->page_table_lock); -unlock_page (page); -page_cache_release (page); ret =VM_FAULT_MINOR ; - goto out; + goto out_nomap; + } + +if (unlikely (!PageUptodate (page))) { + ret =VM_FAULT_SIGBUS ; + goto out_nomap; }/* The page isn't present yet, go ahead with the fault. */
@@ -1741,6 +1742,12 @@ static int do_swap_page(struct mm_structspin_unlock (&mm->page_table_lock); out:return ret; +out_nomap: +pte_unmap (page_table); +spin_unlock (&mm->page_table_lock); +unlock_page (page); +page_cache_release (page); + goto out; }/*
Quoted 9 lines · Kirill Korotaev
against 2.6.12-rc4
There is a bug in
do_swap_page(): when swap page happens to be unreadable, page filled with random data is mapped into user
address space.
The fix is to check for PageUptodate and send SIGBUS in case of error.Signed-off-by Kirill Korotaev <[email protected]>Signed-off-by Alexey Kuznetsov <[email protected]>
Ah, yes, that surprised me years ago, but I forgot all about it.
Acked-by Hugh Dickins <[email protected]>