summaryrefslogtreecommitdiffstats
path: root/include/linux/skbuff.h
diff options
context:
space:
mode:
authorDaniel Borkmann2016-02-19 23:05:25 +0100
committerDavid S. Miller2016-02-22 04:07:10 +0100
commit3697649ff29e0f647565eed04b27a7779c646a22 (patch)
treef6777555e1879ba3af5cb96673f3674bb72ca7c0 /include/linux/skbuff.h
parentbpf: remove artificial bpf_skb_{load, store}_bytes buffer limitation (diff)
downloadkernel-qcow2-linux-3697649ff29e0f647565eed04b27a7779c646a22.tar.gz
kernel-qcow2-linux-3697649ff29e0f647565eed04b27a7779c646a22.tar.xz
kernel-qcow2-linux-3697649ff29e0f647565eed04b27a7779c646a22.zip
bpf: try harder on clones when writing into skb
When we're dealing with clones and the area is not writeable, try harder and get a copy via pskb_expand_head(). Replace also other occurences in tc actions with the new skb_try_make_writable(). Reported-by: Ashhad Sheikh <ashhadsheikh394@gmail.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/skbuff.h')
-rw-r--r--include/linux/skbuff.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 89b536796e53..6a57757a86cf 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -2630,6 +2630,13 @@ static inline int skb_clone_writable(const struct sk_buff *skb, unsigned int len
skb_headroom(skb) + len <= skb->hdr_len;
}
+static inline int skb_try_make_writable(struct sk_buff *skb,
+ unsigned int write_len)
+{
+ return skb_cloned(skb) && !skb_clone_writable(skb, write_len) &&
+ pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
+}
+
static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom,
int cloned)
{