All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH mptcp-net] mptcp: fix uninit-value in mptcp_established_options
@ 2026-05-29  9:13 Paolo Abeni
  2026-05-29 10:52 ` MPTCP CI
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Paolo Abeni @ 2026-05-29  9:13 UTC (permalink / raw)
  To: mptcp

syzbot reported the following uninit splat:

=====================================================
BUG: KMSAN: uninit-value in mptcp_write_data_fin net/mptcp/options.c:542 [inline]
BUG: KMSAN: uninit-value in mptcp_established_options_dss net/mptcp/options.c:590 [inline]
BUG: KMSAN: uninit-value in mptcp_established_options+0x112f/0x3530 net/mptcp/options.c:874
 mptcp_write_data_fin net/mptcp/options.c:542 [inline]
 mptcp_established_options_dss net/mptcp/options.c:590 [inline]
 mptcp_established_options+0x112f/0x3530 net/mptcp/options.c:874
 tcp_established_options+0x312/0xcc0 net/ipv4/tcp_output.c:1192
 __tcp_transmit_skb+0x5dc/0x5fe0 net/ipv4/tcp_output.c:1575
 __tcp_send_ack+0x967/0xad0 net/ipv4/tcp_output.c:4499
 tcp_send_ack+0x3d/0x60 net/ipv4/tcp_output.c:4505
 mptcp_subflow_shutdown+0x164/0x690 net/mptcp/protocol.c:3137
 mptcp_check_send_data_fin+0x31b/0x3d0 net/mptcp/protocol.c:3218
 __mptcp_wr_shutdown net/mptcp/protocol.c:3234 [inline]
 __mptcp_close+0x860/0x1360 net/mptcp/protocol.c:3313
 mptcp_close+0x42/0x260 net/mptcp/protocol.c:3367
 inet_release+0x1ee/0x2a0 net/ipv4/af_inet.c:442
 __sock_release net/socket.c:722 [inline]
 sock_close+0xd6/0x2f0 net/socket.c:1514
 __fput+0x60e/0x1010 fs/file_table.c:510
 ____fput+0x25/0x30 fs/file_table.c:538
 task_work_run+0x208/0x2b0 kernel/task_work.c:233
 resume_user_mode_work include/linux/resume_user_mode.h:50 [inline]
 __exit_to_user_mode_loop kernel/entry/common.c:67 [inline]
 exit_to_user_mode_loop+0x306/0x1b60 kernel/entry/common.c:98
 __exit_to_user_mode_prepare include/linux/irq-entry-common.h:207 [inline]
 syscall_exit_to_user_mode_prepare include/linux/irq-entry-common.h:238 [inline]
 syscall_exit_to_user_mode include/linux/entry-common.h:318 [inline]
 __do_fast_syscall_32+0x2c7/0x460 arch/x86/entry/syscall_32.c:310
 do_fast_syscall_32+0x37/0x80 arch/x86/entry/syscall_32.c:332
 do_SYSENTER_32+0x1f/0x30 arch/x86/entry/syscall_32.c:370
 entry_SYSENTER_compat_after_hwframe+0x84/0x8e

Local variable opts created at:
 __tcp_transmit_skb+0x4d/0x5fe0 net/ipv4/tcp_output.c:1536
 __tcp_send_ack+0x967/0xad0 net/ipv4/tcp_output.c:4499
=====================================================

The output path currently omit initializing the mptcp extension `use_map`
flag in a few corner cases.
Address the issue always zeroing all the extensions flags before
eventually initializing the individual bits. To that extent, introduce
and use a struct_group to avoid multiple bitwise operations.

Reported-by: syzbot+ff020673c5e3d94d9478@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=ff020673c5e3d94d9478
Fixes: 6d0060f600ad ("mptcp: Write MPTCP DSS headers to outgoing data packets")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
Note that this patch intentionally omit removing the now unneeded
		opts->ext_copy.ack64 = 0;
assignment later on in mptcp_established_options_dss(), to avoid
conflict with pending next patches.
---
 include/net/mptcp.h | 7 +++++--
 net/mptcp/options.c | 6 +++++-
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index aef2dbeb847b..8e666347b56d 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -23,7 +23,9 @@ struct mptcp_ext {
 	u32		subflow_seq;
 	u16		data_len;
 	__sum16		csum;
-	u8		use_map:1,
+
+	struct_group(flags,
+		u8	use_map:1,
 			dsn64:1,
 			data_fin:1,
 			use_ack:1,
@@ -31,9 +33,10 @@ struct mptcp_ext {
 			mpc_map:1,
 			frozen:1,
 			reset_transient:1;
-	u8		reset_reason:4,
+		u8	reset_reason:4,
 			csum_reqd:1,
 			infinite_map:1;
+	); /* end of flags group */
 };
 
 #define MPTCPOPT_HMAC_LEN	20
diff --git a/net/mptcp/options.c b/net/mptcp/options.c
index 2b35bdc113a5..7301225bac98 100644
--- a/net/mptcp/options.c
+++ b/net/mptcp/options.c
@@ -572,6 +572,11 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
 	unsigned int ack_size;
 	bool ret = false;
 
+	/* Zero `use_ack` and `use_map` flags with one shot. */
+	BUILD_BUG_ON(sizeof_field(struct mptcp_ext, flags) != sizeof(u16));
+	BUILD_BUG_ON(!IS_ALIGNED(offsetof(struct mptcp_ext, flags),
+				 sizeof(u16)));
+	*(u16 *)&opts->ext_copy.flags = 0;
 	opts->csum_reqd = READ_ONCE(msk->csum_enabled);
 	mpext = skb ? mptcp_get_ext(skb) : NULL;
 
@@ -595,7 +600,6 @@ static bool mptcp_established_options_dss(struct sock *sk, struct sk_buff *skb,
 	/* passive sockets msk will set the 'can_ack' after accept(), even
 	 * if the first subflow may have the already the remote key handy
 	 */
-	opts->ext_copy.use_ack = 0;
 	if (!READ_ONCE(msk->can_ack)) {
 		*size = ALIGN(dss_size, 4);
 		return ret;
-- 
2.54.0


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

* Re: [PATCH mptcp-net] mptcp: fix uninit-value in mptcp_established_options
  2026-05-29  9:13 [PATCH mptcp-net] mptcp: fix uninit-value in mptcp_established_options Paolo Abeni
@ 2026-05-29 10:52 ` MPTCP CI
  2026-05-31  7:01 ` Matthieu Baerts
  2026-06-01  2:42 ` Matthieu Baerts
  2 siblings, 0 replies; 5+ messages in thread
From: MPTCP CI @ 2026-05-29 10:52 UTC (permalink / raw)
  To: Paolo Abeni; +Cc: mptcp

Hi Paolo,

Thank you for your modifications, that's great!

Our CI did some validations and here is its report:

- KVM Validation: normal (except selftest_mptcp_join): Unstable: 1 failed test(s): selftest_simult_flows ⚠️ 
- KVM Validation: normal (only selftest_mptcp_join): Success! ✅
- KVM Validation: debug (except selftest_mptcp_join): Unstable: 1 failed test(s): selftest_mptcp_connect ⚠️ 
- KVM Validation: debug (only selftest_mptcp_join): Success! ✅
- KVM Validation: btf-normal (only bpftest_all): Success! ✅
- KVM Validation: btf-debug (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/26630171516

Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/e2df8b37ca5b
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=1102751


If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:

    $ cd [kernel source code]
    $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
        --pull always mptcp/mptcp-upstream-virtme-docker:latest \
        auto-normal

For more details:

    https://github.com/multipath-tcp/mptcp-upstream-virtme-docker


Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)

Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)

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

* Re: [PATCH mptcp-net] mptcp: fix uninit-value in mptcp_established_options
  2026-05-29  9:13 [PATCH mptcp-net] mptcp: fix uninit-value in mptcp_established_options Paolo Abeni
  2026-05-29 10:52 ` MPTCP CI
@ 2026-05-31  7:01 ` Matthieu Baerts
  2026-06-01  2:42 ` Matthieu Baerts
  2 siblings, 0 replies; 5+ messages in thread
From: Matthieu Baerts @ 2026-05-31  7:01 UTC (permalink / raw)
  To: Paolo Abeni, mptcp

Hi Paolo,

On 29/05/2026 19:13, Paolo Abeni wrote:
> syzbot reported the following uninit splat:

(...)

> The output path currently omit initializing the mptcp extension `use_map`
> flag in a few corner cases.
> Address the issue always zeroing all the extensions flags before
> eventually initializing the individual bits. To that extent, introduce
> and use a struct_group to avoid multiple bitwise operations.

Thank you for the fix!

Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>

Now in our tree:

New patches for t/upstream-net and t/upstream:
- e1e4ec894331: mptcp: fix uninit-value in mptcp_established_options
- Results: b744d5cbf545..8baa4a3c8611 (export-net)
- Results: 294e9da8a098..cfc728a98c10 (export)

Tests are now in progress:

- export-net:
https://github.com/multipath-tcp/mptcp_net-next/commit/857a3caa698c8e16b1dbc6d61976bbf17a8d864c/checks
- export:
https://github.com/multipath-tcp/mptcp_net-next/commit/05677a4add692ad12b601c1e0b9e5f9299c2a1f1/checks

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.


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

* Re: [PATCH mptcp-net] mptcp: fix uninit-value in mptcp_established_options
  2026-05-29  9:13 [PATCH mptcp-net] mptcp: fix uninit-value in mptcp_established_options Paolo Abeni
  2026-05-29 10:52 ` MPTCP CI
  2026-05-31  7:01 ` Matthieu Baerts
@ 2026-06-01  2:42 ` Matthieu Baerts
  2026-06-01  7:17   ` Paolo Abeni
  2 siblings, 1 reply; 5+ messages in thread
From: Matthieu Baerts @ 2026-06-01  2:42 UTC (permalink / raw)
  To: Paolo Abeni, mptcp

Hi Paolo,

On 29/05/2026 19:13, Paolo Abeni wrote:
> syzbot reported the following uninit splat:
> 
> =====================================================

(...)

> =====================================================
> 
> The output path currently omit initializing the mptcp extension `use_map`
> flag in a few corner cases.
> Address the issue always zeroing all the extensions flags before
> eventually initializing the individual bits. To that extent, introduce
> and use a struct_group to avoid multiple bitwise operations.
> 
> Reported-by: syzbot+ff020673c5e3d94d9478@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=ff020673c5e3d94d9478
> Fixes: 6d0060f600ad ("mptcp: Write MPTCP DSS headers to outgoing data packets")

Small detail: I hope that's OK to use this one instead:

  cfcceb7a39fc ("tcp: shrink per-packet memset in __tcp_transmit_skb()")

Before this commit, the whole "opts" was set to 0. So no need to
backport this "too far".

Also, because of the issue reported by the 0day bot, I will wait a few
more days before sending this patch upstream.

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.


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

* Re: [PATCH mptcp-net] mptcp: fix uninit-value in mptcp_established_options
  2026-06-01  2:42 ` Matthieu Baerts
@ 2026-06-01  7:17   ` Paolo Abeni
  0 siblings, 0 replies; 5+ messages in thread
From: Paolo Abeni @ 2026-06-01  7:17 UTC (permalink / raw)
  To: Matthieu Baerts, mptcp

On 6/1/26 4:42 AM, Matthieu Baerts wrote:
> Hi Paolo,
> 
> On 29/05/2026 19:13, Paolo Abeni wrote:
>> syzbot reported the following uninit splat:
>>
>> =====================================================
> 
> (...)
> 
>> =====================================================
>>
>> The output path currently omit initializing the mptcp extension `use_map`
>> flag in a few corner cases.
>> Address the issue always zeroing all the extensions flags before
>> eventually initializing the individual bits. To that extent, introduce
>> and use a struct_group to avoid multiple bitwise operations.
>>
>> Reported-by: syzbot+ff020673c5e3d94d9478@syzkaller.appspotmail.com
>> Closes: https://syzkaller.appspot.com/bug?extid=ff020673c5e3d94d9478
>> Fixes: 6d0060f600ad ("mptcp: Write MPTCP DSS headers to outgoing data packets")
> 
> Small detail: I hope that's OK to use this one instead:
> 
>   cfcceb7a39fc ("tcp: shrink per-packet memset in __tcp_transmit_skb()")
> 
> Before this commit, the whole "opts" was set to 0. So no need to
> backport this "too far".

Sure, thanks for doing the right archeology!

/P


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

end of thread, other threads:[~2026-06-01  7:17 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-29  9:13 [PATCH mptcp-net] mptcp: fix uninit-value in mptcp_established_options Paolo Abeni
2026-05-29 10:52 ` MPTCP CI
2026-05-31  7:01 ` Matthieu Baerts
2026-06-01  2:42 ` Matthieu Baerts
2026-06-01  7:17   ` Paolo Abeni

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.