Linux-mm Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Rapoport <rppt@kernel.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: syzbot <syzbot@kernel.org>,
	syzkaller-bugs@googlegroups.com,
	Krystian Kaniewski <krystianmkaniewski@gmail.com>,
	linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
	Matthew Wilcox <willy@infradead.org>,
	linux-kernel@vger.kernel.org, syzbot@lists.linux.dev
Subject: Re: [PATCH] xarray: fix index jumping backwards in xas_find()
Date: Fri, 4 Sep 2026 11:21:55 +0300	[thread overview]
Message-ID: <app_o87YogZExbwm@kernel.org> (raw)
In-Reply-To: <20260903112251.6114f91af953412d2355e5b3@linux-foundation.org>

On Thu, Sep 03, 2026 at 11:22:51AM -0700, Andrew Morton wrote:
> On Thu,  3 Sep 2026 13:48:55 +0000 (UTC) "syzbot" <syzbot@kernel.org> wrote:
> 
> > From: Krystian Kaniewski <krystianmkaniewski@gmail.com>
> > 
> > A bug in the XArray iterator xas_find() causes the iterator's index
> > (xas->xa_index) to jump backwards when iterating over a multi-index entry
> > (like a THP) that resides in a non-leaf node and is concurrently split.
> > 
> > When iterating over a multi-index entry in a non-leaf node, xas_load() sets
> > xas->xa_offset to the base offset of the entry, but leaves xas->xa_index at
> > the requested index. When the caller subsequently wants to advance to the
> > next entry, xas_find() is called. xas_find() attempts to synchronize
> > xas->xa_offset with xas->xa_index before advancing. However, the fixup
> > logic was incorrectly restricted to leaf nodes (!xas->xa_node->shift).
> > Because the THP resides in a non-leaf node, the fixup is skipped.
> > 
> > As a result, xas_find() simply increments xas->xa_offset and recalculates
> > xas->xa_index based on this new offset. This causes xas->xa_index to jump
> > backwards. If the THP was concurrently split, the entry at the new offset
> > is a node pointer, so xas_find() descends into it and returns the folio at
> > the backwards index. The caller (filemap_map_pages()) then calculates the
> > PTE pointer based on this backwards index, resulting in an invalid memory
> > access such as an out-of-bounds read or use-after-free on a page-table page
> > freed via tlb_remove_table_rcu().
> > 
> > To fix this, check if xas->xa_offset matches get_offset(xas->xa_index,
> > xas->xa_node). If it does not and the node is a non-leaf node, set
> > xas->xa_offset to get_offset(xas->xa_index, xas->xa_node) before advancing.
> > Also add test cases in test_xarray to verify xas_find() behavior when
> > iterating over and splitting multi-index entries.
> 
> Thanks.  But the changelog omits vital information: a description of
> the userspace-visible runtime effects of the bug.
> 
> > Fixes: b803b42823d0 ("xarray: Add XArray iterators")
> > Assisted-by: Gemini:gemini-3.7-flash syzbot
> > Reported-by: syzbot+b72767277f29b6407083@syzkaller.appspotmail.com
> > Closes: https://syzkaller.appspot.com/bug?extid=b72767277f29b6407083
> 
> I see from there that it was a use-after-free, detected by KASAN.  I'll
> update the changelog and I'll add cc:stable.
> 
> I'll queue the patch for testing while awaiting review input.

The testing shows there are issues with this patch:

https://github.com/linux-mm/linux-mm/actions/runs/33815757662/job/100847425973

And since it's in mm-unstable now it breaks all CI jobs :(

> > Link: https://syzkaller.appspot.com/ai_job?id=a01c56bd-74d0-411c-afb4-ee6f0cb6cb61
> 
> 

-- 
Sincerely yours,
Mike.


  reply	other threads:[~2026-09-04  8:22 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-03 13:48 [PATCH] xarray: fix index jumping backwards in xas_find() syzbot
2026-09-03 18:22 ` Andrew Morton
2026-09-04  8:21   ` Mike Rapoport [this message]
2026-09-04  8:41     ` Krystian Kaniewski
2026-09-04 12:16       ` Krystian Kaniewski
2026-09-04 12:12     ` [PATCH v2] " Krystian Kaniewski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=app_o87YogZExbwm@kernel.org \
    --to=rppt@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=krystianmkaniewski@gmail.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=syzbot@kernel.org \
    --cc=syzbot@lists.linux.dev \
    --cc=syzkaller-bugs@googlegroups.com \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox