Fix skb leak

master
Kyle Schwarz 2026-03-24 14:02:24 -04:00
parent 75ac5d569a
commit 07fa2bf573
1 changed files with 2 additions and 8 deletions

View File

@ -216,7 +216,6 @@ static netdev_tx_t intrepid_CAN_netdevice_xmit(struct sk_buff *skb, struct net_d
struct canfd_frame *cf = (struct canfd_frame*)skb->data; struct canfd_frame *cf = (struct canfd_frame*)skb->data;
bool fd = can_is_canfd_skb(skb); bool fd = can_is_canfd_skb(skb);
bool needs_unlock = false; bool needs_unlock = false;
bool consumed = false;
int tx_idx; int tx_idx;
neomessage_can_t msg = {0}; neomessage_can_t msg = {0};
@ -280,7 +279,6 @@ static netdev_tx_t intrepid_CAN_netdevice_xmit(struct sk_buff *skb, struct net_d
, msg.length , msg.length
#endif #endif
); );
consumed = true;
/* Copy the message into the usermode box */ /* Copy the message into the usermode box */
memcpy(tx_boxes[current_tx_box] + tx_box_bytes[current_tx_box], &msg, sizeof(neomessage_can_t)); memcpy(tx_boxes[current_tx_box] + tx_box_bytes[current_tx_box], &msg, sizeof(neomessage_can_t));
@ -293,8 +291,7 @@ static netdev_tx_t intrepid_CAN_netdevice_xmit(struct sk_buff *skb, struct net_d
if (intrepid_tx_box_no_space_for(sizeof(neomessage_can_t) + CANFD_MTU)) if (intrepid_tx_box_no_space_for(sizeof(neomessage_can_t) + CANFD_MTU))
intrepid_pause_all_queues(); intrepid_pause_all_queues();
exit: exit:
if (ret == NETDEV_TX_OK && !consumed) dev_kfree_skb(skb);
consume_skb(skb);
wake_up_interruptible(&tx_wait); wake_up_interruptible(&tx_wait);
if (needs_unlock) if (needs_unlock)
spin_unlock_bh(&tx_box_lock); spin_unlock_bh(&tx_box_lock);
@ -305,7 +302,6 @@ static netdev_tx_t intrepid_ETH_netdevice_xmit(struct sk_buff *skb, struct net_d
int ret = NETDEV_TX_OK; int ret = NETDEV_TX_OK;
struct intrepid_netdevice *ics = netdev_priv(dev); struct intrepid_netdevice *ics = netdev_priv(dev);
bool needs_unlock = false; bool needs_unlock = false;
bool consumed = false;
int tx_idx; int tx_idx;
neomessage_eth_t msg = {0}; neomessage_eth_t msg = {0};
@ -335,7 +331,6 @@ static netdev_tx_t intrepid_ETH_netdevice_xmit(struct sk_buff *skb, struct net_d
goto exit; goto exit;
} }
msg.description = intrepid_next_tx_description(ics, &tx_idx); msg.description = intrepid_next_tx_description(ics, &tx_idx);
consumed = true;
/* Copy the message into the usermode box */ /* Copy the message into the usermode box */
memcpy(tx_boxes[current_tx_box] + tx_box_bytes[current_tx_box], &msg, sizeof(neomessage_eth_t)); memcpy(tx_boxes[current_tx_box] + tx_box_bytes[current_tx_box], &msg, sizeof(neomessage_eth_t));
@ -348,8 +343,7 @@ static netdev_tx_t intrepid_ETH_netdevice_xmit(struct sk_buff *skb, struct net_d
if (intrepid_tx_box_no_space_for(sizeof(neomessage_eth_t) + ETH_DATA_LEN)) if (intrepid_tx_box_no_space_for(sizeof(neomessage_eth_t) + ETH_DATA_LEN))
intrepid_pause_all_queues(); intrepid_pause_all_queues();
exit: exit:
if (ret == NETDEV_TX_OK && !consumed) dev_kfree_skb(skb);
consume_skb(skb);
wake_up_interruptible(&tx_wait); wake_up_interruptible(&tx_wait);
if (needs_unlock) if (needs_unlock)
spin_unlock_bh(&tx_box_lock); spin_unlock_bh(&tx_box_lock);