Fix skb leak
parent
75ac5d569a
commit
07fa2bf573
10
intrepid.c
10
intrepid.c
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue