From f5c0840eef217ff29d5d9fe991359b8778079e07 Mon Sep 17 00:00:00 2001 From: Matthieu Baerts Date: Mon, 4 Nov 2024 17:37:20 +0100 Subject: [PATCH] DO-NOT-MERGE: mptcp: improve code coverage for CI tcp: warn if tcp_done() is called on a closed socket This is an extra check mainly for the CIs: to make sure we don't call tcp_done() on an already closed socket as it happened in the past. If we do such call, better to catch the error earlier. mptcp: warn in case of bogus mpc option on established client sk As discussed on [1], an additional check is done to catch local software bug. This patch is supposed to land only in our tree, for both 'export' and 'export-net' branches, because the warning could be triggered by bugged / malicious peer. We want it in our tree for our CI to detect internal bugs. Link: https://lore.kernel.org/all/20240215-mptcp-fix-bogus-pr-warn-v1-1-d14c10312820@kernel.org/ [1] Signed-off-by: Matthieu Baerts --- net/ipv4/tcp.c | 2 ++ net/mptcp/Kconfig | 9 +++++++++ net/mptcp/Makefile | 5 +++++ net/mptcp/options.c | 3 ++- 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 0d704bda6c416b..44f6fce2c5951e 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -4855,6 +4855,8 @@ void tcp_done(struct sock *sk) */ req = rcu_dereference_protected(tcp_sk(sk)->fastopen_rsk, 1); + WARN_ON_ONCE(sk->sk_state == TCP_CLOSE); + if (sk->sk_state == TCP_SYN_SENT || sk->sk_state == TCP_SYN_RECV) TCP_INC_STATS(sock_net(sk), TCP_MIB_ATTEMPTFAILS); diff --git a/net/mptcp/Kconfig b/net/mptcp/Kconfig index 20328920f6ed17..b755fc9b6660e7 100644 --- a/net/mptcp/Kconfig +++ b/net/mptcp/Kconfig @@ -36,4 +36,13 @@ config MPTCP_KUNIT_TEST If unsure, say N. +config GCOV_PROFILE_MPTCP + bool "Enable GCOV profiling on MPTCP" + depends on GCOV_KERNEL + help + Enable GCOV profiling on MPTCP for checking which functions/lines + are executed. + + If unsure, say N. + endif diff --git a/net/mptcp/Makefile b/net/mptcp/Makefile index bcf1dbf3a432f7..5dbc37d38d7a4b 100644 --- a/net/mptcp/Makefile +++ b/net/mptcp/Makefile @@ -13,3 +13,8 @@ mptcp_token_test-objs := token_test.o obj-$(CONFIG_MPTCP_KUNIT_TEST) += mptcp_crypto_test.o mptcp_token_test.o obj-$(CONFIG_BPF_SYSCALL) += bpf.o + +# for GCOV coverage profiling +ifdef CONFIG_GCOV_PROFILE_MPTCP +GCOV_PROFILE := y +endif diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 1603b3702e2207..ad22622843a28d 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -983,7 +983,8 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk, WRITE_ONCE(msk->pm.remote_deny_join_id0, true); if (unlikely(!READ_ONCE(msk->pm.server_side))) - pr_warn_once("bogus mpc option on established client sk"); + /* DO-NOT-MERGE: use WARN i/o pr_warn: only for MPTCP export */ + WARN_ONCE(1, "bogus mpc option on established client sk"); set_fully_established: mptcp_data_lock((struct sock *)msk);