Patch "net: Fix skb_set_peeked use-after-free bug" has been added to the 3.14-stable tree
Subsystems (2)
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 3.14-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-3.14 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:19:08 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
@@ -130,12 +130,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))
@@ -143,7 +143,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;
@@ -156,7 +156,7 @@ static int skb_set_peeked(struct sk_buff done: skb->peeked =1 ; -return 0 ; +return skb; }/**
@@ -228,8 +228,9 @@ struct sk_buff *__skb_recv_datagram(strucontinue ; } - 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-3.14/net-fix-skb_set_peeked-use-after-free-bug.patch queue-3.14/ipv6-lock-socket-in-ip6_datagram_connect.patch queue-3.14/net-fix-skb-csum-races-when-peeking.patch queue-3.14/net-clone-skb-before-setting-peeked-flag.patch