Skip to content

Commit 3d3925f

Browse files
HBh25Ymarckleinebudde
authored andcommitted
can: usb_8dev: usb_8dev_start_xmit(): fix double dev_kfree_skb() in error path
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. Fixes: 0024d8a ("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: Hangyu Hua <hbh25y@gmail.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent c702227 commit 3d3925f

File tree

1 file changed

+14
-16
lines changed

1 file changed

+14
-16
lines changed

Diff for: drivers/net/can/usb/usb_8dev.c

+14-16
Original file line numberDiff line numberDiff line change
@@ -663,9 +663,20 @@ static netdev_tx_t usb_8dev_start_xmit(struct sk_buff *skb,
663663
atomic_inc(&priv->active_tx_urbs);
664664

665665
err = usb_submit_urb(urb, GFP_ATOMIC);
666-
if (unlikely(err))
667-
goto failed;
668-
else if (atomic_read(&priv->active_tx_urbs) >= MAX_TX_URBS)
666+
if (unlikely(err)) {
667+
can_free_echo_skb(netdev, context->echo_index, NULL);
668+
669+
usb_unanchor_urb(urb);
670+
usb_free_coherent(priv->udev, size, buf, urb->transfer_dma);
671+
672+
atomic_dec(&priv->active_tx_urbs);
673+
674+
if (err == -ENODEV)
675+
netif_device_detach(netdev);
676+
else
677+
netdev_warn(netdev, "failed tx_urb %d\n", err);
678+
stats->tx_dropped++;
679+
} else if (atomic_read(&priv->active_tx_urbs) >= MAX_TX_URBS)
669680
/* Slow down tx path */
670681
netif_stop_queue(netdev);
671682

@@ -684,19 +695,6 @@ static netdev_tx_t usb_8dev_start_xmit(struct sk_buff *skb,
684695

685696
return NETDEV_TX_BUSY;
686697

687-
failed:
688-
can_free_echo_skb(netdev, context->echo_index, NULL);
689-
690-
usb_unanchor_urb(urb);
691-
usb_free_coherent(priv->udev, size, buf, urb->transfer_dma);
692-
693-
atomic_dec(&priv->active_tx_urbs);
694-
695-
if (err == -ENODEV)
696-
netif_device_detach(netdev);
697-
else
698-
netdev_warn(netdev, "failed tx_urb %d\n", err);
699-
700698
nomembuf:
701699
usb_free_urb(urb);
702700

0 commit comments

Comments
 (0)