Skip to content

Commit

Permalink
[PATCH] do_swap_page() can map random data if swap read fails
Browse files Browse the repository at this point in the history
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 <dev@sw.ru>
Signed-Off-By: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Acked-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Kirill Korotaev authored and Linus Torvalds committed May 17, 2005
1 parent c64610b commit b810748
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions mm/memory.c
Original file line number Diff line number Diff line change
Expand Up @@ -1701,12 +1701,13 @@ static int do_swap_page(struct mm_struct * mm,
spin_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. */
Expand Down Expand Up @@ -1741,6 +1742,12 @@ static int do_swap_page(struct mm_struct * mm,
spin_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;
}

/*
Expand Down

0 comments on commit b810748

Please sign in to comment.