diff mbox

[net-next] skbuff: re-add check for NULL skb->head in kfree_skb path

Message ID 20170723175447.28431-1-fw@strlen.de
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Florian Westphal July 23, 2017, 5:54 p.m. UTC
A null check is needed after all.  netlink skbs can have skb->head be
backed by vmalloc.  The netlink destructor vfree()s head, then sets it to
NULL.  We then panic in skb_release_data with a NULL dereference.

Re-add such a test.

Alternative would be to switch to kvfree to free skb->head memory
and remove the special handling in netlink destructor.

Reported-by: kernel test robot <fengguang.wu@intel.com>
Fixes: 06dc75ab06943 ("net: Revert "net: add function to allocate sk_buff head without data area")
Signed-off-by: Florian Westphal <fw@strlen.de>
---
 net/core/skbuff.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

David Miller July 24, 2017, 11:28 p.m. UTC | #1
From: Florian Westphal <fw@strlen.de>
Date: Sun, 23 Jul 2017 19:54:47 +0200

> A null check is needed after all.  netlink skbs can have skb->head be
> backed by vmalloc.  The netlink destructor vfree()s head, then sets it to
> NULL.  We then panic in skb_release_data with a NULL dereference.
> 
> Re-add such a test.
> 
> Alternative would be to switch to kvfree to free skb->head memory
> and remove the special handling in netlink destructor.
> 
> Reported-by: kernel test robot <fengguang.wu@intel.com>
> Fixes: 06dc75ab06943 ("net: Revert "net: add function to allocate sk_buff head without data area")
> Signed-off-by: Florian Westphal <fw@strlen.de>

Ok, back it goes.

Applied, thanks.
diff mbox

Patch

diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 84bdfa2..c27da51 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -638,7 +638,8 @@  void skb_release_head_state(struct sk_buff *skb)
 static void skb_release_all(struct sk_buff *skb)
 {
 	skb_release_head_state(skb);
-	skb_release_data(skb);
+	if (likely(skb->head))
+		skb_release_data(skb);
 }
 
 /**