Skip to contentSkip to conversation

do_swap_page() can map random data if swap read fails

PATCH In review Kirill Korotaev 2 participants 2 messages May 11, 2005

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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.

mm/memory.c renamed from mm/memory.c.swaperr +12 -5
@@ -1701,12 +1701,13 @@ static int do_swap_page(struct mm_struct
 	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. */
@@ -1741,6 +1742,12 @@ static int do_swap_page(struct mm_struct
 	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;
 }
 
 /*
Acked-by on v1 1/1
#1 lore raw
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.

Ah, yes, that surprised me years ago, but I forgot all about it.