linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] mm/swapfile: validate swap offset in unuse_pte_range()
@ 2025-12-01  9:37 Deepanshu Kartikey
  2025-12-01 10:27 ` YoungJun Park
  2025-12-01 10:40 ` Kairui Song
  0 siblings, 2 replies; 5+ messages in thread
From: Deepanshu Kartikey @ 2025-12-01  9:37 UTC (permalink / raw)
  To: akpm, chrisl, kasong, shikemeng, nphamcs, bhe, baohua
  Cc: linux-mm, linux-kernel, Deepanshu Kartikey, syzbot+d7bc9ec4a100437aa7a2

syzbot reported a WARNING in __swap_offset_to_cluster() triggered by
an invalid swap offset during swapoff:

  WARNING: CPU: 0 PID: 9861 at mm/swap.h:87 swap_cache_get_folio+0x186/0x200

The issue occurs because unuse_pte_range() extracts a swap entry from
a PTE and uses the offset without validating it is within bounds of
the swap area.

While the existing swp_type() check filters entries for other swap
areas, it cannot catch cases where the type bits are valid but the
offset is corrupted or stale - for example, due to a race condition
during PTE updates or memory corruption.

Add validation to ensure offset < si->max before using the swap entry.

Reported-by: syzbot+d7bc9ec4a100437aa7a2@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=d7bc9ec4a100437aa7a2
Signed-off-by: Deepanshu Kartikey <kartikey406@gmail.com>
---
 mm/swapfile.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/mm/swapfile.c b/mm/swapfile.c
index 46d2008e4b99..fdf358df7116 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -2277,6 +2277,8 @@ static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
 			continue;
 
 		offset = swp_offset(entry);
+		if (offset >= si->max)
+			continue;
 		pte_unmap(pte);
 		pte = NULL;
 
-- 
2.43.0



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-12-03  2:54 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-01  9:37 [PATCH] mm/swapfile: validate swap offset in unuse_pte_range() Deepanshu Kartikey
2025-12-01 10:27 ` YoungJun Park
2025-12-01 10:40 ` Kairui Song
2025-12-01 10:48   ` Deepanshu Kartikey
2025-12-03  2:53     ` Kairui Song

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox