aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/netfilter.h2
-rw-r--r--net/bridge/br_netfilter_hooks.c3
-rw-r--r--net/netfilter/nf_conntrack_proto_tcp.c4
-rw-r--r--net/netfilter/nft_osf.c2
-rw-r--r--net/netfilter/nft_set_rbtree.c28
-rw-r--r--net/netfilter/xt_socket.c4
6 files changed, 23 insertions, 20 deletions
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h
index 07efffd0c759..bbe99d2b28b4 100644
--- a/include/linux/netfilter.h
+++ b/include/linux/netfilter.h
@@ -215,6 +215,8 @@ static inline int nf_hook(u_int8_t pf, unsigned int hook, struct net *net,
215 break; 215 break;
216 case NFPROTO_ARP: 216 case NFPROTO_ARP:
217#ifdef CONFIG_NETFILTER_FAMILY_ARP 217#ifdef CONFIG_NETFILTER_FAMILY_ARP
218 if (WARN_ON_ONCE(hook >= ARRAY_SIZE(net->nf.hooks_arp)))
219 break;
218 hook_head = rcu_dereference(net->nf.hooks_arp[hook]); 220 hook_head = rcu_dereference(net->nf.hooks_arp[hook]);
219#endif 221#endif
220 break; 222 break;
diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c
index 6e0dc6bcd32a..37278dc280eb 100644
--- a/net/bridge/br_netfilter_hooks.c
+++ b/net/bridge/br_netfilter_hooks.c
@@ -835,7 +835,8 @@ static unsigned int ip_sabotage_in(void *priv,
835 struct sk_buff *skb, 835 struct sk_buff *skb,
836 const struct nf_hook_state *state) 836 const struct nf_hook_state *state)
837{ 837{
838 if (skb->nf_bridge && !skb->nf_bridge->in_prerouting) { 838 if (skb->nf_bridge && !skb->nf_bridge->in_prerouting &&
839 !netif_is_l3_master(skb->dev)) {
839 state->okfn(state->net, state->sk, skb); 840 state->okfn(state->net, state->sk, skb);
840 return NF_STOLEN; 841 return NF_STOLEN;
841 } 842 }
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
index b4bdf9eda7b7..247b89784a6f 100644
--- a/net/netfilter/nf_conntrack_proto_tcp.c
+++ b/net/netfilter/nf_conntrack_proto_tcp.c
@@ -1213,8 +1213,8 @@ static const struct nla_policy tcp_nla_policy[CTA_PROTOINFO_TCP_MAX+1] = {
1213#define TCP_NLATTR_SIZE ( \ 1213#define TCP_NLATTR_SIZE ( \
1214 NLA_ALIGN(NLA_HDRLEN + 1) + \ 1214 NLA_ALIGN(NLA_HDRLEN + 1) + \
1215 NLA_ALIGN(NLA_HDRLEN + 1) + \ 1215 NLA_ALIGN(NLA_HDRLEN + 1) + \
1216 NLA_ALIGN(NLA_HDRLEN + sizeof(sizeof(struct nf_ct_tcp_flags))) + \ 1216 NLA_ALIGN(NLA_HDRLEN + sizeof(struct nf_ct_tcp_flags)) + \
1217 NLA_ALIGN(NLA_HDRLEN + sizeof(sizeof(struct nf_ct_tcp_flags)))) 1217 NLA_ALIGN(NLA_HDRLEN + sizeof(struct nf_ct_tcp_flags)))
1218 1218
1219static int nlattr_to_tcp(struct nlattr *cda[], struct nf_conn *ct) 1219static int nlattr_to_tcp(struct nlattr *cda[], struct nf_conn *ct)
1220{ 1220{
diff --git a/net/netfilter/nft_osf.c b/net/netfilter/nft_osf.c
index 5af74b37f423..a35fb59ace73 100644
--- a/net/netfilter/nft_osf.c
+++ b/net/netfilter/nft_osf.c
@@ -49,7 +49,7 @@ static int nft_osf_init(const struct nft_ctx *ctx,
49 49
50 priv->dreg = nft_parse_register(tb[NFTA_OSF_DREG]); 50 priv->dreg = nft_parse_register(tb[NFTA_OSF_DREG]);
51 err = nft_validate_register_store(ctx, priv->dreg, NULL, 51 err = nft_validate_register_store(ctx, priv->dreg, NULL,
52 NFTA_DATA_VALUE, NFT_OSF_MAXGENRELEN); 52 NFT_DATA_VALUE, NFT_OSF_MAXGENRELEN);
53 if (err < 0) 53 if (err < 0)
54 return err; 54 return err;
55 55
diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c
index 55e2d9215c0d..0e5ec126f6ad 100644
--- a/net/netfilter/nft_set_rbtree.c
+++ b/net/netfilter/nft_set_rbtree.c
@@ -355,12 +355,11 @@ cont:
355 355
356static void nft_rbtree_gc(struct work_struct *work) 356static void nft_rbtree_gc(struct work_struct *work)
357{ 357{
358 struct nft_rbtree_elem *rbe, *rbe_end = NULL, *rbe_prev = NULL;
358 struct nft_set_gc_batch *gcb = NULL; 359 struct nft_set_gc_batch *gcb = NULL;
359 struct rb_node *node, *prev = NULL;
360 struct nft_rbtree_elem *rbe;
361 struct nft_rbtree *priv; 360 struct nft_rbtree *priv;
361 struct rb_node *node;
362 struct nft_set *set; 362 struct nft_set *set;
363 int i;
364 363
365 priv = container_of(work, struct nft_rbtree, gc_work.work); 364 priv = container_of(work, struct nft_rbtree, gc_work.work);
366 set = nft_set_container_of(priv); 365 set = nft_set_container_of(priv);
@@ -371,7 +370,7 @@ static void nft_rbtree_gc(struct work_struct *work)
371 rbe = rb_entry(node, struct nft_rbtree_elem, node); 370 rbe = rb_entry(node, struct nft_rbtree_elem, node);
372 371
373 if (nft_rbtree_interval_end(rbe)) { 372 if (nft_rbtree_interval_end(rbe)) {
374 prev = node; 373 rbe_end = rbe;
375 continue; 374 continue;
376 } 375 }
377 if (!nft_set_elem_expired(&rbe->ext)) 376 if (!nft_set_elem_expired(&rbe->ext))
@@ -379,29 +378,30 @@ static void nft_rbtree_gc(struct work_struct *work)
379 if (nft_set_elem_mark_busy(&rbe->ext)) 378 if (nft_set_elem_mark_busy(&rbe->ext))
380 continue; 379 continue;
381 380
381 if (rbe_prev) {
382 rb_erase(&rbe_prev->node, &priv->root);
383 rbe_prev = NULL;
384 }
382 gcb = nft_set_gc_batch_check(set, gcb, GFP_ATOMIC); 385 gcb = nft_set_gc_batch_check(set, gcb, GFP_ATOMIC);
383 if (!gcb) 386 if (!gcb)
384 break; 387 break;
385 388
386 atomic_dec(&set->nelems); 389 atomic_dec(&set->nelems);
387 nft_set_gc_batch_add(gcb, rbe); 390 nft_set_gc_batch_add(gcb, rbe);
391 rbe_prev = rbe;
388 392
389 if (prev) { 393 if (rbe_end) {
390 rbe = rb_entry(prev, struct nft_rbtree_elem, node);
391 atomic_dec(&set->nelems); 394 atomic_dec(&set->nelems);
392 nft_set_gc_batch_add(gcb, rbe); 395 nft_set_gc_batch_add(gcb, rbe_end);
393 prev = NULL; 396 rb_erase(&rbe_end->node, &priv->root);
397 rbe_end = NULL;
394 } 398 }
395 node = rb_next(node); 399 node = rb_next(node);
396 if (!node) 400 if (!node)
397 break; 401 break;
398 } 402 }
399 if (gcb) { 403 if (rbe_prev)
400 for (i = 0; i < gcb->head.cnt; i++) { 404 rb_erase(&rbe_prev->node, &priv->root);
401 rbe = gcb->elems[i];
402 rb_erase(&rbe->node, &priv->root);
403 }
404 }
405 write_seqcount_end(&priv->count); 405 write_seqcount_end(&priv->count);
406 write_unlock_bh(&priv->lock); 406 write_unlock_bh(&priv->lock);
407 407
diff --git a/net/netfilter/xt_socket.c b/net/netfilter/xt_socket.c
index 0472f3472842..ada144e5645b 100644
--- a/net/netfilter/xt_socket.c
+++ b/net/netfilter/xt_socket.c
@@ -56,7 +56,7 @@ socket_match(const struct sk_buff *skb, struct xt_action_param *par,
56 struct sk_buff *pskb = (struct sk_buff *)skb; 56 struct sk_buff *pskb = (struct sk_buff *)skb;
57 struct sock *sk = skb->sk; 57 struct sock *sk = skb->sk;
58 58
59 if (!net_eq(xt_net(par), sock_net(sk))) 59 if (sk && !net_eq(xt_net(par), sock_net(sk)))
60 sk = NULL; 60 sk = NULL;
61 61
62 if (!sk) 62 if (!sk)
@@ -117,7 +117,7 @@ socket_mt6_v1_v2_v3(const struct sk_buff *skb, struct xt_action_param *par)
117 struct sk_buff *pskb = (struct sk_buff *)skb; 117 struct sk_buff *pskb = (struct sk_buff *)skb;
118 struct sock *sk = skb->sk; 118 struct sock *sk = skb->sk;
119 119
120 if (!net_eq(xt_net(par), sock_net(sk))) 120 if (sk && !net_eq(xt_net(par), sock_net(sk)))
121 sk = NULL; 121 sk = NULL;
122 122
123 if (!sk) 123 if (!sk)