net: skb extension follow-ups
Subsystems (2)
Paolo Abeni
maintainerv2 cover net: skb extension follow-ups
This series includes some follow-up for the recently added skb extension. The first patch addresses an unlikely race while adding skb extensions, and the following two are just minor code clean-up.
v1 -> v2:
- be sure to flag the newly added extension as active in skb_ext_add()
Paolo Abeni (3):
net: fix possible user-after-free in skb_ext_add()
net: drop the unused helper skb_ext_get()
net: minor cleanup in skb_ext_add()
include/linux/skbuff.h | 11 ----------- net/core/skbuff.c | 9 +++------ 2 files changed, 3 insertions(+), 17 deletions(-)
Signature · 1 line
2.19.2
Paolo Abeni
maintainerPATCH v2 1/3 net: fix possible user-after-free in skb_ext_add()
On cow we can free the old extension: we must avoid dereferencing such extension after skb_ext_maybe_cow(). Since 'new' contents are always equal to 'old' after the copy, we can fix the above accessing the relevant data using 'new'.
--- net/core/skbuff.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/core/skbuff.c +2 -2
@@ -5666,13 +5666,13 @@ void *skb_ext_add(struct sk_buff *skb, enum skb_ext_id id)if (!new)return NULL ; -if (__skb_ext_exist (old, id)) { +if (__skb_ext_exist (new, id)) {if (old != new) skb->extensions = new; goto set_active; } - newoff = old->chunks; + newoff = new->chunks; }else { newoff =SKB_EXT_CHUNKSIZEOF (*new);
Signature · 1 line
2.19.2
Paolo Abeni
maintainerPATCH v2 2/3 net: drop the unused helper skb_ext_get()
In reply to Paolo AbeniSuch helper is currently unused, and skb extension users are better off using skb_ext_add()/skb_ext_del(). So let's drop it.
--- include/linux/skbuff.h | 11 ----------- 1 file changed, 11 deletions(-)
include/linux/skbuff.h +0 -11
@@ -3938,16 +3938,6 @@ static inline void skb_ext_put(struct sk_buff *skb)__skb_ext_put (skb->extensions); } -static inline void skb_ext_get (struct sk_buff *skb) -{ -if (skb->active_extensions) { -struct skb_ext *ext = skb->extensions; - -if (ext) -refcount_inc (&ext->refcnt); - } -} -static inline void __skb_ext_copy (struct sk_buff *dst,const struct sk_buff *src) {
@@ -3995,7 +3985,6 @@ static inline void *skb_ext_find(const struct sk_buff *skb, enum skb_ext_id id) }#else static inline void skb_ext_put (struct sk_buff *skb) {} -static inline void skb_ext_get (struct sk_buff *skb) {}static inline void skb_ext_del (struct sk_buff *skb,int unused) {}static inline void __skb_ext_copy (struct sk_buff *d,const struct sk_buff *s) {}static inline void skb_ext_copy (struct sk_buff *dst,const struct sk_buff *s) {}
Signature · 1 line
2.19.2
Paolo Abeni
maintainerPATCH v2 3/3 net: minor cleanup in skb_ext_add()
In reply to Paolo AbeniWhen the extension to be added is already present, the only skb field we may need to update is 'extensions': we can reorder the code and avoid a branch.
v1 -> v2:
- be sure to flag the newly added extension as active
--- net/core/skbuff.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
net/core/skbuff.c +2 -5
@@ -5666,11 +5666,8 @@ void *skb_ext_add(struct sk_buff *skb, enum skb_ext_id id)if (!new)return NULL ; -if (__skb_ext_exist (new, id)) { -if (old != new) - skb->extensions = new; +if (__skb_ext_exist (new, id)) goto set_active; - } newoff = new->chunks; }else {
@@ -5684,8 +5681,8 @@ void *skb_ext_add(struct sk_buff *skb, enum skb_ext_id id) newlen = newoff + skb_ext_type_len[id]; new->chunks = newlen; new->offset[id] = newoff; - skb->extensions = new; set_active: + skb->extensions = new; skb->active_extensions |=1 << id;return skb_ext_get_ptr (new, id); }
Signature · 1 line
2.19.2
Re: [PATCH net-next v2 3/3] net: minor cleanup in skb_ext_add()
Quoted 3 lines · Paolo Abeni
When the extension to be added is already present, the only skb field we may need to update is 'extensions': we can reorder the code and avoid a branch.
Thanks Paolo.
David Miller
maintainerFrom: Paolo Abeni <[email protected]>
Date: Fri, 21 Dec 2018 19:03:12 +0100
Quoted 6 lines
This series includes some follow-up for the recently added skb extension. The first patch addresses an unlikely race while adding skb extensions, and the following two are just minor code clean-up.
v1 -> v2:
- be sure to flag the newly added extension as active inskb_ext_add()
Series applied, thanks.