diff options
author | Kees Cook <keescook@chromium.org> | 2024-02-16 15:31:32 -0800 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2024-02-21 12:03:22 +0100 |
commit | 26f4dac11775a1ca24e2605cb30e828d4dbdea93 (patch) | |
tree | 52cacb9a443fc1fa968444b233b18d65137a4b4a /net/netfilter | |
parent | 3f801968889459ecae1eab524b039676e6eaa319 (diff) |
netfilter: x_tables: Use unsafe_memcpy() for 0-sized destination
The struct xt_entry_target fake flexible array has not be converted to a
true flexible array, which is mainly blocked by it being both UAPI and
used in the middle of other structures. In order to properly check for
0-sized destinations in memcpy(), an exception must be made for the one
place where it is still a destination. Since memcpy() was already
skipping checks for 0-sized destinations, using unsafe_memcpy() is no
change in behavior.
Signed-off-by: Kees Cook <keescook@chromium.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'net/netfilter')
-rw-r--r-- | net/netfilter/x_tables.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c index 21624d68314f..da5d929c7c85 100644 --- a/net/netfilter/x_tables.c +++ b/net/netfilter/x_tables.c @@ -1142,7 +1142,8 @@ void xt_compat_target_from_user(struct xt_entry_target *t, void **dstptr, if (target->compat_from_user) target->compat_from_user(t->data, ct->data); else - memcpy(t->data, ct->data, tsize - sizeof(*ct)); + unsafe_memcpy(t->data, ct->data, tsize - sizeof(*ct), + /* UAPI 0-sized destination */); tsize += off; t->u.user.target_size = tsize; |