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

Commit 7d33bb90 authored by Hangyu Hua's avatar Hangyu Hua Committed by Lee Jones
Browse files

BACKPORT: can: usb_8dev: usb_8dev_start_xmit(): fix double dev_kfree_skb() in error path

commit 3d3925ff6433f98992685a9679613a2cc97f3ce2 upstream.

There is no need to call dev_kfree_skb() when usb_submit_urb() fails
because can_put_echo_skb() deletes original skb and
can_free_echo_skb() deletes the cloned skb.

Bug: 228694483
Fixes: 0024d8ad ("can: usb_8dev: Add support for USB2CAN interface from 8 devices")
Link: https://lore.kernel.org/all/20220311080614.45229-1-hbh25y@gmail.com


Cc: stable@vger.kernel.org
Signed-off-by: default avatarHangyu Hua <hbh25y@gmail.com>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
Change-Id: I3c9191dd936d82e7c692fad33919b766e69ed7b5
parent 09c810c7
Loading
Loading
Loading
Loading
+14 −16
Original line number Original line Diff line number Diff line
@@ -670,9 +670,20 @@ static netdev_tx_t usb_8dev_start_xmit(struct sk_buff *skb,
	atomic_inc(&priv->active_tx_urbs);
	atomic_inc(&priv->active_tx_urbs);


	err = usb_submit_urb(urb, GFP_ATOMIC);
	err = usb_submit_urb(urb, GFP_ATOMIC);
	if (unlikely(err))
	if (unlikely(err)) {
		goto failed;
		can_free_echo_skb(netdev, context->echo_index);
	else if (atomic_read(&priv->active_tx_urbs) >= MAX_TX_URBS)

		usb_unanchor_urb(urb);
		usb_free_coherent(priv->udev, size, buf, urb->transfer_dma);

		atomic_dec(&priv->active_tx_urbs);

		if (err == -ENODEV)
			netif_device_detach(netdev);
		else
			netdev_warn(netdev, "failed tx_urb %d\n", err);
		stats->tx_dropped++;
	} else if (atomic_read(&priv->active_tx_urbs) >= MAX_TX_URBS)
		/* Slow down tx path */
		/* Slow down tx path */
		netif_stop_queue(netdev);
		netif_stop_queue(netdev);


@@ -691,19 +702,6 @@ static netdev_tx_t usb_8dev_start_xmit(struct sk_buff *skb,


	return NETDEV_TX_BUSY;
	return NETDEV_TX_BUSY;


failed:
	can_free_echo_skb(netdev, context->echo_index);

	usb_unanchor_urb(urb);
	usb_free_coherent(priv->udev, size, buf, urb->transfer_dma);

	atomic_dec(&priv->active_tx_urbs);

	if (err == -ENODEV)
		netif_device_detach(netdev);
	else
		netdev_warn(netdev, "failed tx_urb %d\n", err);

nomembuf:
nomembuf:
	usb_free_urb(urb);
	usb_free_urb(urb);