Patch "net:tipc: Fix a double free in tipc_sk_mcast_rcv" has been added to the 4.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net:tipc: Fix a double free in tipc_sk_mcast_rcv

to the 4.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-tipc-fix-a-double-free-in-tipc_sk_mcast_rcv.patch
and it can be found in the queue-4.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 9da68c1139b5f1fadef6ea6e77a5a4af7effb9ac
Author: Lv Yunlong <lyl2019@xxxxxxxxxxxxxxxx>
Date:   Sun Mar 28 00:30:29 2021 -0700

    net:tipc: Fix a double free in tipc_sk_mcast_rcv
    
    [ Upstream commit 6bf24dc0cc0cc43b29ba344b66d78590e687e046 ]
    
    In the if(skb_peek(arrvq) == skb) branch, it calls __skb_dequeue(arrvq) to get
    the skb by skb = skb_peek(arrvq). Then __skb_dequeue() unlinks the skb from arrvq
    and returns the skb which equals to skb_peek(arrvq). After __skb_dequeue(arrvq)
    finished, the skb is freed by kfree_skb(__skb_dequeue(arrvq)) in the first time.
    
    Unfortunately, the same skb is freed in the second time by kfree_skb(skb) after
    the branch completed.
    
    My patch removes kfree_skb() in the if(skb_peek(arrvq) == skb) branch, because
    this skb will be freed by kfree_skb(skb) finally.
    
    Fixes: cb1b728096f54 ("tipc: eliminate race condition at multicast reception")
    Signed-off-by: Lv Yunlong <lyl2019@xxxxxxxxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 65171f8e8c45..0e5bb03c6425 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -763,7 +763,7 @@ void tipc_sk_mcast_rcv(struct net *net, struct sk_buff_head *arrvq,
 		spin_lock_bh(&inputq->lock);
 		if (skb_peek(arrvq) == skb) {
 			skb_queue_splice_tail_init(&tmpq, inputq);
-			kfree_skb(__skb_dequeue(arrvq));
+			__skb_dequeue(arrvq);
 		}
 		spin_unlock_bh(&inputq->lock);
 		__skb_queue_purge(&tmpq);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux