diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/filter.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/net/core/filter.c b/net/core/filter.c index bbb53c69857c..f5f3cf603064 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/if_packet.h> | 27 | #include <linux/if_packet.h> |
28 | #include <net/ip.h> | 28 | #include <net/ip.h> |
29 | #include <net/protocol.h> | 29 | #include <net/protocol.h> |
30 | #include <net/netlink.h> | ||
30 | #include <linux/skbuff.h> | 31 | #include <linux/skbuff.h> |
31 | #include <net/sock.h> | 32 | #include <net/sock.h> |
32 | #include <linux/errno.h> | 33 | #include <linux/errno.h> |
@@ -303,6 +304,22 @@ load_b: | |||
303 | case SKF_AD_IFINDEX: | 304 | case SKF_AD_IFINDEX: |
304 | A = skb->dev->ifindex; | 305 | A = skb->dev->ifindex; |
305 | continue; | 306 | continue; |
307 | case SKF_AD_NLATTR: { | ||
308 | struct nlattr *nla; | ||
309 | |||
310 | if (skb_is_nonlinear(skb)) | ||
311 | return 0; | ||
312 | if (A > skb->len - sizeof(struct nlattr)) | ||
313 | return 0; | ||
314 | |||
315 | nla = nla_find((struct nlattr *)&skb->data[A], | ||
316 | skb->len - A, X); | ||
317 | if (nla) | ||
318 | A = (void *)nla - (void *)skb->data; | ||
319 | else | ||
320 | A = 0; | ||
321 | continue; | ||
322 | } | ||
306 | default: | 323 | default: |
307 | return 0; | 324 | return 0; |
308 | } | 325 | } |