2022-01-22 00:37:58

by Kees Cook

[permalink] [raw]
Subject: [PATCH] mptcp: Use struct_group() to avoid cross-field memset()

In preparation for FORTIFY_SOURCE performing compile-time and run-time
field bounds checking for memcpy(), memmove(), and memset(), avoid
intentionally writing across neighboring fields.

Use struct_group() to capture the fields to be reset, so that memset()
can be appropriately bounds-checked by the compiler.

Cc: Mat Martineau <[email protected]>
Cc: Matthieu Baerts <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Jakub Kicinski <[email protected]>
Cc: [email protected]
Cc: [email protected]
Signed-off-by: Kees Cook <[email protected]>
---
net/mptcp/protocol.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 0e6b42c76ea0..85317ce38e3f 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -408,7 +408,7 @@ DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
struct mptcp_subflow_context {
struct list_head node;/* conn_list of subflows */

- char reset_start[0];
+ struct_group(reset,

unsigned long avg_pacing_rate; /* protected by msk socket lock */
u64 local_key;
@@ -458,7 +458,7 @@ struct mptcp_subflow_context {

long delegated_status;

- char reset_end[0];
+ );

struct list_head delegated_node; /* link into delegated_action, protected by local BH */

@@ -494,7 +494,7 @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
static inline void
mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow)
{
- memset(subflow->reset_start, 0, subflow->reset_end - subflow->reset_start);
+ memset(&subflow->reset, 0, sizeof(subflow->reset));
subflow->request_mptcp = 1;
}

--
2.30.2


2022-01-22 08:08:01

by Mat Martineau

[permalink] [raw]
Subject: Re: [PATCH] mptcp: Use struct_group() to avoid cross-field memset()

On Thu, 20 Jan 2022, Kees Cook wrote:

> In preparation for FORTIFY_SOURCE performing compile-time and run-time
> field bounds checking for memcpy(), memmove(), and memset(), avoid
> intentionally writing across neighboring fields.
>
> Use struct_group() to capture the fields to be reset, so that memset()
> can be appropriately bounds-checked by the compiler.
>
> Cc: Mat Martineau <[email protected]>
> Cc: Matthieu Baerts <[email protected]>
> Cc: "David S. Miller" <[email protected]>
> Cc: Jakub Kicinski <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Signed-off-by: Kees Cook <[email protected]>
> ---
> net/mptcp/protocol.h | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>

Thanks Kees, looks good to me. I checked around for other MPTCP structs
that would need similar attention and didn't see any.

Reviewed-by: Mat Martineau <[email protected]>


> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index 0e6b42c76ea0..85317ce38e3f 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -408,7 +408,7 @@ DECLARE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
> struct mptcp_subflow_context {
> struct list_head node;/* conn_list of subflows */
>
> - char reset_start[0];
> + struct_group(reset,
>
> unsigned long avg_pacing_rate; /* protected by msk socket lock */
> u64 local_key;
> @@ -458,7 +458,7 @@ struct mptcp_subflow_context {
>
> long delegated_status;
>
> - char reset_end[0];
> + );
>
> struct list_head delegated_node; /* link into delegated_action, protected by local BH */
>
> @@ -494,7 +494,7 @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
> static inline void
> mptcp_subflow_ctx_reset(struct mptcp_subflow_context *subflow)
> {
> - memset(subflow->reset_start, 0, subflow->reset_end - subflow->reset_start);
> + memset(&subflow->reset, 0, sizeof(subflow->reset));
> subflow->request_mptcp = 1;
> }
>
> --
> 2.30.2
>
>

--
Mat Martineau
Intel

2022-01-23 00:14:52

by patchwork-bot+netdevbpf

[permalink] [raw]
Subject: Re: [PATCH] mptcp: Use struct_group() to avoid cross-field memset()

Hello:

This patch was applied to netdev/net.git (master)
by Jakub Kicinski <[email protected]>:

On Thu, 20 Jan 2022 23:39:35 -0800 you wrote:
> In preparation for FORTIFY_SOURCE performing compile-time and run-time
> field bounds checking for memcpy(), memmove(), and memset(), avoid
> intentionally writing across neighboring fields.
>
> Use struct_group() to capture the fields to be reset, so that memset()
> can be appropriately bounds-checked by the compiler.
>
> [...]

Here is the summary with links:
- mptcp: Use struct_group() to avoid cross-field memset()
https://git.kernel.org/netdev/net/c/63ec72bd5848

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html