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

Commit c4c2c287 authored by Marc Kleine-Budde's avatar Marc Kleine-Budde Committed by Greg Kroah-Hartman
Browse files

can: dev: __can_get_echo_skb(): print error message, if trying to echo non existing skb



commit 7da11ba5c5066dadc2e96835a6233d56d7b7764a upstream.

Prior to echoing a successfully transmitted CAN frame (by calling
can_get_echo_skb()), CAN drivers have to put the CAN frame (by calling
can_put_echo_skb() in the transmit function). These put and get function
take an index as parameter, which is used to identify the CAN frame.

A driver calling can_get_echo_skb() with a index not pointing to a skb
is a BUG, so add an appropriate error message.

Cc: linux-stable <stable@vger.kernel.org>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8aa60a6d
Loading
Loading
Loading
Loading
+14 −13
Original line number Diff line number Diff line
@@ -456,6 +456,8 @@ EXPORT_SYMBOL_GPL(can_put_echo_skb);
struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr)
{
	struct can_priv *priv = netdev_priv(dev);
	struct sk_buff *skb = priv->echo_skb[idx];
	struct canfd_frame *cf;

	if (idx >= priv->echo_skb_max) {
		netdev_err(dev, "%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n",
@@ -463,23 +465,22 @@ struct sk_buff *__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8
		return NULL;
	}

	if (priv->echo_skb[idx]) {
	if (!skb) {
		netdev_err(dev, "%s: BUG! Trying to echo non existing skb: can_priv::echo_skb[%u]\n",
			   __func__, idx);
		return NULL;
	}

	/* Using "struct canfd_frame::len" for the frame
	 * length is supported on both CAN and CANFD frames.
	 */
		struct sk_buff *skb = priv->echo_skb[idx];
		struct canfd_frame *cf = (struct canfd_frame *)skb->data;
		u8 len = cf->len;

		*len_ptr = len;
	cf = (struct canfd_frame *)skb->data;
	*len_ptr = cf->len;
	priv->echo_skb[idx] = NULL;

	return skb;
}

	return NULL;
}

/*
 * Get the skb from the stack and loop it back locally
 *