Skip to contentSkip to conversation

Patch "net: Fix skb_set_peeked use-after-free bug" has been added to the 4.1-stable tree

PATCH [email protected] 1 participant 1 message Sep 26, 2015

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

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

net: Fix skb_set_peeked use-after-free bug

to the 4.1-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-fix-skb_set_peeked-use-after-free-bug.patch
and it can be found in the queue-4.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From foo@baz Sat Sep 26 11:13:07 PDT 2015

From: Herbert Xu <[email protected]>
Date: Tue, 4 Aug 2015 15:42:47 +0800
Subject: net: Fix skb_set_peeked use-after-free bug

From: Herbert Xu <[email protected]>

[ Upstream commit a0a2a6602496a45ae838a96db8b8173794b5d398 ]

The commit 738ac1ebb96d02e0d23bc320302a6ea94c612dec ("net: Clone skb before setting peeked flag") introduced a use-after-free bug in skb_recv_datagram. This is because skb_set_peeked may create a new skb and free the existing one. As it stands the caller will continue to use the old freed skb.

This patch fixes it by making skb_set_peeked return the new skb (or the old one if unchanged).

---
 net/core/datagram.c |   13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
net/core/datagram.c +7 -6
@@ -131,12 +131,12 @@ out_noerr:
 	goto out;
 }
 
-static int skb_set_peeked(struct sk_buff *skb)
+static struct sk_buff *skb_set_peeked(struct sk_buff *skb)
 {
 	struct sk_buff *nskb;
 
 	if (skb->peeked)
-		return 0;
+		return skb;
 
 	/* We have to unshare an skb before modifying it. */
 	if (!skb_shared(skb))
@@ -144,7 +144,7 @@ static int skb_set_peeked(struct sk_buff
 
 	nskb = skb_clone(skb, GFP_ATOMIC);
 	if (!nskb)
-		return -ENOMEM;
+		return ERR_PTR(-ENOMEM);
 
 	skb->prev->next = nskb;
 	skb->next->prev = nskb;
@@ -157,7 +157,7 @@ static int skb_set_peeked(struct sk_buff
 done:
 	skb->peeked = 1;
 
-	return 0;
+	return skb;
 }
 
 /**
@@ -229,8 +229,9 @@ struct sk_buff *__skb_recv_datagram(stru
 					continue;
 				}
 
-				error = skb_set_peeked(skb);
-				if (error)
+				skb = skb_set_peeked(skb);
+				error = PTR_ERR(skb);
+				if (IS_ERR(skb))
 					goto unlock_err;
 
 				atomic_inc(&skb->users);

Patches currently in stable-queue which might be from [email protected] are

queue-4.1/powerpc-uncomment-and-make-enable_kernel_vsx-routine-available.patch queue-4.1/net-fix-skb_set_peeked-use-after-free-bug.patch queue-4.1/ipv6-lock-socket-in-ip6_datagram_connect.patch queue-4.1/net-fix-skb-csum-races-when-peeking.patch queue-4.1/rhashtable-fix-for-resize-events-during-table-walk.patch queue-4.1/net-clone-skb-before-setting-peeked-flag.patch queue-4.1/revert-sit-add-gro-callbacks-to-sit_offload.patch queue-4.1/crypto-vmx-adding-enable_kernel_vsx-to-access-vsx-instructions.patch queue-4.1/netlink-make-sure-ebusy-won-t-escape-from-netlink_insert.patch