* [PATCH mptcp-next v4 1/3] mptcp: token kunit: set protocol
2024-02-15 11:40 [PATCH mptcp-next v4 0/3] mptcp: check the protocol with DEBUG_NET Matthieu Baerts (NGI0)
@ 2024-02-15 11:40 ` Matthieu Baerts (NGI0)
2024-02-15 11:40 ` [PATCH mptcp-next v4 2/3] mptcp: check the protocol in tcp_sk() with DEBUG_NET Matthieu Baerts (NGI0)
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: Matthieu Baerts (NGI0) @ 2024-02-15 11:40 UTC (permalink / raw)
To: mptcp; +Cc: Mat Martineau, Matthieu Baerts (NGI0)
As it would be done when initiating an MPTCP sock.
This is not strictly needed for this test, but it will be when a later
patch will check if the right protocol is being used when calling
mptcp_sk().
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
net/mptcp/token_test.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/net/mptcp/token_test.c b/net/mptcp/token_test.c
index bfff53e668da..4fc39fa2e262 100644
--- a/net/mptcp/token_test.c
+++ b/net/mptcp/token_test.c
@@ -52,14 +52,19 @@ static struct mptcp_subflow_context *build_ctx(struct kunit *test)
static struct mptcp_sock *build_msk(struct kunit *test)
{
struct mptcp_sock *msk;
+ struct sock *sk;
msk = kunit_kzalloc(test, sizeof(struct mptcp_sock), GFP_USER);
KUNIT_EXPECT_NOT_ERR_OR_NULL(test, msk);
refcount_set(&((struct sock *)msk)->sk_refcnt, 1);
sock_net_set((struct sock *)msk, &init_net);
+ sk = (struct sock *)msk;
+
/* be sure the token helpers can dereference sk->sk_prot */
- ((struct sock *)msk)->sk_prot = &tcp_prot;
+ sk->sk_prot = &tcp_prot;
+ sk->sk_protocol = IPPROTO_MPTCP;
+
return msk;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH mptcp-next v4 2/3] mptcp: check the protocol in tcp_sk() with DEBUG_NET
2024-02-15 11:40 [PATCH mptcp-next v4 0/3] mptcp: check the protocol with DEBUG_NET Matthieu Baerts (NGI0)
2024-02-15 11:40 ` [PATCH mptcp-next v4 1/3] mptcp: token kunit: set protocol Matthieu Baerts (NGI0)
@ 2024-02-15 11:40 ` Matthieu Baerts (NGI0)
2024-02-15 11:40 ` [PATCH mptcp-next v4 3/3] mptcp: check the protocol in mptcp_sk() " Matthieu Baerts (NGI0)
2024-02-15 23:01 ` [PATCH mptcp-next v4 0/3] mptcp: check the protocol with DEBUG_NET Mat Martineau
3 siblings, 0 replies; 10+ messages in thread
From: Matthieu Baerts (NGI0) @ 2024-02-15 11:40 UTC (permalink / raw)
To: mptcp; +Cc: Mat Martineau, Matthieu Baerts (NGI0)
Fuzzers and static checkers might not detect when tcp_sk() is used with
a non tcp_sock structure.
This kind of mistake already happened a few times with MPTCP: when
wrongly using TCP-specific helpers with mptcp_sock pointers. On the
other hand, there are many 'tcp_xxx()' helpers that are taking a 'struct
sock' pointer as arguments, and some of them are only looking at fields
from 'struct sock', and nothing from 'struct tcp_sock'. It is then
tempting to use them with a 'struct mptcp_sock'.
So a new simple check is done when CONFIG_DEBUG_NET is enabled to tell
kernel devs when a non-TCP socket is being used as a TCP one. 'tcp_sk()'
macro is then re-defined to add a WARN when an unexpected socket is
being used.
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
Notes:
- v2:
- Move from include/linux/tcp.h to net/mptcp/protocol.h: specific
to TCP (Paolo)
- Use a macro instead of an inlined function (Paolo)
- Adapt the commit message after the recent changes.
- v3:
- add parenthesis around 'ptr' (checkpatch)
- there is still this check from checkpatch but I guess that's fine:
Macro argument reuse 'ptr' - possible side-effects?
- v4:
- avoid reusing 'ptr' to fix checkpatch warning (Mat)
- remove extra parenthesis in WARN_ON, no longer needed
---
net/mptcp/protocol.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 486fff865803..32cf98bd2961 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -348,6 +348,16 @@ static inline void msk_owned_by_me(const struct mptcp_sock *msk)
sock_owned_by_me((const struct sock *)msk);
}
+#ifdef CONFIG_DEBUG_NET
+/* MPTCP-specific: we might (indirectly) call this helper with the wrong sk */
+#undef tcp_sk
+#define tcp_sk(ptr) ({ \
+ typeof(ptr) _ptr = (ptr); \
+ WARN_ON(_ptr->sk_protocol != IPPROTO_TCP); \
+ container_of_const(_ptr, struct tcp_sock, inet_conn.icsk_inet.sk); \
+})
+#endif
+
#define mptcp_sk(ptr) container_of_const(ptr, struct mptcp_sock, sk.icsk_inet.sk)
/* the msk socket don't use the backlog, also account for the bulk
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH mptcp-next v4 3/3] mptcp: check the protocol in mptcp_sk() with DEBUG_NET
2024-02-15 11:40 [PATCH mptcp-next v4 0/3] mptcp: check the protocol with DEBUG_NET Matthieu Baerts (NGI0)
2024-02-15 11:40 ` [PATCH mptcp-next v4 1/3] mptcp: token kunit: set protocol Matthieu Baerts (NGI0)
2024-02-15 11:40 ` [PATCH mptcp-next v4 2/3] mptcp: check the protocol in tcp_sk() with DEBUG_NET Matthieu Baerts (NGI0)
@ 2024-02-15 11:40 ` Matthieu Baerts (NGI0)
2024-02-15 12:34 ` mptcp: check the protocol in mptcp_sk() with DEBUG_NET: Tests Results MPTCP CI
` (3 more replies)
2024-02-15 23:01 ` [PATCH mptcp-next v4 0/3] mptcp: check the protocol with DEBUG_NET Mat Martineau
3 siblings, 4 replies; 10+ messages in thread
From: Matthieu Baerts (NGI0) @ 2024-02-15 11:40 UTC (permalink / raw)
To: mptcp; +Cc: Mat Martineau, Matthieu Baerts (NGI0)
Fuzzers and static checkers might not detect when mptcp_sk() is used
with a non mptcp_sock structure.
This is similar to the parent commit, where it is easy to use mptcp_sk()
with a TCP sock, e.g. with a subflow sk.
So a new simple check is done when CONFIG_DEBUG_NET is enabled to tell
kernel devs when a non-MPTCP socket is being used as an MPTCP one.
'mptcp_sk()' macro is then defined differently: with an extra WARN to
complain when an unexpected socket is being used.
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
---
Notes:
- v2:
- Use a macro instead of an inlined function (Paolo)
- v3:
- add parenthesis around 'ptr' (checkpatch)
- there is still this check from checkpatch but I guess that's fine:
Macro argument reuse 'ptr' - possible side-effects?
- v4:
- avoid reusing 'ptr' to fix checkpatch warning (Mat)
- remove extra parenthesis in WARN_ON, no longer needed
---
net/mptcp/protocol.h | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 32cf98bd2961..459859b107ba 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -356,9 +356,15 @@ static inline void msk_owned_by_me(const struct mptcp_sock *msk)
WARN_ON(_ptr->sk_protocol != IPPROTO_TCP); \
container_of_const(_ptr, struct tcp_sock, inet_conn.icsk_inet.sk); \
})
-#endif
+#define mptcp_sk(ptr) ({ \
+ typeof(ptr) _ptr = (ptr); \
+ WARN_ON(_ptr->sk_protocol != IPPROTO_MPTCP); \
+ container_of_const(_ptr, struct mptcp_sock, sk.icsk_inet.sk); \
+})
+#else /* !CONFIG_DEBUG_NET */
#define mptcp_sk(ptr) container_of_const(ptr, struct mptcp_sock, sk.icsk_inet.sk)
+#endif
/* the msk socket don't use the backlog, also account for the bulk
* free memory
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: mptcp: check the protocol in mptcp_sk() with DEBUG_NET: Tests Results
2024-02-15 11:40 ` [PATCH mptcp-next v4 3/3] mptcp: check the protocol in mptcp_sk() " Matthieu Baerts (NGI0)
@ 2024-02-15 12:34 ` MPTCP CI
2024-02-15 12:50 ` MPTCP CI
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: MPTCP CI @ 2024-02-15 12:34 UTC (permalink / raw)
To: Matthieu Baerts; +Cc: mptcp
Hi Matthieu,
Thank you for your modifications, that's great!
Our CI (GitHub Action) did some validations and here is its report:
- KVM Validation: normal:
- Success! ✅:
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/7915472729
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/96cb1155ed44
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] 10+ messages in thread* Re: mptcp: check the protocol in mptcp_sk() with DEBUG_NET: Tests Results
2024-02-15 11:40 ` [PATCH mptcp-next v4 3/3] mptcp: check the protocol in mptcp_sk() " Matthieu Baerts (NGI0)
2024-02-15 12:34 ` mptcp: check the protocol in mptcp_sk() with DEBUG_NET: Tests Results MPTCP CI
@ 2024-02-15 12:50 ` MPTCP CI
2024-02-16 0:03 ` MPTCP CI
2024-02-16 0:23 ` MPTCP CI
3 siblings, 0 replies; 10+ messages in thread
From: MPTCP CI @ 2024-02-15 12:50 UTC (permalink / raw)
To: Matthieu Baerts; +Cc: mptcp
Hi Matthieu,
Thank you for your modifications, that's great!
Our CI (Cirrus) did some validations with a debug kernel and here is its report:
- KVM Validation: debug (except selftest_mptcp_join):
- Unstable: 1 failed test(s): packetdrill_regressions 🔴:
- Task: https://cirrus-ci.com/task/5212375712792576
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5212375712792576/summary/summary.txt
- KVM Validation: debug (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/6338275619635200
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6338275619635200/summary/summary.txt
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/96cb1155ed44
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-debug
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] 10+ messages in thread* Re: mptcp: check the protocol in mptcp_sk() with DEBUG_NET: Tests Results
2024-02-15 11:40 ` [PATCH mptcp-next v4 3/3] mptcp: check the protocol in mptcp_sk() " Matthieu Baerts (NGI0)
2024-02-15 12:34 ` mptcp: check the protocol in mptcp_sk() with DEBUG_NET: Tests Results MPTCP CI
2024-02-15 12:50 ` MPTCP CI
@ 2024-02-16 0:03 ` MPTCP CI
2024-02-16 0:23 ` MPTCP CI
3 siblings, 0 replies; 10+ messages in thread
From: MPTCP CI @ 2024-02-16 0:03 UTC (permalink / raw)
To: Matthieu Baerts; +Cc: mptcp
Hi Matthieu,
Thank you for your modifications, that's great!
Our CI (GitHub Action) did some validations and here is its report:
- KVM Validation: normal:
- Success! ✅:
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/7923641372
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/e79de30e413b
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] 10+ messages in thread* Re: mptcp: check the protocol in mptcp_sk() with DEBUG_NET: Tests Results
2024-02-15 11:40 ` [PATCH mptcp-next v4 3/3] mptcp: check the protocol in mptcp_sk() " Matthieu Baerts (NGI0)
` (2 preceding siblings ...)
2024-02-16 0:03 ` MPTCP CI
@ 2024-02-16 0:23 ` MPTCP CI
3 siblings, 0 replies; 10+ messages in thread
From: MPTCP CI @ 2024-02-16 0:23 UTC (permalink / raw)
To: Matthieu Baerts; +Cc: mptcp
Hi Matthieu,
Thank you for your modifications, that's great!
Our CI (Cirrus) did some validations with a debug kernel and here is its report:
- KVM Validation: debug (except selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/5269484584304640
- Summary: https://api.cirrus-ci.com/v1/artifact/task/5269484584304640/summary/summary.txt
- KVM Validation: debug (only selftest_mptcp_join):
- Success! ✅:
- Task: https://cirrus-ci.com/task/6395384491147264
- Summary: https://api.cirrus-ci.com/v1/artifact/task/6395384491147264/summary/summary.txt
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/e79de30e413b
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-debug
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] 10+ messages in thread
* Re: [PATCH mptcp-next v4 0/3] mptcp: check the protocol with DEBUG_NET
2024-02-15 11:40 [PATCH mptcp-next v4 0/3] mptcp: check the protocol with DEBUG_NET Matthieu Baerts (NGI0)
` (2 preceding siblings ...)
2024-02-15 11:40 ` [PATCH mptcp-next v4 3/3] mptcp: check the protocol in mptcp_sk() " Matthieu Baerts (NGI0)
@ 2024-02-15 23:01 ` Mat Martineau
2024-02-16 10:51 ` Matthieu Baerts
3 siblings, 1 reply; 10+ messages in thread
From: Mat Martineau @ 2024-02-15 23:01 UTC (permalink / raw)
To: Matthieu Baerts (NGI0); +Cc: mptcp
On Thu, 15 Feb 2024, Matthieu Baerts (NGI0) wrote:
> Recently, Paolo fixed a bug where a TCP-specific helper was used with an
> MPTCP socket [1]. The bug was not detected by fuzzer or static analysis.
>
> Following this, it has been suggested to add a check, only in debug
> mode. This is what this series is doing.
>
> The series has been split to be upstreamed: a preparation patch for
> MPTCP, the modification for TCP, then for MPTCP. It is not clear if it
> would be OK to add that upstream. If not, we can squash these three
> patches in "DO-NOT-MERGE: mptcp: improve code coverage for CI" commit we
> have in our export tree.
>
> Note that the MPTCP Token kUnit test needs to be adapted for this new
> check. This is what is done in patch 1/3.
>
> Link: https://lore.kernel.org/mptcp/35875ef9cb7194563b580e14c71cc8cb065f846c.1706043786.git.pabeni@redhat.com/ [1]
> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
> ---
> Changes in v4:
> - Patch 2 and 3 have been modified, please the changelog on each patch
> - Link to v3: https://lore.kernel.org/r/20240207-mptcp-check-protocol-v3-0-77c69c596f55@kernel.org
Thanks Matthieu, v4 LGTM:
Reviewed-by: Mat Martineau <martineau@kernel.org>
>
> Changes in v3:
> - Patch 2 and 3 have been modified, please the changelog on each patch
> - Link to v2: https://lore.kernel.org/r/20240201-mptcp-check-protocol-v2-0-1e253ef51990@kernel.org
>
> Changes in v2:
> - Patch 2 and 3 have been modified, please the changelog on each patch
> - Link to v1: https://lore.kernel.org/r/20240131-mptcp-check-protocol-v1-0-a06067f0bd08@kernel.org
>
> ---
> Matthieu Baerts (NGI0) (3):
> mptcp: token kunit: set protocol
> mptcp: check the protocol in tcp_sk() with DEBUG_NET
> mptcp: check the protocol in mptcp_sk() with DEBUG_NET
>
> net/mptcp/protocol.h | 16 ++++++++++++++++
> net/mptcp/token_test.c | 7 ++++++-
> 2 files changed, 22 insertions(+), 1 deletion(-)
> ---
> base-commit: 52e05de42e1094a943053af93ea08c51a44091f7
> change-id: 20240131-mptcp-check-protocol-e32e53d04a75
>
> Best regards,
> --
> Matthieu Baerts (NGI0) <matttbe@kernel.org>
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH mptcp-next v4 0/3] mptcp: check the protocol with DEBUG_NET
2024-02-15 23:01 ` [PATCH mptcp-next v4 0/3] mptcp: check the protocol with DEBUG_NET Mat Martineau
@ 2024-02-16 10:51 ` Matthieu Baerts
0 siblings, 0 replies; 10+ messages in thread
From: Matthieu Baerts @ 2024-02-16 10:51 UTC (permalink / raw)
To: Mat Martineau; +Cc: mptcp
Hi Mat,
On 16/02/2024 00:01, Mat Martineau wrote:
> On Thu, 15 Feb 2024, Matthieu Baerts (NGI0) wrote:
>
>> Recently, Paolo fixed a bug where a TCP-specific helper was used with an
>> MPTCP socket [1]. The bug was not detected by fuzzer or static analysis.
>>
>> Following this, it has been suggested to add a check, only in debug
>> mode. This is what this series is doing.
>>
>> The series has been split to be upstreamed: a preparation patch for
>> MPTCP, the modification for TCP, then for MPTCP. It is not clear if it
>> would be OK to add that upstream. If not, we can squash these three
>> patches in "DO-NOT-MERGE: mptcp: improve code coverage for CI" commit we
>> have in our export tree.
>>
>> Note that the MPTCP Token kUnit test needs to be adapted for this new
>> check. This is what is done in patch 1/3.
>>
>> Link:
>> https://lore.kernel.org/mptcp/35875ef9cb7194563b580e14c71cc8cb065f846c.1706043786.git.pabeni@redhat.com/ [1]
>> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
>> ---
>> Changes in v4:
>> - Patch 2 and 3 have been modified, please the changelog on each patch
>> - Link to v3:
>> https://lore.kernel.org/r/20240207-mptcp-check-protocol-v3-0-77c69c596f55@kernel.org
>
> Thanks Matthieu, v4 LGTM:
>
> Reviewed-by: Mat Martineau <martineau@kernel.org>
Thank you for the review!
Now in our tree:
New patches for t/upstream:
- c3442c02434d: mptcp: token kunit: set protocol
- 63ecd0ec9a16: mptcp: check the protocol in tcp_sk() with DEBUG_NET
- 6b84a8f44c8a: mptcp: check the protocol in mptcp_sk() with DEBUG_NET
- Results: 0b8245446c36..27e2360c238b (export)
Tests are now in progress:
https://cirrus-ci.com/github/multipath-tcp/mptcp_net-next/export/20240216T104727
Cheers,
Matt
--
Sponsored by the NGI0 Core fund.
^ permalink raw reply [flat|nested] 10+ messages in thread