Skip to content

Commit

Permalink
can: isotp: tx-path: zero initialize outgoing CAN frames
Browse files Browse the repository at this point in the history
[ Upstream commit b5f020f ]

Commit d4eb538 ("can: isotp: TX-path: ensure that CAN frame flags are
initialized") ensured the TX flags to be properly set for outgoing CAN
frames.

In fact the root cause of the issue results from a missing initialization
of outgoing CAN frames created by isotp. This is no problem on the CAN bus
as the CAN driver only picks the correctly defined content from the struct
can(fd)_frame. But when the outgoing frames are monitored (e.g. with
candump) we potentially leak some bytes in the unused content of
struct can(fd)_frame.

Fixes: e057dd3 ("can: add ISO 15765-2:2016 transport protocol")
Cc: Marc Kleine-Budde <mkl@pengutronix.de>
Link: https://lore.kernel.org/r/20210319100619.10858-1-socketcan@hartkopp.net
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
hartkopp authored and gregkh committed Mar 30, 2021
1 parent 5f8cad9 commit 22e4f2b
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions net/can/isotp.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ static int isotp_send_fc(struct sock *sk, int ae, u8 flowstatus)
nskb->dev = dev;
can_skb_set_owner(nskb, sk);
ncf = (struct canfd_frame *)nskb->data;
skb_put(nskb, so->ll.mtu);
skb_put_zero(nskb, so->ll.mtu);

/* create & send flow control reply */
ncf->can_id = so->txid;
Expand Down Expand Up @@ -779,7 +779,7 @@ static enum hrtimer_restart isotp_tx_timer_handler(struct hrtimer *hrtimer)
can_skb_prv(skb)->skbcnt = 0;

cf = (struct canfd_frame *)skb->data;
skb_put(skb, so->ll.mtu);
skb_put_zero(skb, so->ll.mtu);

/* create consecutive frame */
isotp_fill_dataframe(cf, so, ae, 0);
Expand Down Expand Up @@ -895,7 +895,7 @@ static int isotp_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
so->tx.idx = 0;

cf = (struct canfd_frame *)skb->data;
skb_put(skb, so->ll.mtu);
skb_put_zero(skb, so->ll.mtu);

/* check for single frame transmission depending on TX_DL */
if (size <= so->tx.ll_dl - SF_PCI_SZ4 - ae - off) {
Expand Down

0 comments on commit 22e4f2b

Please sign in to comment.