All of lore.kernel.org
 help / color / mirror / Atom feed
From: gang.yan@linux.dev
To: xuanqiang.luo@linux.dev, mptcp@lists.linux.dev
Cc: matttbe@kernel.org, martineau@kernel.org, geliang@kernel.org,
	"Xuanqiang Luo" <luoxuanqiang@kylinos.cn>,
	stable@vger.kernel.org
Subject: Re: [PATCH net v1] mptcp: pm: fix use-after-free in userspace_pm_get_local_id()
Date: Mon, 13 Jul 2026 08:03:02 +0000	[thread overview]
Message-ID: <b3c317fda3d8d3efa349933723e549933ffc0bf2@linux.dev> (raw)
In-Reply-To: <20260713074722.47921-1-xuanqiang.luo@linux.dev>

July 13, 2026 at 3:47 PM, xuanqiang.luo@linux.dev mailto:xuanqiang.luo@linux.dev  wrote:


Hi xuanqiang,

Thanks for the patch.

But AFAIK, geliang has fixed this in [1], and your test verified this issues.

@Matt, it seems that [1](geliang's patch) can be merged.

[1]https://patchwork.kernel.org/project/mptcp/patch/4e50adfde3b80f433e13b86919596be229045edc.1782799876.git.tanggeliang@kylinos.cn/

Thanks
Gang

> 
> From: Xuanqiang Luo <luoxuanqiang@kylinos.cn>
> 
> mptcp_userspace_pm_get_local_id() looks up an address entry with
> pm.lock held, but drops the lock before reading its ID. A concurrent
> subflow destroy command can remove and free the entry in between,
> resulting in a use-after-free while processing an MP_JOIN SYN.
> 
> Read the ID while holding pm.lock, then use the copied value after
> unlocking.
> 
> Fixes: f012d796a6de ("mptcp: check addrs list in userspace_pm_get_local_id")
> Cc: stable@vger.kernel.org
> Signed-off-by: Xuanqiang Luo <luoxuanqiang@kylinos.cn>
> ---
> The race window is narrow. It was reproduced only with a locally
> constructed stress test that repeatedly overlaps an MP_JOIN SYN with a
> MPTCP_PM_CMD_SUBFLOW_DESTROY request.
> 
> However, the KASAN report below confirms that the race is reachable:
> 
> [ 666.319362] ==================================================================
> [ 666.319376] BUG: KASAN: slab-use-after-free in mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
> [ 666.319386] Read of size 1 at addr ffff888124845610 by task swapper/0/0
> ...
> [ 666.319401] Call Trace:
> [ 666.319405] <IRQ>
> [ 666.319408] dump_stack_lvl+0x53/0x70
> [ 666.319412] print_address_description.constprop.0+0x2c/0x3b0
> [ 666.319418] print_report+0xbe/0x2b0
> [ 666.319421] ? mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
> [ 666.319423] kasan_report+0xce/0x100
> [ 666.319426] ? mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
> [ 666.319429] mptcp_userspace_pm_get_local_id+0x1dc/0x1f0
> [ 666.319433] mptcp_pm_get_local_id+0x371/0x440
> ...
> [ 666.319821] Allocated by task 45539:
> [ 666.319844] kasan_save_stack+0x33/0x60
> [ 666.319855] kasan_save_track+0x14/0x30
> [ 666.319858] __kasan_kmalloc+0x8f/0xa0
> [ 666.319863] __kmalloc_noprof+0x1e7/0x520
> [ 666.319867] sock_kmalloc+0xdf/0x130
> [ 666.319885] sock_kmemdup+0x1b/0x40
> [ 666.319888] mptcp_userspace_pm_append_new_local_addr+0x261/0x500
> [ 666.319910] mptcp_pm_nl_announce_doit+0x16a/0x610
> ...
> [ 666.319967] Freed by task 45560:
> [ 666.319988] kasan_save_stack+0x33/0x60
> [ 666.319991] kasan_save_track+0x14/0x30
> [ 666.319994] kasan_save_free_info+0x3b/0x60
> [ 666.319998] __kasan_slab_free+0x43/0x70
> [ 666.320000] kfree+0x166/0x440
> [ 666.320003] sock_kfree_s+0x1d/0x50
> [ 666.320007] mptcp_userspace_pm_delete_local_addr.isra.0+0x157/0x200
> [ 666.320011] mptcp_pm_nl_subflow_destroy_doit+0x51d/0xea0
> 
>  net/mptcp/pm_userspace.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
> index d100867e9202f..27fa8dc757b4f 100644
> --- a/net/mptcp/pm_userspace.c
> +++ b/net/mptcp/pm_userspace.c
> @@ -132,12 +132,15 @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
>  __be16 msk_sport = ((struct inet_sock *)
>  inet_sk((struct sock *)msk))->inet_sport;
>  struct mptcp_pm_addr_entry *entry;
> + int id = -1;
>  
>  spin_lock_bh(&msk->pm.lock);
>  entry = mptcp_userspace_pm_lookup_addr(msk, &skc->addr);
> - spin_unlock_bh(&msk->pm.lock);
>  if (entry)
> - return entry->addr.id;
> + id = entry->addr.id;
> + spin_unlock_bh(&msk->pm.lock);
> + if (id >= 0)
> + return id;
>  
>  if (skc->addr.port == msk_sport)
>  skc->addr.port = 0;
> -- 
> 2.43.0
>

  reply	other threads:[~2026-07-13  8:03 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-13  7:47 [PATCH net v1] mptcp: pm: fix use-after-free in userspace_pm_get_local_id() xuanqiang.luo
2026-07-13  8:03 ` gang.yan [this message]
2026-07-13  8:21   ` luoxuanqiang
2026-07-13  8:59 ` MPTCP CI

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=b3c317fda3d8d3efa349933723e549933ffc0bf2@linux.dev \
    --to=gang.yan@linux.dev \
    --cc=geliang@kernel.org \
    --cc=luoxuanqiang@kylinos.cn \
    --cc=martineau@kernel.org \
    --cc=matttbe@kernel.org \
    --cc=mptcp@lists.linux.dev \
    --cc=stable@vger.kernel.org \
    --cc=xuanqiang.luo@linux.dev \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.