Commit 08c94d80 authored by Wei Yongjun's avatar Wei Yongjun Committed by Martin K. Petersen
Browse files

scsi: bnx2fc: Fix skb double free in bnx2fc_rcv()



skb_share_check() already drops the reference to the skb when returning
NULL. Using kfree_skb() in the error handling path leads to an skb double
free.

Fix this by removing the variable tmp_skb, and return directly when
skb_share_check() returns NULL.

Fixes: 01a4cc4d ("bnx2fc: do not add shared skbs to the fcoe_rx_list")
Signed-off-by: default avatarWei Yongjun <weiyongjun1@huawei.com>
Link: https://lore.kernel.org/r/20221114110626.526643-1-weiyongjun@huaweicloud.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 77a67255
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -429,7 +429,6 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev,
	struct fcoe_ctlr *ctlr;
	struct fcoe_rcv_info *fr;
	struct fcoe_percpu_s *bg;
	struct sk_buff *tmp_skb;

	interface = container_of(ptype, struct bnx2fc_interface,
				 fcoe_packet_type);
@@ -441,11 +440,9 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct net_device *dev,
		goto err;
	}

	tmp_skb = skb_share_check(skb, GFP_ATOMIC);
	if (!tmp_skb)
		goto err;

	skb = tmp_skb;
	skb = skb_share_check(skb, GFP_ATOMIC);
	if (!skb)
		return -1;

	if (unlikely(eth_hdr(skb)->h_proto != htons(ETH_P_FCOE))) {
		printk(KERN_ERR PFX "bnx2fc_rcv: Wrong FC type frame\n");