Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d2136f05 authored by Oleksij Rempel's avatar Oleksij Rempel Committed by Greg Kroah-Hartman
Browse files

can: j1939: j1939_tp_tx_dat_new(): fix out-of-bounds memory access



commit b45193cb4df556fe6251b285a5ce44046dd36b4a upstream.

In the j1939_tp_tx_dat_new() function, an out-of-bounds memory access
could occur during the memcpy() operation if the size of skb->cb is
larger than the size of struct j1939_sk_buff_cb. This is because the
memcpy() operation uses the size of skb->cb, leading to a read beyond
the struct j1939_sk_buff_cb.

Updated the memcpy() operation to use the size of struct
j1939_sk_buff_cb instead of the size of skb->cb. This ensures that the
memcpy() operation only reads the memory within the bounds of struct
j1939_sk_buff_cb, preventing out-of-bounds memory access.

Additionally, add a BUILD_BUG_ON() to check that the size of skb->cb
is greater than or equal to the size of struct j1939_sk_buff_cb. This
ensures that the skb->cb buffer is large enough to hold the
j1939_sk_buff_cb structure.

Fixes: 9d71dd0c ("can: add support of SAE J1939 protocol")
Reported-by: default avatarShuangpeng Bai <sjb7183@psu.edu>
Tested-by: default avatarShuangpeng Bai <sjb7183@psu.edu>
Signed-off-by: default avatarOleksij Rempel <o.rempel@pengutronix.de>
Link: https://groups.google.com/g/syzkaller/c/G_LL-C3plRs/m/-8xCi6dCAgAJ
Link: https://lore.kernel.org/all/20230404073128.3173900-1-o.rempel@pengutronix.de


Cc: stable@vger.kernel.org
[mkl: rephrase commit message]
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5a74a75f
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -600,7 +600,10 @@ sk_buff *j1939_tp_tx_dat_new(struct j1939_priv *priv,
	/* reserve CAN header */
	skb_reserve(skb, offsetof(struct can_frame, data));

	memcpy(skb->cb, re_skcb, sizeof(skb->cb));
	/* skb->cb must be large enough to hold a j1939_sk_buff_cb structure */
	BUILD_BUG_ON(sizeof(skb->cb) < sizeof(*re_skcb));

	memcpy(skb->cb, re_skcb, sizeof(*re_skcb));
	skcb = j1939_skb_to_cb(skb);
	if (swap_src_dst)
		j1939_skbcb_swap(skcb);