xref: /linux/net/netfilter/nf_tables_api.c (revision bfc64d9b7e8cac82be6b8629865e137d962578f8)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2007-2009 Patrick McHardy <kaber@trash.net>
4  *
5  * Development of this code funded by Astaro AG (http://www.astaro.com/)
6  */
7 
8 #include <linux/module.h>
9 #include <linux/init.h>
10 #include <linux/list.h>
11 #include <linux/skbuff.h>
12 #include <linux/netlink.h>
13 #include <linux/vmalloc.h>
14 #include <linux/rhashtable.h>
15 #include <linux/audit.h>
16 #include <linux/netfilter.h>
17 #include <linux/netfilter/nfnetlink.h>
18 #include <linux/netfilter/nf_tables.h>
19 #include <net/netfilter/nf_flow_table.h>
20 #include <net/netfilter/nf_tables_core.h>
21 #include <net/netfilter/nf_tables.h>
22 #include <net/netfilter/nf_tables_offload.h>
23 #include <net/net_namespace.h>
24 #include <net/sock.h>
25 
26 #define NFT_MODULE_AUTOLOAD_LIMIT (MODULE_NAME_LEN - sizeof("nft-expr-255-"))
27 #define NFT_SET_MAX_ANONLEN 16
28 
29 unsigned int nf_tables_net_id __read_mostly;
30 
31 static LIST_HEAD(nf_tables_expressions);
32 static LIST_HEAD(nf_tables_objects);
33 static LIST_HEAD(nf_tables_flowtables);
34 static LIST_HEAD(nf_tables_destroy_list);
35 static LIST_HEAD(nf_tables_gc_list);
36 static DEFINE_SPINLOCK(nf_tables_destroy_list_lock);
37 static DEFINE_SPINLOCK(nf_tables_gc_list_lock);
38 
39 enum {
40 	NFT_VALIDATE_SKIP	= 0,
41 	NFT_VALIDATE_NEED,
42 	NFT_VALIDATE_DO,
43 };
44 
45 static struct rhltable nft_objname_ht;
46 
47 static u32 nft_chain_hash(const void *data, u32 len, u32 seed);
48 static u32 nft_chain_hash_obj(const void *data, u32 len, u32 seed);
49 static int nft_chain_hash_cmp(struct rhashtable_compare_arg *, const void *);
50 
51 static u32 nft_objname_hash(const void *data, u32 len, u32 seed);
52 static u32 nft_objname_hash_obj(const void *data, u32 len, u32 seed);
53 static int nft_objname_hash_cmp(struct rhashtable_compare_arg *, const void *);
54 
55 static const struct rhashtable_params nft_chain_ht_params = {
56 	.head_offset		= offsetof(struct nft_chain, rhlhead),
57 	.key_offset		= offsetof(struct nft_chain, name),
58 	.hashfn			= nft_chain_hash,
59 	.obj_hashfn		= nft_chain_hash_obj,
60 	.obj_cmpfn		= nft_chain_hash_cmp,
61 	.automatic_shrinking	= true,
62 };
63 
64 static const struct rhashtable_params nft_objname_ht_params = {
65 	.head_offset		= offsetof(struct nft_object, rhlhead),
66 	.key_offset		= offsetof(struct nft_object, key),
67 	.hashfn			= nft_objname_hash,
68 	.obj_hashfn		= nft_objname_hash_obj,
69 	.obj_cmpfn		= nft_objname_hash_cmp,
70 	.automatic_shrinking	= true,
71 };
72 
73 struct nft_audit_data {
74 	struct nft_table *table;
75 	int entries;
76 	int op;
77 	struct list_head list;
78 };
79 
80 static const u8 nft2audit_op[NFT_MSG_MAX] = { // enum nf_tables_msg_types
81 	[NFT_MSG_NEWTABLE]	= AUDIT_NFT_OP_TABLE_REGISTER,
82 	[NFT_MSG_GETTABLE]	= AUDIT_NFT_OP_INVALID,
83 	[NFT_MSG_DELTABLE]	= AUDIT_NFT_OP_TABLE_UNREGISTER,
84 	[NFT_MSG_NEWCHAIN]	= AUDIT_NFT_OP_CHAIN_REGISTER,
85 	[NFT_MSG_GETCHAIN]	= AUDIT_NFT_OP_INVALID,
86 	[NFT_MSG_DELCHAIN]	= AUDIT_NFT_OP_CHAIN_UNREGISTER,
87 	[NFT_MSG_NEWRULE]	= AUDIT_NFT_OP_RULE_REGISTER,
88 	[NFT_MSG_GETRULE]	= AUDIT_NFT_OP_INVALID,
89 	[NFT_MSG_DELRULE]	= AUDIT_NFT_OP_RULE_UNREGISTER,
90 	[NFT_MSG_NEWSET]	= AUDIT_NFT_OP_SET_REGISTER,
91 	[NFT_MSG_GETSET]	= AUDIT_NFT_OP_INVALID,
92 	[NFT_MSG_DELSET]	= AUDIT_NFT_OP_SET_UNREGISTER,
93 	[NFT_MSG_NEWSETELEM]	= AUDIT_NFT_OP_SETELEM_REGISTER,
94 	[NFT_MSG_GETSETELEM]	= AUDIT_NFT_OP_INVALID,
95 	[NFT_MSG_DELSETELEM]	= AUDIT_NFT_OP_SETELEM_UNREGISTER,
96 	[NFT_MSG_NEWGEN]	= AUDIT_NFT_OP_GEN_REGISTER,
97 	[NFT_MSG_GETGEN]	= AUDIT_NFT_OP_INVALID,
98 	[NFT_MSG_TRACE]		= AUDIT_NFT_OP_INVALID,
99 	[NFT_MSG_NEWOBJ]	= AUDIT_NFT_OP_OBJ_REGISTER,
100 	[NFT_MSG_GETOBJ]	= AUDIT_NFT_OP_INVALID,
101 	[NFT_MSG_DELOBJ]	= AUDIT_NFT_OP_OBJ_UNREGISTER,
102 	[NFT_MSG_GETOBJ_RESET]	= AUDIT_NFT_OP_OBJ_RESET,
103 	[NFT_MSG_NEWFLOWTABLE]	= AUDIT_NFT_OP_FLOWTABLE_REGISTER,
104 	[NFT_MSG_GETFLOWTABLE]	= AUDIT_NFT_OP_INVALID,
105 	[NFT_MSG_DELFLOWTABLE]	= AUDIT_NFT_OP_FLOWTABLE_UNREGISTER,
106 	[NFT_MSG_GETSETELEM_RESET] = AUDIT_NFT_OP_SETELEM_RESET,
107 };
108 
nft_validate_state_update(struct nft_table * table,u8 new_validate_state)109 static void nft_validate_state_update(struct nft_table *table, u8 new_validate_state)
110 {
111 	switch (table->validate_state) {
112 	case NFT_VALIDATE_SKIP:
113 		WARN_ON_ONCE(new_validate_state == NFT_VALIDATE_DO);
114 		break;
115 	case NFT_VALIDATE_NEED:
116 		break;
117 	case NFT_VALIDATE_DO:
118 		if (new_validate_state == NFT_VALIDATE_NEED)
119 			return;
120 	}
121 
122 	table->validate_state = new_validate_state;
123 }
124 static void nf_tables_trans_destroy_work(struct work_struct *w);
125 static DECLARE_WORK(trans_destroy_work, nf_tables_trans_destroy_work);
126 
127 static void nft_trans_gc_work(struct work_struct *work);
128 static DECLARE_WORK(trans_gc_work, nft_trans_gc_work);
129 
nft_ctx_init(struct nft_ctx * ctx,struct net * net,const struct sk_buff * skb,const struct nlmsghdr * nlh,u8 family,struct nft_table * table,struct nft_chain * chain,const struct nlattr * const * nla)130 static void nft_ctx_init(struct nft_ctx *ctx,
131 			 struct net *net,
132 			 const struct sk_buff *skb,
133 			 const struct nlmsghdr *nlh,
134 			 u8 family,
135 			 struct nft_table *table,
136 			 struct nft_chain *chain,
137 			 const struct nlattr * const *nla)
138 {
139 	ctx->net	= net;
140 	ctx->family	= family;
141 	ctx->level	= 0;
142 	ctx->table	= table;
143 	ctx->chain	= chain;
144 	ctx->nla   	= nla;
145 	ctx->portid	= NETLINK_CB(skb).portid;
146 	ctx->report	= nlmsg_report(nlh);
147 	ctx->flags	= nlh->nlmsg_flags;
148 	ctx->seq	= nlh->nlmsg_seq;
149 
150 	bitmap_zero(ctx->reg_inited, NFT_REG32_NUM);
151 }
152 
nft_trans_alloc_gfp(const struct nft_ctx * ctx,int msg_type,u32 size,gfp_t gfp)153 static struct nft_trans *nft_trans_alloc_gfp(const struct nft_ctx *ctx,
154 					     int msg_type, u32 size, gfp_t gfp)
155 {
156 	struct nft_trans *trans;
157 
158 	trans = kzalloc(size, gfp);
159 	if (trans == NULL)
160 		return NULL;
161 
162 	INIT_LIST_HEAD(&trans->list);
163 	trans->msg_type = msg_type;
164 
165 	trans->net = ctx->net;
166 	trans->table = ctx->table;
167 	trans->seq = ctx->seq;
168 	trans->flags = ctx->flags;
169 	trans->report = ctx->report;
170 
171 	return trans;
172 }
173 
nft_trans_alloc(const struct nft_ctx * ctx,int msg_type,u32 size)174 static struct nft_trans *nft_trans_alloc(const struct nft_ctx *ctx,
175 					 int msg_type, u32 size)
176 {
177 	return nft_trans_alloc_gfp(ctx, msg_type, size, GFP_KERNEL);
178 }
179 
nft_trans_get_binding(struct nft_trans * trans)180 static struct nft_trans_binding *nft_trans_get_binding(struct nft_trans *trans)
181 {
182 	switch (trans->msg_type) {
183 	case NFT_MSG_NEWCHAIN:
184 	case NFT_MSG_NEWSET:
185 		return container_of(trans, struct nft_trans_binding, nft_trans);
186 	}
187 
188 	return NULL;
189 }
190 
nft_trans_list_del(struct nft_trans * trans)191 static void nft_trans_list_del(struct nft_trans *trans)
192 {
193 	struct nft_trans_binding *trans_binding;
194 
195 	list_del(&trans->list);
196 
197 	trans_binding = nft_trans_get_binding(trans);
198 	if (trans_binding)
199 		list_del(&trans_binding->binding_list);
200 }
201 
nft_trans_destroy(struct nft_trans * trans)202 static void nft_trans_destroy(struct nft_trans *trans)
203 {
204 	nft_trans_list_del(trans);
205 	kfree(trans);
206 }
207 
__nft_set_trans_bind(const struct nft_ctx * ctx,struct nft_set * set,bool bind)208 static void __nft_set_trans_bind(const struct nft_ctx *ctx, struct nft_set *set,
209 				 bool bind)
210 {
211 	struct nftables_pernet *nft_net;
212 	struct net *net = ctx->net;
213 	struct nft_trans *trans;
214 
215 	if (!nft_set_is_anonymous(set))
216 		return;
217 
218 	nft_net = nft_pernet(net);
219 	list_for_each_entry_reverse(trans, &nft_net->commit_list, list) {
220 		switch (trans->msg_type) {
221 		case NFT_MSG_NEWSET:
222 			if (nft_trans_set(trans) == set)
223 				nft_trans_set_bound(trans) = bind;
224 			break;
225 		case NFT_MSG_NEWSETELEM:
226 			if (nft_trans_elem_set(trans) == set)
227 				nft_trans_elem_set_bound(trans) = bind;
228 			break;
229 		}
230 	}
231 }
232 
nft_set_trans_bind(const struct nft_ctx * ctx,struct nft_set * set)233 static void nft_set_trans_bind(const struct nft_ctx *ctx, struct nft_set *set)
234 {
235 	return __nft_set_trans_bind(ctx, set, true);
236 }
237 
nft_set_trans_unbind(const struct nft_ctx * ctx,struct nft_set * set)238 static void nft_set_trans_unbind(const struct nft_ctx *ctx, struct nft_set *set)
239 {
240 	return __nft_set_trans_bind(ctx, set, false);
241 }
242 
__nft_chain_trans_bind(const struct nft_ctx * ctx,struct nft_chain * chain,bool bind)243 static void __nft_chain_trans_bind(const struct nft_ctx *ctx,
244 				   struct nft_chain *chain, bool bind)
245 {
246 	struct nftables_pernet *nft_net;
247 	struct net *net = ctx->net;
248 	struct nft_trans *trans;
249 
250 	if (!nft_chain_binding(chain))
251 		return;
252 
253 	nft_net = nft_pernet(net);
254 	list_for_each_entry_reverse(trans, &nft_net->commit_list, list) {
255 		switch (trans->msg_type) {
256 		case NFT_MSG_NEWCHAIN:
257 			if (nft_trans_chain(trans) == chain)
258 				nft_trans_chain_bound(trans) = bind;
259 			break;
260 		case NFT_MSG_NEWRULE:
261 			if (nft_trans_rule_chain(trans) == chain)
262 				nft_trans_rule_bound(trans) = bind;
263 			break;
264 		}
265 	}
266 }
267 
nft_chain_trans_bind(const struct nft_ctx * ctx,struct nft_chain * chain)268 static void nft_chain_trans_bind(const struct nft_ctx *ctx,
269 				 struct nft_chain *chain)
270 {
271 	__nft_chain_trans_bind(ctx, chain, true);
272 }
273 
nf_tables_bind_chain(const struct nft_ctx * ctx,struct nft_chain * chain)274 int nf_tables_bind_chain(const struct nft_ctx *ctx, struct nft_chain *chain)
275 {
276 	if (!nft_chain_binding(chain))
277 		return 0;
278 
279 	if (nft_chain_binding(ctx->chain))
280 		return -EOPNOTSUPP;
281 
282 	if (chain->bound)
283 		return -EBUSY;
284 
285 	if (!nft_use_inc(&chain->use))
286 		return -EMFILE;
287 
288 	chain->bound = true;
289 	nft_chain_trans_bind(ctx, chain);
290 
291 	return 0;
292 }
293 
nf_tables_unbind_chain(const struct nft_ctx * ctx,struct nft_chain * chain)294 void nf_tables_unbind_chain(const struct nft_ctx *ctx, struct nft_chain *chain)
295 {
296 	__nft_chain_trans_bind(ctx, chain, false);
297 }
298 
nft_netdev_register_hooks(struct net * net,struct list_head * hook_list)299 static int nft_netdev_register_hooks(struct net *net,
300 				     struct list_head *hook_list)
301 {
302 	struct nft_hook *hook;
303 	int err, j;
304 
305 	j = 0;
306 	list_for_each_entry(hook, hook_list, list) {
307 		err = nf_register_net_hook(net, &hook->ops);
308 		if (err < 0)
309 			goto err_register;
310 
311 		j++;
312 	}
313 	return 0;
314 
315 err_register:
316 	list_for_each_entry(hook, hook_list, list) {
317 		if (j-- <= 0)
318 			break;
319 
320 		nf_unregister_net_hook(net, &hook->ops);
321 	}
322 	return err;
323 }
324 
nft_netdev_unregister_hooks(struct net * net,struct list_head * hook_list,bool release_netdev)325 static void nft_netdev_unregister_hooks(struct net *net,
326 					struct list_head *hook_list,
327 					bool release_netdev)
328 {
329 	struct nft_hook *hook, *next;
330 
331 	list_for_each_entry_safe(hook, next, hook_list, list) {
332 		nf_unregister_net_hook(net, &hook->ops);
333 		if (release_netdev) {
334 			list_del(&hook->list);
335 			kfree_rcu(hook, rcu);
336 		}
337 	}
338 }
339 
nf_tables_register_hook(struct net * net,const struct nft_table * table,struct nft_chain * chain)340 static int nf_tables_register_hook(struct net *net,
341 				   const struct nft_table *table,
342 				   struct nft_chain *chain)
343 {
344 	struct nft_base_chain *basechain;
345 	const struct nf_hook_ops *ops;
346 
347 	if (table->flags & NFT_TABLE_F_DORMANT ||
348 	    !nft_is_base_chain(chain))
349 		return 0;
350 
351 	basechain = nft_base_chain(chain);
352 	ops = &basechain->ops;
353 
354 	if (basechain->type->ops_register)
355 		return basechain->type->ops_register(net, ops);
356 
357 	if (nft_base_chain_netdev(table->family, basechain->ops.hooknum))
358 		return nft_netdev_register_hooks(net, &basechain->hook_list);
359 
360 	return nf_register_net_hook(net, &basechain->ops);
361 }
362 
__nf_tables_unregister_hook(struct net * net,const struct nft_table * table,struct nft_chain * chain,bool release_netdev)363 static void __nf_tables_unregister_hook(struct net *net,
364 					const struct nft_table *table,
365 					struct nft_chain *chain,
366 					bool release_netdev)
367 {
368 	struct nft_base_chain *basechain;
369 	const struct nf_hook_ops *ops;
370 
371 	if (table->flags & NFT_TABLE_F_DORMANT ||
372 	    !nft_is_base_chain(chain))
373 		return;
374 	basechain = nft_base_chain(chain);
375 	ops = &basechain->ops;
376 
377 	if (basechain->type->ops_unregister)
378 		return basechain->type->ops_unregister(net, ops);
379 
380 	if (nft_base_chain_netdev(table->family, basechain->ops.hooknum))
381 		nft_netdev_unregister_hooks(net, &basechain->hook_list,
382 					    release_netdev);
383 	else
384 		nf_unregister_net_hook(net, &basechain->ops);
385 }
386 
nf_tables_unregister_hook(struct net * net,const struct nft_table * table,struct nft_chain * chain)387 static void nf_tables_unregister_hook(struct net *net,
388 				      const struct nft_table *table,
389 				      struct nft_chain *chain)
390 {
391 	return __nf_tables_unregister_hook(net, table, chain, false);
392 }
393 
nft_trans_commit_list_add_tail(struct net * net,struct nft_trans * trans)394 static void nft_trans_commit_list_add_tail(struct net *net, struct nft_trans *trans)
395 {
396 	struct nftables_pernet *nft_net = nft_pernet(net);
397 	struct nft_trans_binding *binding;
398 	struct nft_trans_set *trans_set;
399 
400 	list_add_tail(&trans->list, &nft_net->commit_list);
401 
402 	binding = nft_trans_get_binding(trans);
403 	if (!binding)
404 		return;
405 
406 	switch (trans->msg_type) {
407 	case NFT_MSG_NEWSET:
408 		trans_set = nft_trans_container_set(trans);
409 
410 		if (!nft_trans_set_update(trans) &&
411 		    nft_set_is_anonymous(nft_trans_set(trans)))
412 			list_add_tail(&binding->binding_list, &nft_net->binding_list);
413 
414 		list_add_tail(&trans_set->list_trans_newset, &nft_net->commit_set_list);
415 		break;
416 	case NFT_MSG_NEWCHAIN:
417 		if (!nft_trans_chain_update(trans) &&
418 		    nft_chain_binding(nft_trans_chain(trans)))
419 			list_add_tail(&binding->binding_list, &nft_net->binding_list);
420 		break;
421 	}
422 }
423 
nft_trans_table_add(struct nft_ctx * ctx,int msg_type)424 static int nft_trans_table_add(struct nft_ctx *ctx, int msg_type)
425 {
426 	struct nft_trans *trans;
427 
428 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_table));
429 	if (trans == NULL)
430 		return -ENOMEM;
431 
432 	if (msg_type == NFT_MSG_NEWTABLE)
433 		nft_activate_next(ctx->net, ctx->table);
434 
435 	nft_trans_commit_list_add_tail(ctx->net, trans);
436 	return 0;
437 }
438 
nft_deltable(struct nft_ctx * ctx)439 static int nft_deltable(struct nft_ctx *ctx)
440 {
441 	int err;
442 
443 	err = nft_trans_table_add(ctx, NFT_MSG_DELTABLE);
444 	if (err < 0)
445 		return err;
446 
447 	nft_deactivate_next(ctx->net, ctx->table);
448 	return err;
449 }
450 
451 static struct nft_trans *
nft_trans_alloc_chain(const struct nft_ctx * ctx,int msg_type)452 nft_trans_alloc_chain(const struct nft_ctx *ctx, int msg_type)
453 {
454 	struct nft_trans_chain *trans_chain;
455 	struct nft_trans *trans;
456 
457 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_chain));
458 	if (!trans)
459 		return NULL;
460 
461 	trans_chain = nft_trans_container_chain(trans);
462 	INIT_LIST_HEAD(&trans_chain->nft_trans_binding.binding_list);
463 	trans_chain->chain = ctx->chain;
464 
465 	return trans;
466 }
467 
nft_trans_chain_add(struct nft_ctx * ctx,int msg_type)468 static struct nft_trans *nft_trans_chain_add(struct nft_ctx *ctx, int msg_type)
469 {
470 	struct nft_trans *trans;
471 
472 	trans = nft_trans_alloc_chain(ctx, msg_type);
473 	if (trans == NULL)
474 		return ERR_PTR(-ENOMEM);
475 
476 	if (msg_type == NFT_MSG_NEWCHAIN) {
477 		nft_activate_next(ctx->net, ctx->chain);
478 
479 		if (ctx->nla[NFTA_CHAIN_ID]) {
480 			nft_trans_chain_id(trans) =
481 				ntohl(nla_get_be32(ctx->nla[NFTA_CHAIN_ID]));
482 		}
483 	}
484 	nft_trans_commit_list_add_tail(ctx->net, trans);
485 
486 	return trans;
487 }
488 
nft_delchain(struct nft_ctx * ctx)489 static int nft_delchain(struct nft_ctx *ctx)
490 {
491 	struct nft_trans *trans;
492 
493 	trans = nft_trans_chain_add(ctx, NFT_MSG_DELCHAIN);
494 	if (IS_ERR(trans))
495 		return PTR_ERR(trans);
496 
497 	nft_use_dec(&ctx->table->use);
498 	nft_deactivate_next(ctx->net, ctx->chain);
499 
500 	return 0;
501 }
502 
nft_rule_expr_activate(const struct nft_ctx * ctx,struct nft_rule * rule)503 void nft_rule_expr_activate(const struct nft_ctx *ctx, struct nft_rule *rule)
504 {
505 	struct nft_expr *expr;
506 
507 	expr = nft_expr_first(rule);
508 	while (nft_expr_more(rule, expr)) {
509 		if (expr->ops->activate)
510 			expr->ops->activate(ctx, expr);
511 
512 		expr = nft_expr_next(expr);
513 	}
514 }
515 
nft_rule_expr_deactivate(const struct nft_ctx * ctx,struct nft_rule * rule,enum nft_trans_phase phase)516 void nft_rule_expr_deactivate(const struct nft_ctx *ctx, struct nft_rule *rule,
517 			      enum nft_trans_phase phase)
518 {
519 	struct nft_expr *expr;
520 
521 	expr = nft_expr_first(rule);
522 	while (nft_expr_more(rule, expr)) {
523 		if (expr->ops->deactivate)
524 			expr->ops->deactivate(ctx, expr, phase);
525 
526 		expr = nft_expr_next(expr);
527 	}
528 }
529 
530 static int
nf_tables_delrule_deactivate(struct nft_ctx * ctx,struct nft_rule * rule)531 nf_tables_delrule_deactivate(struct nft_ctx *ctx, struct nft_rule *rule)
532 {
533 	/* You cannot delete the same rule twice */
534 	if (nft_is_active_next(ctx->net, rule)) {
535 		nft_deactivate_next(ctx->net, rule);
536 		nft_use_dec(&ctx->chain->use);
537 		return 0;
538 	}
539 	return -ENOENT;
540 }
541 
nft_trans_rule_add(struct nft_ctx * ctx,int msg_type,struct nft_rule * rule)542 static struct nft_trans *nft_trans_rule_add(struct nft_ctx *ctx, int msg_type,
543 					    struct nft_rule *rule)
544 {
545 	struct nft_trans *trans;
546 
547 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_rule));
548 	if (trans == NULL)
549 		return NULL;
550 
551 	if (msg_type == NFT_MSG_NEWRULE && ctx->nla[NFTA_RULE_ID] != NULL) {
552 		nft_trans_rule_id(trans) =
553 			ntohl(nla_get_be32(ctx->nla[NFTA_RULE_ID]));
554 	}
555 	nft_trans_rule(trans) = rule;
556 	nft_trans_rule_chain(trans) = ctx->chain;
557 	nft_trans_commit_list_add_tail(ctx->net, trans);
558 
559 	return trans;
560 }
561 
nft_delrule(struct nft_ctx * ctx,struct nft_rule * rule)562 static int nft_delrule(struct nft_ctx *ctx, struct nft_rule *rule)
563 {
564 	struct nft_flow_rule *flow;
565 	struct nft_trans *trans;
566 	int err;
567 
568 	trans = nft_trans_rule_add(ctx, NFT_MSG_DELRULE, rule);
569 	if (trans == NULL)
570 		return -ENOMEM;
571 
572 	if (ctx->chain->flags & NFT_CHAIN_HW_OFFLOAD) {
573 		flow = nft_flow_rule_create(ctx->net, rule);
574 		if (IS_ERR(flow)) {
575 			nft_trans_destroy(trans);
576 			return PTR_ERR(flow);
577 		}
578 
579 		nft_trans_flow_rule(trans) = flow;
580 	}
581 
582 	err = nf_tables_delrule_deactivate(ctx, rule);
583 	if (err < 0) {
584 		nft_trans_destroy(trans);
585 		return err;
586 	}
587 	nft_rule_expr_deactivate(ctx, rule, NFT_TRANS_PREPARE);
588 
589 	return 0;
590 }
591 
nft_delrule_by_chain(struct nft_ctx * ctx)592 static int nft_delrule_by_chain(struct nft_ctx *ctx)
593 {
594 	struct nft_rule *rule;
595 	int err;
596 
597 	list_for_each_entry(rule, &ctx->chain->rules, list) {
598 		if (!nft_is_active_next(ctx->net, rule))
599 			continue;
600 
601 		err = nft_delrule(ctx, rule);
602 		if (err < 0)
603 			return err;
604 	}
605 	return 0;
606 }
607 
__nft_trans_set_add(const struct nft_ctx * ctx,int msg_type,struct nft_set * set,const struct nft_set_desc * desc)608 static int __nft_trans_set_add(const struct nft_ctx *ctx, int msg_type,
609 			       struct nft_set *set,
610 			       const struct nft_set_desc *desc)
611 {
612 	struct nft_trans_set *trans_set;
613 	struct nft_trans *trans;
614 
615 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_set));
616 	if (trans == NULL)
617 		return -ENOMEM;
618 
619 	trans_set = nft_trans_container_set(trans);
620 	INIT_LIST_HEAD(&trans_set->nft_trans_binding.binding_list);
621 	INIT_LIST_HEAD(&trans_set->list_trans_newset);
622 
623 	if (msg_type == NFT_MSG_NEWSET && ctx->nla[NFTA_SET_ID] && !desc) {
624 		nft_trans_set_id(trans) =
625 			ntohl(nla_get_be32(ctx->nla[NFTA_SET_ID]));
626 		nft_activate_next(ctx->net, set);
627 	}
628 	nft_trans_set(trans) = set;
629 	if (desc) {
630 		nft_trans_set_update(trans) = true;
631 		nft_trans_set_gc_int(trans) = desc->gc_int;
632 		nft_trans_set_timeout(trans) = desc->timeout;
633 		nft_trans_set_size(trans) = desc->size;
634 	}
635 	nft_trans_commit_list_add_tail(ctx->net, trans);
636 
637 	return 0;
638 }
639 
nft_trans_set_add(const struct nft_ctx * ctx,int msg_type,struct nft_set * set)640 static int nft_trans_set_add(const struct nft_ctx *ctx, int msg_type,
641 			     struct nft_set *set)
642 {
643 	return __nft_trans_set_add(ctx, msg_type, set, NULL);
644 }
645 
nft_mapelem_deactivate(const struct nft_ctx * ctx,struct nft_set * set,const struct nft_set_iter * iter,struct nft_elem_priv * elem_priv)646 static int nft_mapelem_deactivate(const struct nft_ctx *ctx,
647 				  struct nft_set *set,
648 				  const struct nft_set_iter *iter,
649 				  struct nft_elem_priv *elem_priv)
650 {
651 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
652 
653 	if (!nft_set_elem_active(ext, iter->genmask))
654 		return 0;
655 
656 	nft_set_elem_change_active(ctx->net, set, ext);
657 	nft_setelem_data_deactivate(ctx->net, set, elem_priv);
658 
659 	return 0;
660 }
661 
662 struct nft_set_elem_catchall {
663 	struct list_head	list;
664 	struct rcu_head		rcu;
665 	struct nft_elem_priv	*elem;
666 };
667 
nft_map_catchall_deactivate(const struct nft_ctx * ctx,struct nft_set * set)668 static void nft_map_catchall_deactivate(const struct nft_ctx *ctx,
669 					struct nft_set *set)
670 {
671 	u8 genmask = nft_genmask_next(ctx->net);
672 	struct nft_set_elem_catchall *catchall;
673 	struct nft_set_ext *ext;
674 
675 	list_for_each_entry(catchall, &set->catchall_list, list) {
676 		ext = nft_set_elem_ext(set, catchall->elem);
677 		if (!nft_set_elem_active(ext, genmask))
678 			continue;
679 
680 		nft_set_elem_change_active(ctx->net, set, ext);
681 		nft_setelem_data_deactivate(ctx->net, set, catchall->elem);
682 		break;
683 	}
684 }
685 
nft_map_deactivate(const struct nft_ctx * ctx,struct nft_set * set)686 static void nft_map_deactivate(const struct nft_ctx *ctx, struct nft_set *set)
687 {
688 	struct nft_set_iter iter = {
689 		.genmask	= nft_genmask_next(ctx->net),
690 		.type		= NFT_ITER_UPDATE,
691 		.fn		= nft_mapelem_deactivate,
692 	};
693 
694 	set->ops->walk(ctx, set, &iter);
695 	WARN_ON_ONCE(iter.err);
696 
697 	nft_map_catchall_deactivate(ctx, set);
698 }
699 
nft_delset(const struct nft_ctx * ctx,struct nft_set * set)700 static int nft_delset(const struct nft_ctx *ctx, struct nft_set *set)
701 {
702 	int err;
703 
704 	err = nft_trans_set_add(ctx, NFT_MSG_DELSET, set);
705 	if (err < 0)
706 		return err;
707 
708 	if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
709 		nft_map_deactivate(ctx, set);
710 
711 	nft_deactivate_next(ctx->net, set);
712 	nft_use_dec(&ctx->table->use);
713 
714 	return err;
715 }
716 
nft_trans_obj_add(struct nft_ctx * ctx,int msg_type,struct nft_object * obj)717 static int nft_trans_obj_add(struct nft_ctx *ctx, int msg_type,
718 			     struct nft_object *obj)
719 {
720 	struct nft_trans *trans;
721 
722 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_obj));
723 	if (trans == NULL)
724 		return -ENOMEM;
725 
726 	if (msg_type == NFT_MSG_NEWOBJ)
727 		nft_activate_next(ctx->net, obj);
728 
729 	nft_trans_obj(trans) = obj;
730 	nft_trans_commit_list_add_tail(ctx->net, trans);
731 
732 	return 0;
733 }
734 
nft_delobj(struct nft_ctx * ctx,struct nft_object * obj)735 static int nft_delobj(struct nft_ctx *ctx, struct nft_object *obj)
736 {
737 	int err;
738 
739 	err = nft_trans_obj_add(ctx, NFT_MSG_DELOBJ, obj);
740 	if (err < 0)
741 		return err;
742 
743 	nft_deactivate_next(ctx->net, obj);
744 	nft_use_dec(&ctx->table->use);
745 
746 	return err;
747 }
748 
749 static struct nft_trans *
nft_trans_flowtable_add(struct nft_ctx * ctx,int msg_type,struct nft_flowtable * flowtable)750 nft_trans_flowtable_add(struct nft_ctx *ctx, int msg_type,
751 		        struct nft_flowtable *flowtable)
752 {
753 	struct nft_trans *trans;
754 
755 	trans = nft_trans_alloc(ctx, msg_type,
756 				sizeof(struct nft_trans_flowtable));
757 	if (trans == NULL)
758 		return ERR_PTR(-ENOMEM);
759 
760 	if (msg_type == NFT_MSG_NEWFLOWTABLE)
761 		nft_activate_next(ctx->net, flowtable);
762 
763 	INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans));
764 	nft_trans_flowtable(trans) = flowtable;
765 	nft_trans_commit_list_add_tail(ctx->net, trans);
766 
767 	return trans;
768 }
769 
nft_delflowtable(struct nft_ctx * ctx,struct nft_flowtable * flowtable)770 static int nft_delflowtable(struct nft_ctx *ctx,
771 			    struct nft_flowtable *flowtable)
772 {
773 	struct nft_trans *trans;
774 
775 	trans = nft_trans_flowtable_add(ctx, NFT_MSG_DELFLOWTABLE, flowtable);
776 	if (IS_ERR(trans))
777 		return PTR_ERR(trans);
778 
779 	nft_deactivate_next(ctx->net, flowtable);
780 	nft_use_dec(&ctx->table->use);
781 
782 	return 0;
783 }
784 
__nft_reg_track_clobber(struct nft_regs_track * track,u8 dreg)785 static void __nft_reg_track_clobber(struct nft_regs_track *track, u8 dreg)
786 {
787 	int i;
788 
789 	for (i = track->regs[dreg].num_reg; i > 0; i--)
790 		__nft_reg_track_cancel(track, dreg - i);
791 }
792 
__nft_reg_track_update(struct nft_regs_track * track,const struct nft_expr * expr,u8 dreg,u8 num_reg)793 static void __nft_reg_track_update(struct nft_regs_track *track,
794 				   const struct nft_expr *expr,
795 				   u8 dreg, u8 num_reg)
796 {
797 	track->regs[dreg].selector = expr;
798 	track->regs[dreg].bitwise = NULL;
799 	track->regs[dreg].num_reg = num_reg;
800 }
801 
nft_reg_track_update(struct nft_regs_track * track,const struct nft_expr * expr,u8 dreg,u8 len)802 void nft_reg_track_update(struct nft_regs_track *track,
803 			  const struct nft_expr *expr, u8 dreg, u8 len)
804 {
805 	unsigned int regcount;
806 	int i;
807 
808 	__nft_reg_track_clobber(track, dreg);
809 
810 	regcount = DIV_ROUND_UP(len, NFT_REG32_SIZE);
811 	for (i = 0; i < regcount; i++, dreg++)
812 		__nft_reg_track_update(track, expr, dreg, i);
813 }
814 EXPORT_SYMBOL_GPL(nft_reg_track_update);
815 
nft_reg_track_cancel(struct nft_regs_track * track,u8 dreg,u8 len)816 void nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg, u8 len)
817 {
818 	unsigned int regcount;
819 	int i;
820 
821 	__nft_reg_track_clobber(track, dreg);
822 
823 	regcount = DIV_ROUND_UP(len, NFT_REG32_SIZE);
824 	for (i = 0; i < regcount; i++, dreg++)
825 		__nft_reg_track_cancel(track, dreg);
826 }
827 EXPORT_SYMBOL_GPL(nft_reg_track_cancel);
828 
__nft_reg_track_cancel(struct nft_regs_track * track,u8 dreg)829 void __nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg)
830 {
831 	track->regs[dreg].selector = NULL;
832 	track->regs[dreg].bitwise = NULL;
833 	track->regs[dreg].num_reg = 0;
834 }
835 EXPORT_SYMBOL_GPL(__nft_reg_track_cancel);
836 
837 /*
838  * Tables
839  */
840 
nft_table_lookup(const struct net * net,const struct nlattr * nla,u8 family,u8 genmask,u32 nlpid)841 static struct nft_table *nft_table_lookup(const struct net *net,
842 					  const struct nlattr *nla,
843 					  u8 family, u8 genmask, u32 nlpid)
844 {
845 	struct nftables_pernet *nft_net;
846 	struct nft_table *table;
847 
848 	if (nla == NULL)
849 		return ERR_PTR(-EINVAL);
850 
851 	nft_net = nft_pernet(net);
852 	list_for_each_entry_rcu(table, &nft_net->tables, list,
853 				lockdep_is_held(&nft_net->commit_mutex)) {
854 		if (!nla_strcmp(nla, table->name) &&
855 		    table->family == family &&
856 		    nft_active_genmask(table, genmask)) {
857 			if (nft_table_has_owner(table) &&
858 			    nlpid && table->nlpid != nlpid)
859 				return ERR_PTR(-EPERM);
860 
861 			return table;
862 		}
863 	}
864 
865 	return ERR_PTR(-ENOENT);
866 }
867 
nft_table_lookup_byhandle(const struct net * net,const struct nlattr * nla,int family,u8 genmask,u32 nlpid)868 static struct nft_table *nft_table_lookup_byhandle(const struct net *net,
869 						   const struct nlattr *nla,
870 						   int family, u8 genmask, u32 nlpid)
871 {
872 	struct nftables_pernet *nft_net;
873 	struct nft_table *table;
874 
875 	nft_net = nft_pernet(net);
876 	list_for_each_entry(table, &nft_net->tables, list) {
877 		if (be64_to_cpu(nla_get_be64(nla)) == table->handle &&
878 		    table->family == family &&
879 		    nft_active_genmask(table, genmask)) {
880 			if (nft_table_has_owner(table) &&
881 			    nlpid && table->nlpid != nlpid)
882 				return ERR_PTR(-EPERM);
883 
884 			return table;
885 		}
886 	}
887 
888 	return ERR_PTR(-ENOENT);
889 }
890 
nf_tables_alloc_handle(struct nft_table * table)891 static inline u64 nf_tables_alloc_handle(struct nft_table *table)
892 {
893 	return ++table->hgenerator;
894 }
895 
896 static const struct nft_chain_type *chain_type[NFPROTO_NUMPROTO][NFT_CHAIN_T_MAX];
897 
898 static const struct nft_chain_type *
__nft_chain_type_get(u8 family,enum nft_chain_types type)899 __nft_chain_type_get(u8 family, enum nft_chain_types type)
900 {
901 	if (family >= NFPROTO_NUMPROTO ||
902 	    type >= NFT_CHAIN_T_MAX)
903 		return NULL;
904 
905 	return chain_type[family][type];
906 }
907 
908 static const struct nft_chain_type *
__nf_tables_chain_type_lookup(const struct nlattr * nla,u8 family)909 __nf_tables_chain_type_lookup(const struct nlattr *nla, u8 family)
910 {
911 	const struct nft_chain_type *type;
912 	int i;
913 
914 	for (i = 0; i < NFT_CHAIN_T_MAX; i++) {
915 		type = __nft_chain_type_get(family, i);
916 		if (!type)
917 			continue;
918 		if (!nla_strcmp(nla, type->name))
919 			return type;
920 	}
921 	return NULL;
922 }
923 
924 struct nft_module_request {
925 	struct list_head	list;
926 	char			module[MODULE_NAME_LEN];
927 	bool			done;
928 };
929 
930 #ifdef CONFIG_MODULES
nft_request_module(struct net * net,const char * fmt,...)931 __printf(2, 3) int nft_request_module(struct net *net, const char *fmt,
932 				      ...)
933 {
934 	char module_name[MODULE_NAME_LEN];
935 	struct nftables_pernet *nft_net;
936 	struct nft_module_request *req;
937 	va_list args;
938 	int ret;
939 
940 	va_start(args, fmt);
941 	ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args);
942 	va_end(args);
943 	if (ret >= MODULE_NAME_LEN)
944 		return 0;
945 
946 	nft_net = nft_pernet(net);
947 	list_for_each_entry(req, &nft_net->module_list, list) {
948 		if (!strcmp(req->module, module_name)) {
949 			if (req->done)
950 				return 0;
951 
952 			/* A request to load this module already exists. */
953 			return -EAGAIN;
954 		}
955 	}
956 
957 	req = kmalloc(sizeof(*req), GFP_KERNEL);
958 	if (!req)
959 		return -ENOMEM;
960 
961 	req->done = false;
962 	strscpy(req->module, module_name, MODULE_NAME_LEN);
963 	list_add_tail(&req->list, &nft_net->module_list);
964 
965 	return -EAGAIN;
966 }
967 EXPORT_SYMBOL_GPL(nft_request_module);
968 #endif
969 
lockdep_nfnl_nft_mutex_not_held(void)970 static void lockdep_nfnl_nft_mutex_not_held(void)
971 {
972 #ifdef CONFIG_PROVE_LOCKING
973 	if (debug_locks)
974 		WARN_ON_ONCE(lockdep_nfnl_is_held(NFNL_SUBSYS_NFTABLES));
975 #endif
976 }
977 
978 static const struct nft_chain_type *
nf_tables_chain_type_lookup(struct net * net,const struct nlattr * nla,u8 family,bool autoload)979 nf_tables_chain_type_lookup(struct net *net, const struct nlattr *nla,
980 			    u8 family, bool autoload)
981 {
982 	const struct nft_chain_type *type;
983 
984 	type = __nf_tables_chain_type_lookup(nla, family);
985 	if (type != NULL)
986 		return type;
987 
988 	lockdep_nfnl_nft_mutex_not_held();
989 #ifdef CONFIG_MODULES
990 	if (autoload) {
991 		if (nft_request_module(net, "nft-chain-%u-%.*s", family,
992 				       nla_len(nla),
993 				       (const char *)nla_data(nla)) == -EAGAIN)
994 			return ERR_PTR(-EAGAIN);
995 	}
996 #endif
997 	return ERR_PTR(-ENOENT);
998 }
999 
nft_base_seq(const struct net * net)1000 static __be16 nft_base_seq(const struct net *net)
1001 {
1002 	struct nftables_pernet *nft_net = nft_pernet(net);
1003 
1004 	return htons(nft_net->base_seq & 0xffff);
1005 }
1006 
1007 static const struct nla_policy nft_table_policy[NFTA_TABLE_MAX + 1] = {
1008 	[NFTA_TABLE_NAME]	= { .type = NLA_STRING,
1009 				    .len = NFT_TABLE_MAXNAMELEN - 1 },
1010 	[NFTA_TABLE_FLAGS]	= { .type = NLA_U32 },
1011 	[NFTA_TABLE_HANDLE]	= { .type = NLA_U64 },
1012 	[NFTA_TABLE_USERDATA]	= { .type = NLA_BINARY,
1013 				    .len = NFT_USERDATA_MAXLEN }
1014 };
1015 
nf_tables_fill_table_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq,int event,u32 flags,int family,const struct nft_table * table)1016 static int nf_tables_fill_table_info(struct sk_buff *skb, struct net *net,
1017 				     u32 portid, u32 seq, int event, u32 flags,
1018 				     int family, const struct nft_table *table)
1019 {
1020 	struct nlmsghdr *nlh;
1021 
1022 	event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
1023 	nlh = nfnl_msg_put(skb, portid, seq, event, flags, family,
1024 			   NFNETLINK_V0, nft_base_seq(net));
1025 	if (!nlh)
1026 		goto nla_put_failure;
1027 
1028 	if (nla_put_string(skb, NFTA_TABLE_NAME, table->name) ||
1029 	    nla_put_be32(skb, NFTA_TABLE_USE, htonl(table->use)) ||
1030 	    nla_put_be64(skb, NFTA_TABLE_HANDLE, cpu_to_be64(table->handle),
1031 			 NFTA_TABLE_PAD))
1032 		goto nla_put_failure;
1033 
1034 	if (event == NFT_MSG_DELTABLE) {
1035 		nlmsg_end(skb, nlh);
1036 		return 0;
1037 	}
1038 
1039 	if (nla_put_be32(skb, NFTA_TABLE_FLAGS,
1040 			 htonl(table->flags & NFT_TABLE_F_MASK)))
1041 		goto nla_put_failure;
1042 
1043 	if (nft_table_has_owner(table) &&
1044 	    nla_put_be32(skb, NFTA_TABLE_OWNER, htonl(table->nlpid)))
1045 		goto nla_put_failure;
1046 
1047 	if (table->udata) {
1048 		if (nla_put(skb, NFTA_TABLE_USERDATA, table->udlen, table->udata))
1049 			goto nla_put_failure;
1050 	}
1051 
1052 	nlmsg_end(skb, nlh);
1053 	return 0;
1054 
1055 nla_put_failure:
1056 	nlmsg_trim(skb, nlh);
1057 	return -1;
1058 }
1059 
1060 struct nftnl_skb_parms {
1061 	bool report;
1062 };
1063 #define NFT_CB(skb)	(*(struct nftnl_skb_parms*)&((skb)->cb))
1064 
nft_notify_enqueue(struct sk_buff * skb,bool report,struct list_head * notify_list)1065 static void nft_notify_enqueue(struct sk_buff *skb, bool report,
1066 			       struct list_head *notify_list)
1067 {
1068 	NFT_CB(skb).report = report;
1069 	list_add_tail(&skb->list, notify_list);
1070 }
1071 
nf_tables_table_notify(const struct nft_ctx * ctx,int event)1072 static void nf_tables_table_notify(const struct nft_ctx *ctx, int event)
1073 {
1074 	struct nftables_pernet *nft_net;
1075 	struct sk_buff *skb;
1076 	u16 flags = 0;
1077 	int err;
1078 
1079 	if (!ctx->report &&
1080 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
1081 		return;
1082 
1083 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
1084 	if (skb == NULL)
1085 		goto err;
1086 
1087 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
1088 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
1089 
1090 	err = nf_tables_fill_table_info(skb, ctx->net, ctx->portid, ctx->seq,
1091 					event, flags, ctx->family, ctx->table);
1092 	if (err < 0) {
1093 		kfree_skb(skb);
1094 		goto err;
1095 	}
1096 
1097 	nft_net = nft_pernet(ctx->net);
1098 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
1099 	return;
1100 err:
1101 	nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
1102 }
1103 
nf_tables_dump_tables(struct sk_buff * skb,struct netlink_callback * cb)1104 static int nf_tables_dump_tables(struct sk_buff *skb,
1105 				 struct netlink_callback *cb)
1106 {
1107 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
1108 	struct nftables_pernet *nft_net;
1109 	const struct nft_table *table;
1110 	unsigned int idx = 0, s_idx = cb->args[0];
1111 	struct net *net = sock_net(skb->sk);
1112 	int family = nfmsg->nfgen_family;
1113 
1114 	rcu_read_lock();
1115 	nft_net = nft_pernet(net);
1116 	cb->seq = READ_ONCE(nft_net->base_seq);
1117 
1118 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
1119 		if (family != NFPROTO_UNSPEC && family != table->family)
1120 			continue;
1121 
1122 		if (idx < s_idx)
1123 			goto cont;
1124 		if (idx > s_idx)
1125 			memset(&cb->args[1], 0,
1126 			       sizeof(cb->args) - sizeof(cb->args[0]));
1127 		if (!nft_is_active(net, table))
1128 			continue;
1129 		if (nf_tables_fill_table_info(skb, net,
1130 					      NETLINK_CB(cb->skb).portid,
1131 					      cb->nlh->nlmsg_seq,
1132 					      NFT_MSG_NEWTABLE, NLM_F_MULTI,
1133 					      table->family, table) < 0)
1134 			goto done;
1135 
1136 		nl_dump_check_consistent(cb, nlmsg_hdr(skb));
1137 cont:
1138 		idx++;
1139 	}
1140 done:
1141 	rcu_read_unlock();
1142 	cb->args[0] = idx;
1143 	return skb->len;
1144 }
1145 
nft_netlink_dump_start_rcu(struct sock * nlsk,struct sk_buff * skb,const struct nlmsghdr * nlh,struct netlink_dump_control * c)1146 static int nft_netlink_dump_start_rcu(struct sock *nlsk, struct sk_buff *skb,
1147 				      const struct nlmsghdr *nlh,
1148 				      struct netlink_dump_control *c)
1149 {
1150 	int err;
1151 
1152 	if (!try_module_get(THIS_MODULE))
1153 		return -EINVAL;
1154 
1155 	rcu_read_unlock();
1156 	err = netlink_dump_start(nlsk, skb, nlh, c);
1157 	rcu_read_lock();
1158 	module_put(THIS_MODULE);
1159 
1160 	return err;
1161 }
1162 
1163 /* called with rcu_read_lock held */
nf_tables_gettable(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])1164 static int nf_tables_gettable(struct sk_buff *skb, const struct nfnl_info *info,
1165 			      const struct nlattr * const nla[])
1166 {
1167 	struct netlink_ext_ack *extack = info->extack;
1168 	u8 genmask = nft_genmask_cur(info->net);
1169 	u8 family = info->nfmsg->nfgen_family;
1170 	const struct nft_table *table;
1171 	struct net *net = info->net;
1172 	struct sk_buff *skb2;
1173 	int err;
1174 
1175 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
1176 		struct netlink_dump_control c = {
1177 			.dump = nf_tables_dump_tables,
1178 			.module = THIS_MODULE,
1179 		};
1180 
1181 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
1182 	}
1183 
1184 	table = nft_table_lookup(net, nla[NFTA_TABLE_NAME], family, genmask, 0);
1185 	if (IS_ERR(table)) {
1186 		NL_SET_BAD_ATTR(extack, nla[NFTA_TABLE_NAME]);
1187 		return PTR_ERR(table);
1188 	}
1189 
1190 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
1191 	if (!skb2)
1192 		return -ENOMEM;
1193 
1194 	err = nf_tables_fill_table_info(skb2, net, NETLINK_CB(skb).portid,
1195 					info->nlh->nlmsg_seq, NFT_MSG_NEWTABLE,
1196 					0, family, table);
1197 	if (err < 0)
1198 		goto err_fill_table_info;
1199 
1200 	return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid);
1201 
1202 err_fill_table_info:
1203 	kfree_skb(skb2);
1204 	return err;
1205 }
1206 
nft_table_disable(struct net * net,struct nft_table * table,u32 cnt)1207 static void nft_table_disable(struct net *net, struct nft_table *table, u32 cnt)
1208 {
1209 	struct nft_chain *chain;
1210 	u32 i = 0;
1211 
1212 	list_for_each_entry(chain, &table->chains, list) {
1213 		if (!nft_is_active_next(net, chain))
1214 			continue;
1215 		if (!nft_is_base_chain(chain))
1216 			continue;
1217 
1218 		if (cnt && i++ == cnt)
1219 			break;
1220 
1221 		nf_tables_unregister_hook(net, table, chain);
1222 	}
1223 }
1224 
nf_tables_table_enable(struct net * net,struct nft_table * table)1225 static int nf_tables_table_enable(struct net *net, struct nft_table *table)
1226 {
1227 	struct nft_chain *chain;
1228 	int err, i = 0;
1229 
1230 	list_for_each_entry(chain, &table->chains, list) {
1231 		if (!nft_is_active_next(net, chain))
1232 			continue;
1233 		if (!nft_is_base_chain(chain))
1234 			continue;
1235 
1236 		err = nf_tables_register_hook(net, table, chain);
1237 		if (err < 0)
1238 			goto err_register_hooks;
1239 
1240 		i++;
1241 	}
1242 	return 0;
1243 
1244 err_register_hooks:
1245 	if (i)
1246 		nft_table_disable(net, table, i);
1247 	return err;
1248 }
1249 
nf_tables_table_disable(struct net * net,struct nft_table * table)1250 static void nf_tables_table_disable(struct net *net, struct nft_table *table)
1251 {
1252 	table->flags &= ~NFT_TABLE_F_DORMANT;
1253 	nft_table_disable(net, table, 0);
1254 	table->flags |= NFT_TABLE_F_DORMANT;
1255 }
1256 
1257 #define __NFT_TABLE_F_INTERNAL		(NFT_TABLE_F_MASK + 1)
1258 #define __NFT_TABLE_F_WAS_DORMANT	(__NFT_TABLE_F_INTERNAL << 0)
1259 #define __NFT_TABLE_F_WAS_AWAKEN	(__NFT_TABLE_F_INTERNAL << 1)
1260 #define __NFT_TABLE_F_WAS_ORPHAN	(__NFT_TABLE_F_INTERNAL << 2)
1261 #define __NFT_TABLE_F_UPDATE		(__NFT_TABLE_F_WAS_DORMANT | \
1262 					 __NFT_TABLE_F_WAS_AWAKEN | \
1263 					 __NFT_TABLE_F_WAS_ORPHAN)
1264 
nft_table_pending_update(const struct nft_ctx * ctx)1265 static bool nft_table_pending_update(const struct nft_ctx *ctx)
1266 {
1267 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
1268 	struct nft_trans *trans;
1269 
1270 	if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
1271 		return true;
1272 
1273 	list_for_each_entry(trans, &nft_net->commit_list, list) {
1274 		if (trans->table == ctx->table &&
1275 		    ((trans->msg_type == NFT_MSG_NEWCHAIN &&
1276 		      nft_trans_chain_update(trans)) ||
1277 		     (trans->msg_type == NFT_MSG_DELCHAIN &&
1278 		      nft_is_base_chain(nft_trans_chain(trans)))))
1279 			return true;
1280 	}
1281 
1282 	return false;
1283 }
1284 
nf_tables_updtable(struct nft_ctx * ctx)1285 static int nf_tables_updtable(struct nft_ctx *ctx)
1286 {
1287 	struct nft_trans *trans;
1288 	u32 flags;
1289 	int ret;
1290 
1291 	if (!ctx->nla[NFTA_TABLE_FLAGS])
1292 		return 0;
1293 
1294 	flags = ntohl(nla_get_be32(ctx->nla[NFTA_TABLE_FLAGS]));
1295 	if (flags & ~NFT_TABLE_F_MASK)
1296 		return -EOPNOTSUPP;
1297 
1298 	if (flags == (ctx->table->flags & NFT_TABLE_F_MASK))
1299 		return 0;
1300 
1301 	if ((nft_table_has_owner(ctx->table) &&
1302 	     !(flags & NFT_TABLE_F_OWNER)) ||
1303 	    (flags & NFT_TABLE_F_OWNER &&
1304 	     !nft_table_is_orphan(ctx->table)))
1305 		return -EOPNOTSUPP;
1306 
1307 	if ((flags ^ ctx->table->flags) & NFT_TABLE_F_PERSIST)
1308 		return -EOPNOTSUPP;
1309 
1310 	/* No dormant off/on/off/on games in single transaction */
1311 	if (nft_table_pending_update(ctx))
1312 		return -EINVAL;
1313 
1314 	trans = nft_trans_alloc(ctx, NFT_MSG_NEWTABLE,
1315 				sizeof(struct nft_trans_table));
1316 	if (trans == NULL)
1317 		return -ENOMEM;
1318 
1319 	if ((flags & NFT_TABLE_F_DORMANT) &&
1320 	    !(ctx->table->flags & NFT_TABLE_F_DORMANT)) {
1321 		ctx->table->flags |= NFT_TABLE_F_DORMANT;
1322 		if (!(ctx->table->flags & __NFT_TABLE_F_UPDATE))
1323 			ctx->table->flags |= __NFT_TABLE_F_WAS_AWAKEN;
1324 	} else if (!(flags & NFT_TABLE_F_DORMANT) &&
1325 		   ctx->table->flags & NFT_TABLE_F_DORMANT) {
1326 		ctx->table->flags &= ~NFT_TABLE_F_DORMANT;
1327 		if (!(ctx->table->flags & __NFT_TABLE_F_UPDATE)) {
1328 			ret = nf_tables_table_enable(ctx->net, ctx->table);
1329 			if (ret < 0)
1330 				goto err_register_hooks;
1331 
1332 			ctx->table->flags |= __NFT_TABLE_F_WAS_DORMANT;
1333 		}
1334 	}
1335 
1336 	if ((flags & NFT_TABLE_F_OWNER) &&
1337 	    !nft_table_has_owner(ctx->table)) {
1338 		ctx->table->nlpid = ctx->portid;
1339 		ctx->table->flags |= NFT_TABLE_F_OWNER |
1340 				     __NFT_TABLE_F_WAS_ORPHAN;
1341 	}
1342 
1343 	nft_trans_table_update(trans) = true;
1344 	nft_trans_commit_list_add_tail(ctx->net, trans);
1345 
1346 	return 0;
1347 
1348 err_register_hooks:
1349 	ctx->table->flags |= NFT_TABLE_F_DORMANT;
1350 	nft_trans_destroy(trans);
1351 	return ret;
1352 }
1353 
nft_chain_hash(const void * data,u32 len,u32 seed)1354 static u32 nft_chain_hash(const void *data, u32 len, u32 seed)
1355 {
1356 	const char *name = data;
1357 
1358 	return jhash(name, strlen(name), seed);
1359 }
1360 
nft_chain_hash_obj(const void * data,u32 len,u32 seed)1361 static u32 nft_chain_hash_obj(const void *data, u32 len, u32 seed)
1362 {
1363 	const struct nft_chain *chain = data;
1364 
1365 	return nft_chain_hash(chain->name, 0, seed);
1366 }
1367 
nft_chain_hash_cmp(struct rhashtable_compare_arg * arg,const void * ptr)1368 static int nft_chain_hash_cmp(struct rhashtable_compare_arg *arg,
1369 			      const void *ptr)
1370 {
1371 	const struct nft_chain *chain = ptr;
1372 	const char *name = arg->key;
1373 
1374 	return strcmp(chain->name, name);
1375 }
1376 
nft_objname_hash(const void * data,u32 len,u32 seed)1377 static u32 nft_objname_hash(const void *data, u32 len, u32 seed)
1378 {
1379 	const struct nft_object_hash_key *k = data;
1380 
1381 	seed ^= hash_ptr(k->table, 32);
1382 
1383 	return jhash(k->name, strlen(k->name), seed);
1384 }
1385 
nft_objname_hash_obj(const void * data,u32 len,u32 seed)1386 static u32 nft_objname_hash_obj(const void *data, u32 len, u32 seed)
1387 {
1388 	const struct nft_object *obj = data;
1389 
1390 	return nft_objname_hash(&obj->key, 0, seed);
1391 }
1392 
nft_objname_hash_cmp(struct rhashtable_compare_arg * arg,const void * ptr)1393 static int nft_objname_hash_cmp(struct rhashtable_compare_arg *arg,
1394 				const void *ptr)
1395 {
1396 	const struct nft_object_hash_key *k = arg->key;
1397 	const struct nft_object *obj = ptr;
1398 
1399 	if (obj->key.table != k->table)
1400 		return -1;
1401 
1402 	return strcmp(obj->key.name, k->name);
1403 }
1404 
nft_supported_family(u8 family)1405 static bool nft_supported_family(u8 family)
1406 {
1407 	return false
1408 #ifdef CONFIG_NF_TABLES_INET
1409 		|| family == NFPROTO_INET
1410 #endif
1411 #ifdef CONFIG_NF_TABLES_IPV4
1412 		|| family == NFPROTO_IPV4
1413 #endif
1414 #ifdef CONFIG_NF_TABLES_ARP
1415 		|| family == NFPROTO_ARP
1416 #endif
1417 #ifdef CONFIG_NF_TABLES_NETDEV
1418 		|| family == NFPROTO_NETDEV
1419 #endif
1420 #if IS_ENABLED(CONFIG_NF_TABLES_BRIDGE)
1421 		|| family == NFPROTO_BRIDGE
1422 #endif
1423 #ifdef CONFIG_NF_TABLES_IPV6
1424 		|| family == NFPROTO_IPV6
1425 #endif
1426 		;
1427 }
1428 
nf_tables_newtable(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])1429 static int nf_tables_newtable(struct sk_buff *skb, const struct nfnl_info *info,
1430 			      const struct nlattr * const nla[])
1431 {
1432 	struct nftables_pernet *nft_net = nft_pernet(info->net);
1433 	struct netlink_ext_ack *extack = info->extack;
1434 	u8 genmask = nft_genmask_next(info->net);
1435 	u8 family = info->nfmsg->nfgen_family;
1436 	struct net *net = info->net;
1437 	const struct nlattr *attr;
1438 	struct nft_table *table;
1439 	struct nft_ctx ctx;
1440 	u32 flags = 0;
1441 	int err;
1442 
1443 	if (!nft_supported_family(family))
1444 		return -EOPNOTSUPP;
1445 
1446 	lockdep_assert_held(&nft_net->commit_mutex);
1447 	attr = nla[NFTA_TABLE_NAME];
1448 	table = nft_table_lookup(net, attr, family, genmask,
1449 				 NETLINK_CB(skb).portid);
1450 	if (IS_ERR(table)) {
1451 		if (PTR_ERR(table) != -ENOENT)
1452 			return PTR_ERR(table);
1453 	} else {
1454 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
1455 			NL_SET_BAD_ATTR(extack, attr);
1456 			return -EEXIST;
1457 		}
1458 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
1459 			return -EOPNOTSUPP;
1460 
1461 		nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
1462 
1463 		return nf_tables_updtable(&ctx);
1464 	}
1465 
1466 	if (nla[NFTA_TABLE_FLAGS]) {
1467 		flags = ntohl(nla_get_be32(nla[NFTA_TABLE_FLAGS]));
1468 		if (flags & ~NFT_TABLE_F_MASK)
1469 			return -EOPNOTSUPP;
1470 	}
1471 
1472 	err = -ENOMEM;
1473 	table = kzalloc(sizeof(*table), GFP_KERNEL_ACCOUNT);
1474 	if (table == NULL)
1475 		goto err_kzalloc;
1476 
1477 	table->validate_state = nft_net->validate_state;
1478 	table->name = nla_strdup(attr, GFP_KERNEL_ACCOUNT);
1479 	if (table->name == NULL)
1480 		goto err_strdup;
1481 
1482 	if (nla[NFTA_TABLE_USERDATA]) {
1483 		table->udata = nla_memdup(nla[NFTA_TABLE_USERDATA], GFP_KERNEL_ACCOUNT);
1484 		if (table->udata == NULL)
1485 			goto err_table_udata;
1486 
1487 		table->udlen = nla_len(nla[NFTA_TABLE_USERDATA]);
1488 	}
1489 
1490 	err = rhltable_init(&table->chains_ht, &nft_chain_ht_params);
1491 	if (err)
1492 		goto err_chain_ht;
1493 
1494 	INIT_LIST_HEAD(&table->chains);
1495 	INIT_LIST_HEAD(&table->sets);
1496 	INIT_LIST_HEAD(&table->objects);
1497 	INIT_LIST_HEAD(&table->flowtables);
1498 	write_pnet(&table->net, net);
1499 	table->family = family;
1500 	table->flags = flags;
1501 	table->handle = ++nft_net->table_handle;
1502 	if (table->flags & NFT_TABLE_F_OWNER)
1503 		table->nlpid = NETLINK_CB(skb).portid;
1504 
1505 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
1506 	err = nft_trans_table_add(&ctx, NFT_MSG_NEWTABLE);
1507 	if (err < 0)
1508 		goto err_trans;
1509 
1510 	list_add_tail_rcu(&table->list, &nft_net->tables);
1511 	return 0;
1512 err_trans:
1513 	rhltable_destroy(&table->chains_ht);
1514 err_chain_ht:
1515 	kfree(table->udata);
1516 err_table_udata:
1517 	kfree(table->name);
1518 err_strdup:
1519 	kfree(table);
1520 err_kzalloc:
1521 	return err;
1522 }
1523 
nft_flush_table(struct nft_ctx * ctx)1524 static int nft_flush_table(struct nft_ctx *ctx)
1525 {
1526 	struct nft_flowtable *flowtable, *nft;
1527 	struct nft_chain *chain, *nc;
1528 	struct nft_object *obj, *ne;
1529 	struct nft_set *set, *ns;
1530 	int err;
1531 
1532 	list_for_each_entry(chain, &ctx->table->chains, list) {
1533 		if (!nft_is_active_next(ctx->net, chain))
1534 			continue;
1535 
1536 		if (nft_chain_binding(chain))
1537 			continue;
1538 
1539 		ctx->chain = chain;
1540 
1541 		err = nft_delrule_by_chain(ctx);
1542 		if (err < 0)
1543 			goto out;
1544 	}
1545 
1546 	list_for_each_entry_safe(set, ns, &ctx->table->sets, list) {
1547 		if (!nft_is_active_next(ctx->net, set))
1548 			continue;
1549 
1550 		if (nft_set_is_anonymous(set))
1551 			continue;
1552 
1553 		err = nft_delset(ctx, set);
1554 		if (err < 0)
1555 			goto out;
1556 	}
1557 
1558 	list_for_each_entry_safe(flowtable, nft, &ctx->table->flowtables, list) {
1559 		if (!nft_is_active_next(ctx->net, flowtable))
1560 			continue;
1561 
1562 		err = nft_delflowtable(ctx, flowtable);
1563 		if (err < 0)
1564 			goto out;
1565 	}
1566 
1567 	list_for_each_entry_safe(obj, ne, &ctx->table->objects, list) {
1568 		if (!nft_is_active_next(ctx->net, obj))
1569 			continue;
1570 
1571 		err = nft_delobj(ctx, obj);
1572 		if (err < 0)
1573 			goto out;
1574 	}
1575 
1576 	list_for_each_entry_safe(chain, nc, &ctx->table->chains, list) {
1577 		if (!nft_is_active_next(ctx->net, chain))
1578 			continue;
1579 
1580 		if (nft_chain_binding(chain))
1581 			continue;
1582 
1583 		ctx->chain = chain;
1584 
1585 		err = nft_delchain(ctx);
1586 		if (err < 0)
1587 			goto out;
1588 	}
1589 
1590 	err = nft_deltable(ctx);
1591 out:
1592 	return err;
1593 }
1594 
nft_flush(struct nft_ctx * ctx,int family)1595 static int nft_flush(struct nft_ctx *ctx, int family)
1596 {
1597 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
1598 	const struct nlattr * const *nla = ctx->nla;
1599 	struct nft_table *table, *nt;
1600 	int err = 0;
1601 
1602 	list_for_each_entry_safe(table, nt, &nft_net->tables, list) {
1603 		if (family != AF_UNSPEC && table->family != family)
1604 			continue;
1605 
1606 		ctx->family = table->family;
1607 
1608 		if (!nft_is_active_next(ctx->net, table))
1609 			continue;
1610 
1611 		if (nft_table_has_owner(table) && table->nlpid != ctx->portid)
1612 			continue;
1613 
1614 		if (nla[NFTA_TABLE_NAME] &&
1615 		    nla_strcmp(nla[NFTA_TABLE_NAME], table->name) != 0)
1616 			continue;
1617 
1618 		ctx->table = table;
1619 
1620 		err = nft_flush_table(ctx);
1621 		if (err < 0)
1622 			goto out;
1623 	}
1624 out:
1625 	return err;
1626 }
1627 
nf_tables_deltable(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])1628 static int nf_tables_deltable(struct sk_buff *skb, const struct nfnl_info *info,
1629 			      const struct nlattr * const nla[])
1630 {
1631 	struct netlink_ext_ack *extack = info->extack;
1632 	u8 genmask = nft_genmask_next(info->net);
1633 	u8 family = info->nfmsg->nfgen_family;
1634 	struct net *net = info->net;
1635 	const struct nlattr *attr;
1636 	struct nft_table *table;
1637 	struct nft_ctx ctx;
1638 
1639 	nft_ctx_init(&ctx, net, skb, info->nlh, 0, NULL, NULL, nla);
1640 	if (family == AF_UNSPEC ||
1641 	    (!nla[NFTA_TABLE_NAME] && !nla[NFTA_TABLE_HANDLE]))
1642 		return nft_flush(&ctx, family);
1643 
1644 	if (nla[NFTA_TABLE_HANDLE]) {
1645 		attr = nla[NFTA_TABLE_HANDLE];
1646 		table = nft_table_lookup_byhandle(net, attr, family, genmask,
1647 						  NETLINK_CB(skb).portid);
1648 	} else {
1649 		attr = nla[NFTA_TABLE_NAME];
1650 		table = nft_table_lookup(net, attr, family, genmask,
1651 					 NETLINK_CB(skb).portid);
1652 	}
1653 
1654 	if (IS_ERR(table)) {
1655 		if (PTR_ERR(table) == -ENOENT &&
1656 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYTABLE)
1657 			return 0;
1658 
1659 		NL_SET_BAD_ATTR(extack, attr);
1660 		return PTR_ERR(table);
1661 	}
1662 
1663 	if (info->nlh->nlmsg_flags & NLM_F_NONREC &&
1664 	    table->use > 0)
1665 		return -EBUSY;
1666 
1667 	ctx.family = family;
1668 	ctx.table = table;
1669 
1670 	return nft_flush_table(&ctx);
1671 }
1672 
nf_tables_table_destroy(struct nft_table * table)1673 static void nf_tables_table_destroy(struct nft_table *table)
1674 {
1675 	if (WARN_ON(table->use > 0))
1676 		return;
1677 
1678 	rhltable_destroy(&table->chains_ht);
1679 	kfree(table->name);
1680 	kfree(table->udata);
1681 	kfree(table);
1682 }
1683 
nft_register_chain_type(const struct nft_chain_type * ctype)1684 void nft_register_chain_type(const struct nft_chain_type *ctype)
1685 {
1686 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
1687 	if (WARN_ON(__nft_chain_type_get(ctype->family, ctype->type))) {
1688 		nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1689 		return;
1690 	}
1691 	chain_type[ctype->family][ctype->type] = ctype;
1692 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1693 }
1694 EXPORT_SYMBOL_GPL(nft_register_chain_type);
1695 
nft_unregister_chain_type(const struct nft_chain_type * ctype)1696 void nft_unregister_chain_type(const struct nft_chain_type *ctype)
1697 {
1698 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
1699 	chain_type[ctype->family][ctype->type] = NULL;
1700 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
1701 }
1702 EXPORT_SYMBOL_GPL(nft_unregister_chain_type);
1703 
1704 /*
1705  * Chains
1706  */
1707 
1708 static struct nft_chain *
nft_chain_lookup_byhandle(const struct nft_table * table,u64 handle,u8 genmask)1709 nft_chain_lookup_byhandle(const struct nft_table *table, u64 handle, u8 genmask)
1710 {
1711 	struct nft_chain *chain;
1712 
1713 	list_for_each_entry(chain, &table->chains, list) {
1714 		if (chain->handle == handle &&
1715 		    nft_active_genmask(chain, genmask))
1716 			return chain;
1717 	}
1718 
1719 	return ERR_PTR(-ENOENT);
1720 }
1721 
lockdep_commit_lock_is_held(const struct net * net)1722 static bool lockdep_commit_lock_is_held(const struct net *net)
1723 {
1724 #ifdef CONFIG_PROVE_LOCKING
1725 	struct nftables_pernet *nft_net = nft_pernet(net);
1726 
1727 	return lockdep_is_held(&nft_net->commit_mutex);
1728 #else
1729 	return true;
1730 #endif
1731 }
1732 
nft_chain_lookup(struct net * net,struct nft_table * table,const struct nlattr * nla,u8 genmask)1733 static struct nft_chain *nft_chain_lookup(struct net *net,
1734 					  struct nft_table *table,
1735 					  const struct nlattr *nla, u8 genmask)
1736 {
1737 	char search[NFT_CHAIN_MAXNAMELEN + 1];
1738 	struct rhlist_head *tmp, *list;
1739 	struct nft_chain *chain;
1740 
1741 	if (nla == NULL)
1742 		return ERR_PTR(-EINVAL);
1743 
1744 	nla_strscpy(search, nla, sizeof(search));
1745 
1746 	WARN_ON(!rcu_read_lock_held() &&
1747 		!lockdep_commit_lock_is_held(net));
1748 
1749 	chain = ERR_PTR(-ENOENT);
1750 	rcu_read_lock();
1751 	list = rhltable_lookup(&table->chains_ht, search, nft_chain_ht_params);
1752 	if (!list)
1753 		goto out_unlock;
1754 
1755 	rhl_for_each_entry_rcu(chain, tmp, list, rhlhead) {
1756 		if (nft_active_genmask(chain, genmask))
1757 			goto out_unlock;
1758 	}
1759 	chain = ERR_PTR(-ENOENT);
1760 out_unlock:
1761 	rcu_read_unlock();
1762 	return chain;
1763 }
1764 
1765 static const struct nla_policy nft_chain_policy[NFTA_CHAIN_MAX + 1] = {
1766 	[NFTA_CHAIN_TABLE]	= { .type = NLA_STRING,
1767 				    .len = NFT_TABLE_MAXNAMELEN - 1 },
1768 	[NFTA_CHAIN_HANDLE]	= { .type = NLA_U64 },
1769 	[NFTA_CHAIN_NAME]	= { .type = NLA_STRING,
1770 				    .len = NFT_CHAIN_MAXNAMELEN - 1 },
1771 	[NFTA_CHAIN_HOOK]	= { .type = NLA_NESTED },
1772 	[NFTA_CHAIN_POLICY]	= { .type = NLA_U32 },
1773 	[NFTA_CHAIN_TYPE]	= { .type = NLA_STRING,
1774 				    .len = NFT_MODULE_AUTOLOAD_LIMIT },
1775 	[NFTA_CHAIN_COUNTERS]	= { .type = NLA_NESTED },
1776 	[NFTA_CHAIN_FLAGS]	= { .type = NLA_U32 },
1777 	[NFTA_CHAIN_ID]		= { .type = NLA_U32 },
1778 	[NFTA_CHAIN_USERDATA]	= { .type = NLA_BINARY,
1779 				    .len = NFT_USERDATA_MAXLEN },
1780 };
1781 
1782 static const struct nla_policy nft_hook_policy[NFTA_HOOK_MAX + 1] = {
1783 	[NFTA_HOOK_HOOKNUM]	= { .type = NLA_U32 },
1784 	[NFTA_HOOK_PRIORITY]	= { .type = NLA_U32 },
1785 	[NFTA_HOOK_DEV]		= { .type = NLA_STRING,
1786 				    .len = IFNAMSIZ - 1 },
1787 };
1788 
nft_dump_stats(struct sk_buff * skb,struct nft_stats __percpu * stats)1789 static int nft_dump_stats(struct sk_buff *skb, struct nft_stats __percpu *stats)
1790 {
1791 	struct nft_stats *cpu_stats, total;
1792 	struct nlattr *nest;
1793 	unsigned int seq;
1794 	u64 pkts, bytes;
1795 	int cpu;
1796 
1797 	if (!stats)
1798 		return 0;
1799 
1800 	memset(&total, 0, sizeof(total));
1801 	for_each_possible_cpu(cpu) {
1802 		cpu_stats = per_cpu_ptr(stats, cpu);
1803 		do {
1804 			seq = u64_stats_fetch_begin(&cpu_stats->syncp);
1805 			pkts = cpu_stats->pkts;
1806 			bytes = cpu_stats->bytes;
1807 		} while (u64_stats_fetch_retry(&cpu_stats->syncp, seq));
1808 		total.pkts += pkts;
1809 		total.bytes += bytes;
1810 	}
1811 	nest = nla_nest_start_noflag(skb, NFTA_CHAIN_COUNTERS);
1812 	if (nest == NULL)
1813 		goto nla_put_failure;
1814 
1815 	if (nla_put_be64(skb, NFTA_COUNTER_PACKETS, cpu_to_be64(total.pkts),
1816 			 NFTA_COUNTER_PAD) ||
1817 	    nla_put_be64(skb, NFTA_COUNTER_BYTES, cpu_to_be64(total.bytes),
1818 			 NFTA_COUNTER_PAD))
1819 		goto nla_put_failure;
1820 
1821 	nla_nest_end(skb, nest);
1822 	return 0;
1823 
1824 nla_put_failure:
1825 	return -ENOSPC;
1826 }
1827 
nft_dump_basechain_hook(struct sk_buff * skb,int family,const struct nft_base_chain * basechain,const struct list_head * hook_list)1828 static int nft_dump_basechain_hook(struct sk_buff *skb, int family,
1829 				   const struct nft_base_chain *basechain,
1830 				   const struct list_head *hook_list)
1831 {
1832 	const struct nf_hook_ops *ops = &basechain->ops;
1833 	struct nft_hook *hook, *first = NULL;
1834 	struct nlattr *nest, *nest_devs;
1835 	int n = 0;
1836 
1837 	nest = nla_nest_start_noflag(skb, NFTA_CHAIN_HOOK);
1838 	if (nest == NULL)
1839 		goto nla_put_failure;
1840 	if (nla_put_be32(skb, NFTA_HOOK_HOOKNUM, htonl(ops->hooknum)))
1841 		goto nla_put_failure;
1842 	if (nla_put_be32(skb, NFTA_HOOK_PRIORITY, htonl(ops->priority)))
1843 		goto nla_put_failure;
1844 
1845 	if (nft_base_chain_netdev(family, ops->hooknum)) {
1846 		nest_devs = nla_nest_start_noflag(skb, NFTA_HOOK_DEVS);
1847 		if (!nest_devs)
1848 			goto nla_put_failure;
1849 
1850 		if (!hook_list)
1851 			hook_list = &basechain->hook_list;
1852 
1853 		list_for_each_entry_rcu(hook, hook_list, list) {
1854 			if (!first)
1855 				first = hook;
1856 
1857 			if (nla_put_string(skb, NFTA_DEVICE_NAME,
1858 					   hook->ops.dev->name))
1859 				goto nla_put_failure;
1860 			n++;
1861 		}
1862 		nla_nest_end(skb, nest_devs);
1863 
1864 		if (n == 1 &&
1865 		    nla_put_string(skb, NFTA_HOOK_DEV, first->ops.dev->name))
1866 			goto nla_put_failure;
1867 	}
1868 	nla_nest_end(skb, nest);
1869 
1870 	return 0;
1871 nla_put_failure:
1872 	return -1;
1873 }
1874 
nf_tables_fill_chain_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq,int event,u32 flags,int family,const struct nft_table * table,const struct nft_chain * chain,const struct list_head * hook_list)1875 static int nf_tables_fill_chain_info(struct sk_buff *skb, struct net *net,
1876 				     u32 portid, u32 seq, int event, u32 flags,
1877 				     int family, const struct nft_table *table,
1878 				     const struct nft_chain *chain,
1879 				     const struct list_head *hook_list)
1880 {
1881 	struct nlmsghdr *nlh;
1882 
1883 	event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
1884 	nlh = nfnl_msg_put(skb, portid, seq, event, flags, family,
1885 			   NFNETLINK_V0, nft_base_seq(net));
1886 	if (!nlh)
1887 		goto nla_put_failure;
1888 
1889 	if (nla_put_string(skb, NFTA_CHAIN_TABLE, table->name) ||
1890 	    nla_put_string(skb, NFTA_CHAIN_NAME, chain->name) ||
1891 	    nla_put_be64(skb, NFTA_CHAIN_HANDLE, cpu_to_be64(chain->handle),
1892 			 NFTA_CHAIN_PAD))
1893 		goto nla_put_failure;
1894 
1895 	if (event == NFT_MSG_DELCHAIN && !hook_list) {
1896 		nlmsg_end(skb, nlh);
1897 		return 0;
1898 	}
1899 
1900 	if (nft_is_base_chain(chain)) {
1901 		const struct nft_base_chain *basechain = nft_base_chain(chain);
1902 		struct nft_stats __percpu *stats;
1903 
1904 		if (nft_dump_basechain_hook(skb, family, basechain, hook_list))
1905 			goto nla_put_failure;
1906 
1907 		if (nla_put_be32(skb, NFTA_CHAIN_POLICY,
1908 				 htonl(basechain->policy)))
1909 			goto nla_put_failure;
1910 
1911 		if (nla_put_string(skb, NFTA_CHAIN_TYPE, basechain->type->name))
1912 			goto nla_put_failure;
1913 
1914 		stats = rcu_dereference_check(basechain->stats,
1915 					      lockdep_commit_lock_is_held(net));
1916 		if (nft_dump_stats(skb, stats))
1917 			goto nla_put_failure;
1918 	}
1919 
1920 	if (chain->flags &&
1921 	    nla_put_be32(skb, NFTA_CHAIN_FLAGS, htonl(chain->flags)))
1922 		goto nla_put_failure;
1923 
1924 	if (nla_put_be32(skb, NFTA_CHAIN_USE, htonl(chain->use)))
1925 		goto nla_put_failure;
1926 
1927 	if (chain->udata &&
1928 	    nla_put(skb, NFTA_CHAIN_USERDATA, chain->udlen, chain->udata))
1929 		goto nla_put_failure;
1930 
1931 	nlmsg_end(skb, nlh);
1932 	return 0;
1933 
1934 nla_put_failure:
1935 	nlmsg_trim(skb, nlh);
1936 	return -1;
1937 }
1938 
nf_tables_chain_notify(const struct nft_ctx * ctx,int event,const struct list_head * hook_list)1939 static void nf_tables_chain_notify(const struct nft_ctx *ctx, int event,
1940 				   const struct list_head *hook_list)
1941 {
1942 	struct nftables_pernet *nft_net;
1943 	struct sk_buff *skb;
1944 	u16 flags = 0;
1945 	int err;
1946 
1947 	if (!ctx->report &&
1948 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
1949 		return;
1950 
1951 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
1952 	if (skb == NULL)
1953 		goto err;
1954 
1955 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
1956 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
1957 
1958 	err = nf_tables_fill_chain_info(skb, ctx->net, ctx->portid, ctx->seq,
1959 					event, flags, ctx->family, ctx->table,
1960 					ctx->chain, hook_list);
1961 	if (err < 0) {
1962 		kfree_skb(skb);
1963 		goto err;
1964 	}
1965 
1966 	nft_net = nft_pernet(ctx->net);
1967 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
1968 	return;
1969 err:
1970 	nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
1971 }
1972 
nf_tables_dump_chains(struct sk_buff * skb,struct netlink_callback * cb)1973 static int nf_tables_dump_chains(struct sk_buff *skb,
1974 				 struct netlink_callback *cb)
1975 {
1976 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
1977 	unsigned int idx = 0, s_idx = cb->args[0];
1978 	struct net *net = sock_net(skb->sk);
1979 	int family = nfmsg->nfgen_family;
1980 	struct nftables_pernet *nft_net;
1981 	const struct nft_table *table;
1982 	const struct nft_chain *chain;
1983 
1984 	rcu_read_lock();
1985 	nft_net = nft_pernet(net);
1986 	cb->seq = READ_ONCE(nft_net->base_seq);
1987 
1988 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
1989 		if (family != NFPROTO_UNSPEC && family != table->family)
1990 			continue;
1991 
1992 		list_for_each_entry_rcu(chain, &table->chains, list) {
1993 			if (idx < s_idx)
1994 				goto cont;
1995 			if (idx > s_idx)
1996 				memset(&cb->args[1], 0,
1997 				       sizeof(cb->args) - sizeof(cb->args[0]));
1998 			if (!nft_is_active(net, chain))
1999 				continue;
2000 			if (nf_tables_fill_chain_info(skb, net,
2001 						      NETLINK_CB(cb->skb).portid,
2002 						      cb->nlh->nlmsg_seq,
2003 						      NFT_MSG_NEWCHAIN,
2004 						      NLM_F_MULTI,
2005 						      table->family, table,
2006 						      chain, NULL) < 0)
2007 				goto done;
2008 
2009 			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
2010 cont:
2011 			idx++;
2012 		}
2013 	}
2014 done:
2015 	rcu_read_unlock();
2016 	cb->args[0] = idx;
2017 	return skb->len;
2018 }
2019 
2020 /* called with rcu_read_lock held */
nf_tables_getchain(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])2021 static int nf_tables_getchain(struct sk_buff *skb, const struct nfnl_info *info,
2022 			      const struct nlattr * const nla[])
2023 {
2024 	struct netlink_ext_ack *extack = info->extack;
2025 	u8 genmask = nft_genmask_cur(info->net);
2026 	u8 family = info->nfmsg->nfgen_family;
2027 	const struct nft_chain *chain;
2028 	struct net *net = info->net;
2029 	struct nft_table *table;
2030 	struct sk_buff *skb2;
2031 	int err;
2032 
2033 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
2034 		struct netlink_dump_control c = {
2035 			.dump = nf_tables_dump_chains,
2036 			.module = THIS_MODULE,
2037 		};
2038 
2039 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
2040 	}
2041 
2042 	table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask, 0);
2043 	if (IS_ERR(table)) {
2044 		NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]);
2045 		return PTR_ERR(table);
2046 	}
2047 
2048 	chain = nft_chain_lookup(net, table, nla[NFTA_CHAIN_NAME], genmask);
2049 	if (IS_ERR(chain)) {
2050 		NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]);
2051 		return PTR_ERR(chain);
2052 	}
2053 
2054 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
2055 	if (!skb2)
2056 		return -ENOMEM;
2057 
2058 	err = nf_tables_fill_chain_info(skb2, net, NETLINK_CB(skb).portid,
2059 					info->nlh->nlmsg_seq, NFT_MSG_NEWCHAIN,
2060 					0, family, table, chain, NULL);
2061 	if (err < 0)
2062 		goto err_fill_chain_info;
2063 
2064 	return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid);
2065 
2066 err_fill_chain_info:
2067 	kfree_skb(skb2);
2068 	return err;
2069 }
2070 
2071 static const struct nla_policy nft_counter_policy[NFTA_COUNTER_MAX + 1] = {
2072 	[NFTA_COUNTER_PACKETS]	= { .type = NLA_U64 },
2073 	[NFTA_COUNTER_BYTES]	= { .type = NLA_U64 },
2074 };
2075 
nft_stats_alloc(const struct nlattr * attr)2076 static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr)
2077 {
2078 	struct nlattr *tb[NFTA_COUNTER_MAX+1];
2079 	struct nft_stats __percpu *newstats;
2080 	struct nft_stats *stats;
2081 	int err;
2082 
2083 	err = nla_parse_nested_deprecated(tb, NFTA_COUNTER_MAX, attr,
2084 					  nft_counter_policy, NULL);
2085 	if (err < 0)
2086 		return ERR_PTR(err);
2087 
2088 	if (!tb[NFTA_COUNTER_BYTES] || !tb[NFTA_COUNTER_PACKETS])
2089 		return ERR_PTR(-EINVAL);
2090 
2091 	newstats = netdev_alloc_pcpu_stats(struct nft_stats);
2092 	if (newstats == NULL)
2093 		return ERR_PTR(-ENOMEM);
2094 
2095 	/* Restore old counters on this cpu, no problem. Per-cpu statistics
2096 	 * are not exposed to userspace.
2097 	 */
2098 	preempt_disable();
2099 	stats = this_cpu_ptr(newstats);
2100 	stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES]));
2101 	stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS]));
2102 	preempt_enable();
2103 
2104 	return newstats;
2105 }
2106 
nft_chain_stats_replace(struct nft_trans_chain * trans)2107 static void nft_chain_stats_replace(struct nft_trans_chain *trans)
2108 {
2109 	const struct nft_trans *t = &trans->nft_trans_binding.nft_trans;
2110 	struct nft_base_chain *chain = nft_base_chain(trans->chain);
2111 
2112 	if (!trans->stats)
2113 		return;
2114 
2115 	trans->stats =
2116 		rcu_replace_pointer(chain->stats, trans->stats,
2117 				    lockdep_commit_lock_is_held(t->net));
2118 
2119 	if (!trans->stats)
2120 		static_branch_inc(&nft_counters_enabled);
2121 }
2122 
nf_tables_chain_free_chain_rules(struct nft_chain * chain)2123 static void nf_tables_chain_free_chain_rules(struct nft_chain *chain)
2124 {
2125 	struct nft_rule_blob *g0 = rcu_dereference_raw(chain->blob_gen_0);
2126 	struct nft_rule_blob *g1 = rcu_dereference_raw(chain->blob_gen_1);
2127 
2128 	if (g0 != g1)
2129 		kvfree(g1);
2130 	kvfree(g0);
2131 
2132 	/* should be NULL either via abort or via successful commit */
2133 	WARN_ON_ONCE(chain->blob_next);
2134 	kvfree(chain->blob_next);
2135 }
2136 
nf_tables_chain_destroy(struct nft_chain * chain)2137 void nf_tables_chain_destroy(struct nft_chain *chain)
2138 {
2139 	const struct nft_table *table = chain->table;
2140 	struct nft_hook *hook, *next;
2141 
2142 	if (WARN_ON(chain->use > 0))
2143 		return;
2144 
2145 	/* no concurrent access possible anymore */
2146 	nf_tables_chain_free_chain_rules(chain);
2147 
2148 	if (nft_is_base_chain(chain)) {
2149 		struct nft_base_chain *basechain = nft_base_chain(chain);
2150 
2151 		if (nft_base_chain_netdev(table->family, basechain->ops.hooknum)) {
2152 			list_for_each_entry_safe(hook, next,
2153 						 &basechain->hook_list, list) {
2154 				list_del_rcu(&hook->list);
2155 				kfree_rcu(hook, rcu);
2156 			}
2157 		}
2158 		module_put(basechain->type->owner);
2159 		if (rcu_access_pointer(basechain->stats)) {
2160 			static_branch_dec(&nft_counters_enabled);
2161 			free_percpu(rcu_dereference_raw(basechain->stats));
2162 		}
2163 		kfree(chain->name);
2164 		kfree(chain->udata);
2165 		kfree(basechain);
2166 	} else {
2167 		kfree(chain->name);
2168 		kfree(chain->udata);
2169 		kfree(chain);
2170 	}
2171 }
2172 
nft_netdev_hook_alloc(struct net * net,const struct nlattr * attr)2173 static struct nft_hook *nft_netdev_hook_alloc(struct net *net,
2174 					      const struct nlattr *attr)
2175 {
2176 	struct net_device *dev;
2177 	char ifname[IFNAMSIZ];
2178 	struct nft_hook *hook;
2179 	int err;
2180 
2181 	hook = kzalloc(sizeof(struct nft_hook), GFP_KERNEL_ACCOUNT);
2182 	if (!hook) {
2183 		err = -ENOMEM;
2184 		goto err_hook_alloc;
2185 	}
2186 
2187 	nla_strscpy(ifname, attr, IFNAMSIZ);
2188 	/* nf_tables_netdev_event() is called under rtnl_mutex, this is
2189 	 * indirectly serializing all the other holders of the commit_mutex with
2190 	 * the rtnl_mutex.
2191 	 */
2192 	dev = __dev_get_by_name(net, ifname);
2193 	if (!dev) {
2194 		err = -ENOENT;
2195 		goto err_hook_dev;
2196 	}
2197 	hook->ops.dev = dev;
2198 
2199 	return hook;
2200 
2201 err_hook_dev:
2202 	kfree(hook);
2203 err_hook_alloc:
2204 	return ERR_PTR(err);
2205 }
2206 
nft_hook_list_find(struct list_head * hook_list,const struct nft_hook * this)2207 static struct nft_hook *nft_hook_list_find(struct list_head *hook_list,
2208 					   const struct nft_hook *this)
2209 {
2210 	struct nft_hook *hook;
2211 
2212 	list_for_each_entry(hook, hook_list, list) {
2213 		if (this->ops.dev == hook->ops.dev)
2214 			return hook;
2215 	}
2216 
2217 	return NULL;
2218 }
2219 
nf_tables_parse_netdev_hooks(struct net * net,const struct nlattr * attr,struct list_head * hook_list,struct netlink_ext_ack * extack)2220 static int nf_tables_parse_netdev_hooks(struct net *net,
2221 					const struct nlattr *attr,
2222 					struct list_head *hook_list,
2223 					struct netlink_ext_ack *extack)
2224 {
2225 	struct nft_hook *hook, *next;
2226 	const struct nlattr *tmp;
2227 	int rem, n = 0, err;
2228 
2229 	nla_for_each_nested(tmp, attr, rem) {
2230 		if (nla_type(tmp) != NFTA_DEVICE_NAME) {
2231 			err = -EINVAL;
2232 			goto err_hook;
2233 		}
2234 
2235 		hook = nft_netdev_hook_alloc(net, tmp);
2236 		if (IS_ERR(hook)) {
2237 			NL_SET_BAD_ATTR(extack, tmp);
2238 			err = PTR_ERR(hook);
2239 			goto err_hook;
2240 		}
2241 		if (nft_hook_list_find(hook_list, hook)) {
2242 			NL_SET_BAD_ATTR(extack, tmp);
2243 			kfree(hook);
2244 			err = -EEXIST;
2245 			goto err_hook;
2246 		}
2247 		list_add_tail(&hook->list, hook_list);
2248 		n++;
2249 
2250 		if (n == NFT_NETDEVICE_MAX) {
2251 			err = -EFBIG;
2252 			goto err_hook;
2253 		}
2254 	}
2255 
2256 	return 0;
2257 
2258 err_hook:
2259 	list_for_each_entry_safe(hook, next, hook_list, list) {
2260 		list_del(&hook->list);
2261 		kfree(hook);
2262 	}
2263 	return err;
2264 }
2265 
2266 struct nft_chain_hook {
2267 	u32				num;
2268 	s32				priority;
2269 	const struct nft_chain_type	*type;
2270 	struct list_head		list;
2271 };
2272 
nft_chain_parse_netdev(struct net * net,struct nlattr * tb[],struct list_head * hook_list,struct netlink_ext_ack * extack,u32 flags)2273 static int nft_chain_parse_netdev(struct net *net, struct nlattr *tb[],
2274 				  struct list_head *hook_list,
2275 				  struct netlink_ext_ack *extack, u32 flags)
2276 {
2277 	struct nft_hook *hook;
2278 	int err;
2279 
2280 	if (tb[NFTA_HOOK_DEV]) {
2281 		hook = nft_netdev_hook_alloc(net, tb[NFTA_HOOK_DEV]);
2282 		if (IS_ERR(hook)) {
2283 			NL_SET_BAD_ATTR(extack, tb[NFTA_HOOK_DEV]);
2284 			return PTR_ERR(hook);
2285 		}
2286 
2287 		list_add_tail(&hook->list, hook_list);
2288 	} else if (tb[NFTA_HOOK_DEVS]) {
2289 		err = nf_tables_parse_netdev_hooks(net, tb[NFTA_HOOK_DEVS],
2290 						   hook_list, extack);
2291 		if (err < 0)
2292 			return err;
2293 
2294 	}
2295 
2296 	if (flags & NFT_CHAIN_HW_OFFLOAD &&
2297 	    list_empty(hook_list))
2298 		return -EINVAL;
2299 
2300 	return 0;
2301 }
2302 
nft_chain_parse_hook(struct net * net,struct nft_base_chain * basechain,const struct nlattr * const nla[],struct nft_chain_hook * hook,u8 family,u32 flags,struct netlink_ext_ack * extack)2303 static int nft_chain_parse_hook(struct net *net,
2304 				struct nft_base_chain *basechain,
2305 				const struct nlattr * const nla[],
2306 				struct nft_chain_hook *hook, u8 family,
2307 				u32 flags, struct netlink_ext_ack *extack)
2308 {
2309 	struct nftables_pernet *nft_net = nft_pernet(net);
2310 	struct nlattr *ha[NFTA_HOOK_MAX + 1];
2311 	const struct nft_chain_type *type;
2312 	int err;
2313 
2314 	lockdep_assert_held(&nft_net->commit_mutex);
2315 	lockdep_nfnl_nft_mutex_not_held();
2316 
2317 	err = nla_parse_nested_deprecated(ha, NFTA_HOOK_MAX,
2318 					  nla[NFTA_CHAIN_HOOK],
2319 					  nft_hook_policy, NULL);
2320 	if (err < 0)
2321 		return err;
2322 
2323 	if (!basechain) {
2324 		if (!ha[NFTA_HOOK_HOOKNUM] ||
2325 		    !ha[NFTA_HOOK_PRIORITY]) {
2326 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]);
2327 			return -ENOENT;
2328 		}
2329 
2330 		hook->num = ntohl(nla_get_be32(ha[NFTA_HOOK_HOOKNUM]));
2331 		hook->priority = ntohl(nla_get_be32(ha[NFTA_HOOK_PRIORITY]));
2332 
2333 		type = __nft_chain_type_get(family, NFT_CHAIN_T_DEFAULT);
2334 		if (!type)
2335 			return -EOPNOTSUPP;
2336 
2337 		if (nla[NFTA_CHAIN_TYPE]) {
2338 			type = nf_tables_chain_type_lookup(net, nla[NFTA_CHAIN_TYPE],
2339 							   family, true);
2340 			if (IS_ERR(type)) {
2341 				NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TYPE]);
2342 				return PTR_ERR(type);
2343 			}
2344 		}
2345 		if (hook->num >= NFT_MAX_HOOKS || !(type->hook_mask & (1 << hook->num)))
2346 			return -EOPNOTSUPP;
2347 
2348 		if (type->type == NFT_CHAIN_T_NAT &&
2349 		    hook->priority <= NF_IP_PRI_CONNTRACK)
2350 			return -EOPNOTSUPP;
2351 	} else {
2352 		if (ha[NFTA_HOOK_HOOKNUM]) {
2353 			hook->num = ntohl(nla_get_be32(ha[NFTA_HOOK_HOOKNUM]));
2354 			if (hook->num != basechain->ops.hooknum)
2355 				return -EOPNOTSUPP;
2356 		}
2357 		if (ha[NFTA_HOOK_PRIORITY]) {
2358 			hook->priority = ntohl(nla_get_be32(ha[NFTA_HOOK_PRIORITY]));
2359 			if (hook->priority != basechain->ops.priority)
2360 				return -EOPNOTSUPP;
2361 		}
2362 
2363 		if (nla[NFTA_CHAIN_TYPE]) {
2364 			type = __nf_tables_chain_type_lookup(nla[NFTA_CHAIN_TYPE],
2365 							     family);
2366 			if (!type) {
2367 				NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TYPE]);
2368 				return -ENOENT;
2369 			}
2370 		} else {
2371 			type = basechain->type;
2372 		}
2373 	}
2374 
2375 	if (!try_module_get(type->owner)) {
2376 		if (nla[NFTA_CHAIN_TYPE])
2377 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TYPE]);
2378 		return -ENOENT;
2379 	}
2380 
2381 	hook->type = type;
2382 
2383 	INIT_LIST_HEAD(&hook->list);
2384 	if (nft_base_chain_netdev(family, hook->num)) {
2385 		err = nft_chain_parse_netdev(net, ha, &hook->list, extack, flags);
2386 		if (err < 0) {
2387 			module_put(type->owner);
2388 			return err;
2389 		}
2390 	} else if (ha[NFTA_HOOK_DEV] || ha[NFTA_HOOK_DEVS]) {
2391 		module_put(type->owner);
2392 		return -EOPNOTSUPP;
2393 	}
2394 
2395 	return 0;
2396 }
2397 
nft_chain_release_hook(struct nft_chain_hook * hook)2398 static void nft_chain_release_hook(struct nft_chain_hook *hook)
2399 {
2400 	struct nft_hook *h, *next;
2401 
2402 	list_for_each_entry_safe(h, next, &hook->list, list) {
2403 		list_del(&h->list);
2404 		kfree(h);
2405 	}
2406 	module_put(hook->type->owner);
2407 }
2408 
nft_last_rule(const struct nft_chain * chain,const void * ptr)2409 static void nft_last_rule(const struct nft_chain *chain, const void *ptr)
2410 {
2411 	struct nft_rule_dp_last *lrule;
2412 
2413 	BUILD_BUG_ON(offsetof(struct nft_rule_dp_last, end) != 0);
2414 
2415 	lrule = (struct nft_rule_dp_last *)ptr;
2416 	lrule->end.is_last = 1;
2417 	lrule->chain = chain;
2418 	/* blob size does not include the trailer rule */
2419 }
2420 
nf_tables_chain_alloc_rules(const struct nft_chain * chain,unsigned int size)2421 static struct nft_rule_blob *nf_tables_chain_alloc_rules(const struct nft_chain *chain,
2422 							 unsigned int size)
2423 {
2424 	struct nft_rule_blob *blob;
2425 
2426 	if (size > INT_MAX)
2427 		return NULL;
2428 
2429 	size += sizeof(struct nft_rule_blob) + sizeof(struct nft_rule_dp_last);
2430 
2431 	blob = kvmalloc(size, GFP_KERNEL_ACCOUNT);
2432 	if (!blob)
2433 		return NULL;
2434 
2435 	blob->size = 0;
2436 	nft_last_rule(chain, blob->data);
2437 
2438 	return blob;
2439 }
2440 
nft_basechain_hook_init(struct nf_hook_ops * ops,u8 family,const struct nft_chain_hook * hook,struct nft_chain * chain)2441 static void nft_basechain_hook_init(struct nf_hook_ops *ops, u8 family,
2442 				    const struct nft_chain_hook *hook,
2443 				    struct nft_chain *chain)
2444 {
2445 	ops->pf			= family;
2446 	ops->hooknum		= hook->num;
2447 	ops->priority		= hook->priority;
2448 	ops->priv		= chain;
2449 	ops->hook		= hook->type->hooks[ops->hooknum];
2450 	ops->hook_ops_type	= NF_HOOK_OP_NF_TABLES;
2451 }
2452 
nft_basechain_init(struct nft_base_chain * basechain,u8 family,struct nft_chain_hook * hook,u32 flags)2453 static int nft_basechain_init(struct nft_base_chain *basechain, u8 family,
2454 			      struct nft_chain_hook *hook, u32 flags)
2455 {
2456 	struct nft_chain *chain;
2457 	struct nft_hook *h;
2458 
2459 	basechain->type = hook->type;
2460 	INIT_LIST_HEAD(&basechain->hook_list);
2461 	chain = &basechain->chain;
2462 
2463 	if (nft_base_chain_netdev(family, hook->num)) {
2464 		list_splice_init(&hook->list, &basechain->hook_list);
2465 		list_for_each_entry(h, &basechain->hook_list, list)
2466 			nft_basechain_hook_init(&h->ops, family, hook, chain);
2467 	}
2468 	nft_basechain_hook_init(&basechain->ops, family, hook, chain);
2469 
2470 	chain->flags |= NFT_CHAIN_BASE | flags;
2471 	basechain->policy = NF_ACCEPT;
2472 	if (chain->flags & NFT_CHAIN_HW_OFFLOAD &&
2473 	    !nft_chain_offload_support(basechain)) {
2474 		list_splice_init(&basechain->hook_list, &hook->list);
2475 		return -EOPNOTSUPP;
2476 	}
2477 
2478 	flow_block_init(&basechain->flow_block);
2479 
2480 	return 0;
2481 }
2482 
nft_chain_add(struct nft_table * table,struct nft_chain * chain)2483 int nft_chain_add(struct nft_table *table, struct nft_chain *chain)
2484 {
2485 	int err;
2486 
2487 	err = rhltable_insert_key(&table->chains_ht, chain->name,
2488 				  &chain->rhlhead, nft_chain_ht_params);
2489 	if (err)
2490 		return err;
2491 
2492 	list_add_tail_rcu(&chain->list, &table->chains);
2493 
2494 	return 0;
2495 }
2496 
2497 static u64 chain_id;
2498 
nf_tables_addchain(struct nft_ctx * ctx,u8 family,u8 genmask,u8 policy,u32 flags,struct netlink_ext_ack * extack)2499 static int nf_tables_addchain(struct nft_ctx *ctx, u8 family, u8 genmask,
2500 			      u8 policy, u32 flags,
2501 			      struct netlink_ext_ack *extack)
2502 {
2503 	const struct nlattr * const *nla = ctx->nla;
2504 	struct nft_table *table = ctx->table;
2505 	struct nft_base_chain *basechain;
2506 	struct net *net = ctx->net;
2507 	char name[NFT_NAME_MAXLEN];
2508 	struct nft_rule_blob *blob;
2509 	struct nft_trans *trans;
2510 	struct nft_chain *chain;
2511 	int err;
2512 
2513 	if (nla[NFTA_CHAIN_HOOK]) {
2514 		struct nft_stats __percpu *stats = NULL;
2515 		struct nft_chain_hook hook = {};
2516 
2517 		if (table->flags & __NFT_TABLE_F_UPDATE)
2518 			return -EINVAL;
2519 
2520 		if (flags & NFT_CHAIN_BINDING)
2521 			return -EOPNOTSUPP;
2522 
2523 		err = nft_chain_parse_hook(net, NULL, nla, &hook, family, flags,
2524 					   extack);
2525 		if (err < 0)
2526 			return err;
2527 
2528 		basechain = kzalloc(sizeof(*basechain), GFP_KERNEL_ACCOUNT);
2529 		if (basechain == NULL) {
2530 			nft_chain_release_hook(&hook);
2531 			return -ENOMEM;
2532 		}
2533 		chain = &basechain->chain;
2534 
2535 		if (nla[NFTA_CHAIN_COUNTERS]) {
2536 			stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]);
2537 			if (IS_ERR(stats)) {
2538 				nft_chain_release_hook(&hook);
2539 				kfree(basechain);
2540 				return PTR_ERR(stats);
2541 			}
2542 			rcu_assign_pointer(basechain->stats, stats);
2543 		}
2544 
2545 		err = nft_basechain_init(basechain, family, &hook, flags);
2546 		if (err < 0) {
2547 			nft_chain_release_hook(&hook);
2548 			kfree(basechain);
2549 			free_percpu(stats);
2550 			return err;
2551 		}
2552 		if (stats)
2553 			static_branch_inc(&nft_counters_enabled);
2554 	} else {
2555 		if (flags & NFT_CHAIN_BASE)
2556 			return -EINVAL;
2557 		if (flags & NFT_CHAIN_HW_OFFLOAD)
2558 			return -EOPNOTSUPP;
2559 
2560 		chain = kzalloc(sizeof(*chain), GFP_KERNEL_ACCOUNT);
2561 		if (chain == NULL)
2562 			return -ENOMEM;
2563 
2564 		chain->flags = flags;
2565 	}
2566 	ctx->chain = chain;
2567 
2568 	INIT_LIST_HEAD(&chain->rules);
2569 	chain->handle = nf_tables_alloc_handle(table);
2570 	chain->table = table;
2571 
2572 	if (nla[NFTA_CHAIN_NAME]) {
2573 		chain->name = nla_strdup(nla[NFTA_CHAIN_NAME], GFP_KERNEL_ACCOUNT);
2574 	} else {
2575 		if (!(flags & NFT_CHAIN_BINDING)) {
2576 			err = -EINVAL;
2577 			goto err_destroy_chain;
2578 		}
2579 
2580 		snprintf(name, sizeof(name), "__chain%llu", ++chain_id);
2581 		chain->name = kstrdup(name, GFP_KERNEL_ACCOUNT);
2582 	}
2583 
2584 	if (!chain->name) {
2585 		err = -ENOMEM;
2586 		goto err_destroy_chain;
2587 	}
2588 
2589 	if (nla[NFTA_CHAIN_USERDATA]) {
2590 		chain->udata = nla_memdup(nla[NFTA_CHAIN_USERDATA], GFP_KERNEL_ACCOUNT);
2591 		if (chain->udata == NULL) {
2592 			err = -ENOMEM;
2593 			goto err_destroy_chain;
2594 		}
2595 		chain->udlen = nla_len(nla[NFTA_CHAIN_USERDATA]);
2596 	}
2597 
2598 	blob = nf_tables_chain_alloc_rules(chain, 0);
2599 	if (!blob) {
2600 		err = -ENOMEM;
2601 		goto err_destroy_chain;
2602 	}
2603 
2604 	RCU_INIT_POINTER(chain->blob_gen_0, blob);
2605 	RCU_INIT_POINTER(chain->blob_gen_1, blob);
2606 
2607 	if (!nft_use_inc(&table->use)) {
2608 		err = -EMFILE;
2609 		goto err_destroy_chain;
2610 	}
2611 
2612 	trans = nft_trans_chain_add(ctx, NFT_MSG_NEWCHAIN);
2613 	if (IS_ERR(trans)) {
2614 		err = PTR_ERR(trans);
2615 		goto err_trans;
2616 	}
2617 
2618 	nft_trans_chain_policy(trans) = NFT_CHAIN_POLICY_UNSET;
2619 	if (nft_is_base_chain(chain))
2620 		nft_trans_chain_policy(trans) = policy;
2621 
2622 	err = nft_chain_add(table, chain);
2623 	if (err < 0)
2624 		goto err_chain_add;
2625 
2626 	/* This must be LAST to ensure no packets are walking over this chain. */
2627 	err = nf_tables_register_hook(net, table, chain);
2628 	if (err < 0)
2629 		goto err_register_hook;
2630 
2631 	return 0;
2632 
2633 err_register_hook:
2634 	nft_chain_del(chain);
2635 err_chain_add:
2636 	nft_trans_destroy(trans);
2637 err_trans:
2638 	nft_use_dec_restore(&table->use);
2639 err_destroy_chain:
2640 	nf_tables_chain_destroy(chain);
2641 
2642 	return err;
2643 }
2644 
nf_tables_updchain(struct nft_ctx * ctx,u8 genmask,u8 policy,u32 flags,const struct nlattr * attr,struct netlink_ext_ack * extack)2645 static int nf_tables_updchain(struct nft_ctx *ctx, u8 genmask, u8 policy,
2646 			      u32 flags, const struct nlattr *attr,
2647 			      struct netlink_ext_ack *extack)
2648 {
2649 	const struct nlattr * const *nla = ctx->nla;
2650 	struct nft_base_chain *basechain = NULL;
2651 	struct nft_table *table = ctx->table;
2652 	struct nft_chain *chain = ctx->chain;
2653 	struct nft_chain_hook hook = {};
2654 	struct nft_stats *stats = NULL;
2655 	struct nft_hook *h, *next;
2656 	struct nf_hook_ops *ops;
2657 	struct nft_trans *trans;
2658 	bool unregister = false;
2659 	int err;
2660 
2661 	if (chain->flags ^ flags)
2662 		return -EOPNOTSUPP;
2663 
2664 	INIT_LIST_HEAD(&hook.list);
2665 
2666 	if (nla[NFTA_CHAIN_HOOK]) {
2667 		if (!nft_is_base_chain(chain)) {
2668 			NL_SET_BAD_ATTR(extack, attr);
2669 			return -EEXIST;
2670 		}
2671 
2672 		basechain = nft_base_chain(chain);
2673 		err = nft_chain_parse_hook(ctx->net, basechain, nla, &hook,
2674 					   ctx->family, flags, extack);
2675 		if (err < 0)
2676 			return err;
2677 
2678 		if (basechain->type != hook.type) {
2679 			nft_chain_release_hook(&hook);
2680 			NL_SET_BAD_ATTR(extack, attr);
2681 			return -EEXIST;
2682 		}
2683 
2684 		if (nft_base_chain_netdev(ctx->family, basechain->ops.hooknum)) {
2685 			list_for_each_entry_safe(h, next, &hook.list, list) {
2686 				h->ops.pf	= basechain->ops.pf;
2687 				h->ops.hooknum	= basechain->ops.hooknum;
2688 				h->ops.priority	= basechain->ops.priority;
2689 				h->ops.priv	= basechain->ops.priv;
2690 				h->ops.hook	= basechain->ops.hook;
2691 
2692 				if (nft_hook_list_find(&basechain->hook_list, h)) {
2693 					list_del(&h->list);
2694 					kfree(h);
2695 				}
2696 			}
2697 		} else {
2698 			ops = &basechain->ops;
2699 			if (ops->hooknum != hook.num ||
2700 			    ops->priority != hook.priority) {
2701 				nft_chain_release_hook(&hook);
2702 				NL_SET_BAD_ATTR(extack, attr);
2703 				return -EEXIST;
2704 			}
2705 		}
2706 	}
2707 
2708 	if (nla[NFTA_CHAIN_HANDLE] &&
2709 	    nla[NFTA_CHAIN_NAME]) {
2710 		struct nft_chain *chain2;
2711 
2712 		chain2 = nft_chain_lookup(ctx->net, table,
2713 					  nla[NFTA_CHAIN_NAME], genmask);
2714 		if (!IS_ERR(chain2)) {
2715 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]);
2716 			err = -EEXIST;
2717 			goto err_hooks;
2718 		}
2719 	}
2720 
2721 	if (table->flags & __NFT_TABLE_F_UPDATE &&
2722 	    !list_empty(&hook.list)) {
2723 		NL_SET_BAD_ATTR(extack, attr);
2724 		err = -EOPNOTSUPP;
2725 		goto err_hooks;
2726 	}
2727 
2728 	if (!(table->flags & NFT_TABLE_F_DORMANT) &&
2729 	    nft_is_base_chain(chain) &&
2730 	    !list_empty(&hook.list)) {
2731 		basechain = nft_base_chain(chain);
2732 		ops = &basechain->ops;
2733 
2734 		if (nft_base_chain_netdev(table->family, basechain->ops.hooknum)) {
2735 			err = nft_netdev_register_hooks(ctx->net, &hook.list);
2736 			if (err < 0)
2737 				goto err_hooks;
2738 		}
2739 	}
2740 
2741 	unregister = true;
2742 
2743 	if (nla[NFTA_CHAIN_COUNTERS]) {
2744 		if (!nft_is_base_chain(chain)) {
2745 			err = -EOPNOTSUPP;
2746 			goto err_hooks;
2747 		}
2748 
2749 		stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]);
2750 		if (IS_ERR(stats)) {
2751 			err = PTR_ERR(stats);
2752 			goto err_hooks;
2753 		}
2754 	}
2755 
2756 	err = -ENOMEM;
2757 	trans = nft_trans_alloc_chain(ctx, NFT_MSG_NEWCHAIN);
2758 	if (trans == NULL)
2759 		goto err_trans;
2760 
2761 	nft_trans_chain_stats(trans) = stats;
2762 	nft_trans_chain_update(trans) = true;
2763 
2764 	if (nla[NFTA_CHAIN_POLICY])
2765 		nft_trans_chain_policy(trans) = policy;
2766 	else
2767 		nft_trans_chain_policy(trans) = -1;
2768 
2769 	if (nla[NFTA_CHAIN_HANDLE] &&
2770 	    nla[NFTA_CHAIN_NAME]) {
2771 		struct nftables_pernet *nft_net = nft_pernet(ctx->net);
2772 		struct nft_trans *tmp;
2773 		char *name;
2774 
2775 		err = -ENOMEM;
2776 		name = nla_strdup(nla[NFTA_CHAIN_NAME], GFP_KERNEL_ACCOUNT);
2777 		if (!name)
2778 			goto err_trans;
2779 
2780 		err = -EEXIST;
2781 		list_for_each_entry(tmp, &nft_net->commit_list, list) {
2782 			if (tmp->msg_type == NFT_MSG_NEWCHAIN &&
2783 			    tmp->table == table &&
2784 			    nft_trans_chain_update(tmp) &&
2785 			    nft_trans_chain_name(tmp) &&
2786 			    strcmp(name, nft_trans_chain_name(tmp)) == 0) {
2787 				NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_NAME]);
2788 				kfree(name);
2789 				goto err_trans;
2790 			}
2791 		}
2792 
2793 		nft_trans_chain_name(trans) = name;
2794 	}
2795 
2796 	nft_trans_basechain(trans) = basechain;
2797 	INIT_LIST_HEAD(&nft_trans_chain_hooks(trans));
2798 	list_splice(&hook.list, &nft_trans_chain_hooks(trans));
2799 	if (nla[NFTA_CHAIN_HOOK])
2800 		module_put(hook.type->owner);
2801 
2802 	nft_trans_commit_list_add_tail(ctx->net, trans);
2803 
2804 	return 0;
2805 
2806 err_trans:
2807 	free_percpu(stats);
2808 	kfree(trans);
2809 err_hooks:
2810 	if (nla[NFTA_CHAIN_HOOK]) {
2811 		list_for_each_entry_safe(h, next, &hook.list, list) {
2812 			if (unregister)
2813 				nf_unregister_net_hook(ctx->net, &h->ops);
2814 			list_del(&h->list);
2815 			kfree_rcu(h, rcu);
2816 		}
2817 		module_put(hook.type->owner);
2818 	}
2819 
2820 	return err;
2821 }
2822 
nft_chain_lookup_byid(const struct net * net,const struct nft_table * table,const struct nlattr * nla,u8 genmask)2823 static struct nft_chain *nft_chain_lookup_byid(const struct net *net,
2824 					       const struct nft_table *table,
2825 					       const struct nlattr *nla, u8 genmask)
2826 {
2827 	struct nftables_pernet *nft_net = nft_pernet(net);
2828 	u32 id = ntohl(nla_get_be32(nla));
2829 	struct nft_trans *trans;
2830 
2831 	list_for_each_entry(trans, &nft_net->commit_list, list) {
2832 		if (trans->msg_type == NFT_MSG_NEWCHAIN &&
2833 		    nft_trans_chain(trans)->table == table &&
2834 		    id == nft_trans_chain_id(trans) &&
2835 		    nft_active_genmask(nft_trans_chain(trans), genmask))
2836 			return nft_trans_chain(trans);
2837 	}
2838 	return ERR_PTR(-ENOENT);
2839 }
2840 
nf_tables_newchain(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])2841 static int nf_tables_newchain(struct sk_buff *skb, const struct nfnl_info *info,
2842 			      const struct nlattr * const nla[])
2843 {
2844 	struct nftables_pernet *nft_net = nft_pernet(info->net);
2845 	struct netlink_ext_ack *extack = info->extack;
2846 	u8 genmask = nft_genmask_next(info->net);
2847 	u8 family = info->nfmsg->nfgen_family;
2848 	struct nft_chain *chain = NULL;
2849 	struct net *net = info->net;
2850 	const struct nlattr *attr;
2851 	struct nft_table *table;
2852 	u8 policy = NF_ACCEPT;
2853 	struct nft_ctx ctx;
2854 	u64 handle = 0;
2855 	u32 flags = 0;
2856 
2857 	lockdep_assert_held(&nft_net->commit_mutex);
2858 
2859 	table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask,
2860 				 NETLINK_CB(skb).portid);
2861 	if (IS_ERR(table)) {
2862 		NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]);
2863 		return PTR_ERR(table);
2864 	}
2865 
2866 	chain = NULL;
2867 	attr = nla[NFTA_CHAIN_NAME];
2868 
2869 	if (nla[NFTA_CHAIN_HANDLE]) {
2870 		handle = be64_to_cpu(nla_get_be64(nla[NFTA_CHAIN_HANDLE]));
2871 		chain = nft_chain_lookup_byhandle(table, handle, genmask);
2872 		if (IS_ERR(chain)) {
2873 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_HANDLE]);
2874 			return PTR_ERR(chain);
2875 		}
2876 		attr = nla[NFTA_CHAIN_HANDLE];
2877 	} else if (nla[NFTA_CHAIN_NAME]) {
2878 		chain = nft_chain_lookup(net, table, attr, genmask);
2879 		if (IS_ERR(chain)) {
2880 			if (PTR_ERR(chain) != -ENOENT) {
2881 				NL_SET_BAD_ATTR(extack, attr);
2882 				return PTR_ERR(chain);
2883 			}
2884 			chain = NULL;
2885 		}
2886 	} else if (!nla[NFTA_CHAIN_ID]) {
2887 		return -EINVAL;
2888 	}
2889 
2890 	if (nla[NFTA_CHAIN_POLICY]) {
2891 		if (chain != NULL &&
2892 		    !nft_is_base_chain(chain)) {
2893 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_POLICY]);
2894 			return -EOPNOTSUPP;
2895 		}
2896 
2897 		if (chain == NULL &&
2898 		    nla[NFTA_CHAIN_HOOK] == NULL) {
2899 			NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_POLICY]);
2900 			return -EOPNOTSUPP;
2901 		}
2902 
2903 		policy = ntohl(nla_get_be32(nla[NFTA_CHAIN_POLICY]));
2904 		switch (policy) {
2905 		case NF_DROP:
2906 		case NF_ACCEPT:
2907 			break;
2908 		default:
2909 			return -EINVAL;
2910 		}
2911 	}
2912 
2913 	if (nla[NFTA_CHAIN_FLAGS])
2914 		flags = ntohl(nla_get_be32(nla[NFTA_CHAIN_FLAGS]));
2915 	else if (chain)
2916 		flags = chain->flags;
2917 
2918 	if (flags & ~NFT_CHAIN_FLAGS)
2919 		return -EOPNOTSUPP;
2920 
2921 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla);
2922 
2923 	if (chain != NULL) {
2924 		if (chain->flags & NFT_CHAIN_BINDING)
2925 			return -EINVAL;
2926 
2927 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
2928 			NL_SET_BAD_ATTR(extack, attr);
2929 			return -EEXIST;
2930 		}
2931 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
2932 			return -EOPNOTSUPP;
2933 
2934 		flags |= chain->flags & NFT_CHAIN_BASE;
2935 		return nf_tables_updchain(&ctx, genmask, policy, flags, attr,
2936 					  extack);
2937 	}
2938 
2939 	return nf_tables_addchain(&ctx, family, genmask, policy, flags, extack);
2940 }
2941 
nft_delchain_hook(struct nft_ctx * ctx,struct nft_base_chain * basechain,struct netlink_ext_ack * extack)2942 static int nft_delchain_hook(struct nft_ctx *ctx,
2943 			     struct nft_base_chain *basechain,
2944 			     struct netlink_ext_ack *extack)
2945 {
2946 	const struct nft_chain *chain = &basechain->chain;
2947 	const struct nlattr * const *nla = ctx->nla;
2948 	struct nft_chain_hook chain_hook = {};
2949 	struct nft_hook *this, *hook;
2950 	LIST_HEAD(chain_del_list);
2951 	struct nft_trans *trans;
2952 	int err;
2953 
2954 	if (ctx->table->flags & __NFT_TABLE_F_UPDATE)
2955 		return -EOPNOTSUPP;
2956 
2957 	err = nft_chain_parse_hook(ctx->net, basechain, nla, &chain_hook,
2958 				   ctx->family, chain->flags, extack);
2959 	if (err < 0)
2960 		return err;
2961 
2962 	list_for_each_entry(this, &chain_hook.list, list) {
2963 		hook = nft_hook_list_find(&basechain->hook_list, this);
2964 		if (!hook) {
2965 			err = -ENOENT;
2966 			goto err_chain_del_hook;
2967 		}
2968 		list_move(&hook->list, &chain_del_list);
2969 	}
2970 
2971 	trans = nft_trans_alloc_chain(ctx, NFT_MSG_DELCHAIN);
2972 	if (!trans) {
2973 		err = -ENOMEM;
2974 		goto err_chain_del_hook;
2975 	}
2976 
2977 	nft_trans_basechain(trans) = basechain;
2978 	nft_trans_chain_update(trans) = true;
2979 	INIT_LIST_HEAD(&nft_trans_chain_hooks(trans));
2980 	list_splice(&chain_del_list, &nft_trans_chain_hooks(trans));
2981 	nft_chain_release_hook(&chain_hook);
2982 
2983 	nft_trans_commit_list_add_tail(ctx->net, trans);
2984 
2985 	return 0;
2986 
2987 err_chain_del_hook:
2988 	list_splice(&chain_del_list, &basechain->hook_list);
2989 	nft_chain_release_hook(&chain_hook);
2990 
2991 	return err;
2992 }
2993 
nf_tables_delchain(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])2994 static int nf_tables_delchain(struct sk_buff *skb, const struct nfnl_info *info,
2995 			      const struct nlattr * const nla[])
2996 {
2997 	struct netlink_ext_ack *extack = info->extack;
2998 	u8 genmask = nft_genmask_next(info->net);
2999 	u8 family = info->nfmsg->nfgen_family;
3000 	struct net *net = info->net;
3001 	const struct nlattr *attr;
3002 	struct nft_table *table;
3003 	struct nft_chain *chain;
3004 	struct nft_rule *rule;
3005 	struct nft_ctx ctx;
3006 	u64 handle;
3007 	u32 use;
3008 	int err;
3009 
3010 	table = nft_table_lookup(net, nla[NFTA_CHAIN_TABLE], family, genmask,
3011 				 NETLINK_CB(skb).portid);
3012 	if (IS_ERR(table)) {
3013 		NL_SET_BAD_ATTR(extack, nla[NFTA_CHAIN_TABLE]);
3014 		return PTR_ERR(table);
3015 	}
3016 
3017 	if (nla[NFTA_CHAIN_HANDLE]) {
3018 		attr = nla[NFTA_CHAIN_HANDLE];
3019 		handle = be64_to_cpu(nla_get_be64(attr));
3020 		chain = nft_chain_lookup_byhandle(table, handle, genmask);
3021 	} else {
3022 		attr = nla[NFTA_CHAIN_NAME];
3023 		chain = nft_chain_lookup(net, table, attr, genmask);
3024 	}
3025 	if (IS_ERR(chain)) {
3026 		if (PTR_ERR(chain) == -ENOENT &&
3027 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYCHAIN)
3028 			return 0;
3029 
3030 		NL_SET_BAD_ATTR(extack, attr);
3031 		return PTR_ERR(chain);
3032 	}
3033 
3034 	if (nft_chain_binding(chain))
3035 		return -EOPNOTSUPP;
3036 
3037 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla);
3038 
3039 	if (nla[NFTA_CHAIN_HOOK]) {
3040 		if (NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYCHAIN ||
3041 		    chain->flags & NFT_CHAIN_HW_OFFLOAD)
3042 			return -EOPNOTSUPP;
3043 
3044 		if (nft_is_base_chain(chain)) {
3045 			struct nft_base_chain *basechain = nft_base_chain(chain);
3046 
3047 			if (nft_base_chain_netdev(table->family, basechain->ops.hooknum))
3048 				return nft_delchain_hook(&ctx, basechain, extack);
3049 		}
3050 	}
3051 
3052 	if (info->nlh->nlmsg_flags & NLM_F_NONREC &&
3053 	    chain->use > 0)
3054 		return -EBUSY;
3055 
3056 	use = chain->use;
3057 	list_for_each_entry(rule, &chain->rules, list) {
3058 		if (!nft_is_active_next(net, rule))
3059 			continue;
3060 		use--;
3061 
3062 		err = nft_delrule(&ctx, rule);
3063 		if (err < 0)
3064 			return err;
3065 	}
3066 
3067 	/* There are rules and elements that are still holding references to us,
3068 	 * we cannot do a recursive removal in this case.
3069 	 */
3070 	if (use > 0) {
3071 		NL_SET_BAD_ATTR(extack, attr);
3072 		return -EBUSY;
3073 	}
3074 
3075 	return nft_delchain(&ctx);
3076 }
3077 
3078 /*
3079  * Expressions
3080  */
3081 
3082 /**
3083  *	nft_register_expr - register nf_tables expr type
3084  *	@type: expr type
3085  *
3086  *	Registers the expr type for use with nf_tables. Returns zero on
3087  *	success or a negative errno code otherwise.
3088  */
nft_register_expr(struct nft_expr_type * type)3089 int nft_register_expr(struct nft_expr_type *type)
3090 {
3091 	if (WARN_ON_ONCE(type->maxattr > NFT_EXPR_MAXATTR))
3092 		return -ENOMEM;
3093 
3094 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
3095 	if (type->family == NFPROTO_UNSPEC)
3096 		list_add_tail_rcu(&type->list, &nf_tables_expressions);
3097 	else
3098 		list_add_rcu(&type->list, &nf_tables_expressions);
3099 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
3100 	return 0;
3101 }
3102 EXPORT_SYMBOL_GPL(nft_register_expr);
3103 
3104 /**
3105  *	nft_unregister_expr - unregister nf_tables expr type
3106  *	@type: expr type
3107  *
3108  * 	Unregisters the expr typefor use with nf_tables.
3109  */
nft_unregister_expr(struct nft_expr_type * type)3110 void nft_unregister_expr(struct nft_expr_type *type)
3111 {
3112 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
3113 	list_del_rcu(&type->list);
3114 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
3115 }
3116 EXPORT_SYMBOL_GPL(nft_unregister_expr);
3117 
__nft_expr_type_get(u8 family,struct nlattr * nla)3118 static const struct nft_expr_type *__nft_expr_type_get(u8 family,
3119 						       struct nlattr *nla)
3120 {
3121 	const struct nft_expr_type *type, *candidate = NULL;
3122 
3123 	list_for_each_entry_rcu(type, &nf_tables_expressions, list) {
3124 		if (!nla_strcmp(nla, type->name)) {
3125 			if (!type->family && !candidate)
3126 				candidate = type;
3127 			else if (type->family == family)
3128 				candidate = type;
3129 		}
3130 	}
3131 	return candidate;
3132 }
3133 
3134 #ifdef CONFIG_MODULES
nft_expr_type_request_module(struct net * net,u8 family,struct nlattr * nla)3135 static int nft_expr_type_request_module(struct net *net, u8 family,
3136 					struct nlattr *nla)
3137 {
3138 	if (nft_request_module(net, "nft-expr-%u-%.*s", family,
3139 			       nla_len(nla), (char *)nla_data(nla)) == -EAGAIN)
3140 		return -EAGAIN;
3141 
3142 	return 0;
3143 }
3144 #endif
3145 
nft_expr_type_get(struct net * net,u8 family,struct nlattr * nla)3146 static const struct nft_expr_type *nft_expr_type_get(struct net *net,
3147 						     u8 family,
3148 						     struct nlattr *nla)
3149 {
3150 	const struct nft_expr_type *type;
3151 
3152 	if (nla == NULL)
3153 		return ERR_PTR(-EINVAL);
3154 
3155 	rcu_read_lock();
3156 	type = __nft_expr_type_get(family, nla);
3157 	if (type != NULL && try_module_get(type->owner)) {
3158 		rcu_read_unlock();
3159 		return type;
3160 	}
3161 	rcu_read_unlock();
3162 
3163 	lockdep_nfnl_nft_mutex_not_held();
3164 #ifdef CONFIG_MODULES
3165 	if (type == NULL) {
3166 		if (nft_expr_type_request_module(net, family, nla) == -EAGAIN)
3167 			return ERR_PTR(-EAGAIN);
3168 
3169 		if (nft_request_module(net, "nft-expr-%.*s",
3170 				       nla_len(nla),
3171 				       (char *)nla_data(nla)) == -EAGAIN)
3172 			return ERR_PTR(-EAGAIN);
3173 	}
3174 #endif
3175 	return ERR_PTR(-ENOENT);
3176 }
3177 
3178 static const struct nla_policy nft_expr_policy[NFTA_EXPR_MAX + 1] = {
3179 	[NFTA_EXPR_NAME]	= { .type = NLA_STRING,
3180 				    .len = NFT_MODULE_AUTOLOAD_LIMIT },
3181 	[NFTA_EXPR_DATA]	= { .type = NLA_NESTED },
3182 };
3183 
nf_tables_fill_expr_info(struct sk_buff * skb,const struct nft_expr * expr,bool reset)3184 static int nf_tables_fill_expr_info(struct sk_buff *skb,
3185 				    const struct nft_expr *expr, bool reset)
3186 {
3187 	if (nla_put_string(skb, NFTA_EXPR_NAME, expr->ops->type->name))
3188 		goto nla_put_failure;
3189 
3190 	if (expr->ops->dump) {
3191 		struct nlattr *data = nla_nest_start_noflag(skb,
3192 							    NFTA_EXPR_DATA);
3193 		if (data == NULL)
3194 			goto nla_put_failure;
3195 		if (expr->ops->dump(skb, expr, reset) < 0)
3196 			goto nla_put_failure;
3197 		nla_nest_end(skb, data);
3198 	}
3199 
3200 	return skb->len;
3201 
3202 nla_put_failure:
3203 	return -1;
3204 };
3205 
nft_expr_dump(struct sk_buff * skb,unsigned int attr,const struct nft_expr * expr,bool reset)3206 int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
3207 		  const struct nft_expr *expr, bool reset)
3208 {
3209 	struct nlattr *nest;
3210 
3211 	nest = nla_nest_start_noflag(skb, attr);
3212 	if (!nest)
3213 		goto nla_put_failure;
3214 	if (nf_tables_fill_expr_info(skb, expr, reset) < 0)
3215 		goto nla_put_failure;
3216 	nla_nest_end(skb, nest);
3217 	return 0;
3218 
3219 nla_put_failure:
3220 	return -1;
3221 }
3222 
3223 struct nft_expr_info {
3224 	const struct nft_expr_ops	*ops;
3225 	const struct nlattr		*attr;
3226 	struct nlattr			*tb[NFT_EXPR_MAXATTR + 1];
3227 };
3228 
nf_tables_expr_parse(const struct nft_ctx * ctx,const struct nlattr * nla,struct nft_expr_info * info)3229 static int nf_tables_expr_parse(const struct nft_ctx *ctx,
3230 				const struct nlattr *nla,
3231 				struct nft_expr_info *info)
3232 {
3233 	const struct nft_expr_type *type;
3234 	const struct nft_expr_ops *ops;
3235 	struct nlattr *tb[NFTA_EXPR_MAX + 1];
3236 	int err;
3237 
3238 	err = nla_parse_nested_deprecated(tb, NFTA_EXPR_MAX, nla,
3239 					  nft_expr_policy, NULL);
3240 	if (err < 0)
3241 		return err;
3242 
3243 	type = nft_expr_type_get(ctx->net, ctx->family, tb[NFTA_EXPR_NAME]);
3244 	if (IS_ERR(type))
3245 		return PTR_ERR(type);
3246 
3247 	if (tb[NFTA_EXPR_DATA]) {
3248 		err = nla_parse_nested_deprecated(info->tb, type->maxattr,
3249 						  tb[NFTA_EXPR_DATA],
3250 						  type->policy, NULL);
3251 		if (err < 0)
3252 			goto err1;
3253 	} else
3254 		memset(info->tb, 0, sizeof(info->tb[0]) * (type->maxattr + 1));
3255 
3256 	if (type->select_ops != NULL) {
3257 		ops = type->select_ops(ctx,
3258 				       (const struct nlattr * const *)info->tb);
3259 		if (IS_ERR(ops)) {
3260 			err = PTR_ERR(ops);
3261 #ifdef CONFIG_MODULES
3262 			if (err == -EAGAIN)
3263 				if (nft_expr_type_request_module(ctx->net,
3264 								 ctx->family,
3265 								 tb[NFTA_EXPR_NAME]) != -EAGAIN)
3266 					err = -ENOENT;
3267 #endif
3268 			goto err1;
3269 		}
3270 	} else
3271 		ops = type->ops;
3272 
3273 	info->attr = nla;
3274 	info->ops = ops;
3275 
3276 	return 0;
3277 
3278 err1:
3279 	module_put(type->owner);
3280 	return err;
3281 }
3282 
nft_expr_inner_parse(const struct nft_ctx * ctx,const struct nlattr * nla,struct nft_expr_info * info)3283 int nft_expr_inner_parse(const struct nft_ctx *ctx, const struct nlattr *nla,
3284 			 struct nft_expr_info *info)
3285 {
3286 	struct nlattr *tb[NFTA_EXPR_MAX + 1];
3287 	const struct nft_expr_type *type;
3288 	int err;
3289 
3290 	err = nla_parse_nested_deprecated(tb, NFTA_EXPR_MAX, nla,
3291 					  nft_expr_policy, NULL);
3292 	if (err < 0)
3293 		return err;
3294 
3295 	if (!tb[NFTA_EXPR_DATA] || !tb[NFTA_EXPR_NAME])
3296 		return -EINVAL;
3297 
3298 	type = __nft_expr_type_get(ctx->family, tb[NFTA_EXPR_NAME]);
3299 	if (!type)
3300 		return -ENOENT;
3301 
3302 	if (!type->inner_ops)
3303 		return -EOPNOTSUPP;
3304 
3305 	err = nla_parse_nested_deprecated(info->tb, type->maxattr,
3306 					  tb[NFTA_EXPR_DATA],
3307 					  type->policy, NULL);
3308 	if (err < 0)
3309 		goto err_nla_parse;
3310 
3311 	info->attr = nla;
3312 	info->ops = type->inner_ops;
3313 
3314 	return 0;
3315 
3316 err_nla_parse:
3317 	return err;
3318 }
3319 
nf_tables_newexpr(const struct nft_ctx * ctx,const struct nft_expr_info * expr_info,struct nft_expr * expr)3320 static int nf_tables_newexpr(const struct nft_ctx *ctx,
3321 			     const struct nft_expr_info *expr_info,
3322 			     struct nft_expr *expr)
3323 {
3324 	const struct nft_expr_ops *ops = expr_info->ops;
3325 	int err;
3326 
3327 	expr->ops = ops;
3328 	if (ops->init) {
3329 		err = ops->init(ctx, expr, (const struct nlattr **)expr_info->tb);
3330 		if (err < 0)
3331 			goto err1;
3332 	}
3333 
3334 	return 0;
3335 err1:
3336 	expr->ops = NULL;
3337 	return err;
3338 }
3339 
nf_tables_expr_destroy(const struct nft_ctx * ctx,struct nft_expr * expr)3340 static void nf_tables_expr_destroy(const struct nft_ctx *ctx,
3341 				   struct nft_expr *expr)
3342 {
3343 	const struct nft_expr_type *type = expr->ops->type;
3344 
3345 	if (expr->ops->destroy)
3346 		expr->ops->destroy(ctx, expr);
3347 	module_put(type->owner);
3348 }
3349 
nft_expr_init(const struct nft_ctx * ctx,const struct nlattr * nla)3350 static struct nft_expr *nft_expr_init(const struct nft_ctx *ctx,
3351 				      const struct nlattr *nla)
3352 {
3353 	struct nft_expr_info expr_info;
3354 	struct nft_expr *expr;
3355 	struct module *owner;
3356 	int err;
3357 
3358 	err = nf_tables_expr_parse(ctx, nla, &expr_info);
3359 	if (err < 0)
3360 		goto err_expr_parse;
3361 
3362 	err = -EOPNOTSUPP;
3363 	if (!(expr_info.ops->type->flags & NFT_EXPR_STATEFUL))
3364 		goto err_expr_stateful;
3365 
3366 	err = -ENOMEM;
3367 	expr = kzalloc(expr_info.ops->size, GFP_KERNEL_ACCOUNT);
3368 	if (expr == NULL)
3369 		goto err_expr_stateful;
3370 
3371 	err = nf_tables_newexpr(ctx, &expr_info, expr);
3372 	if (err < 0)
3373 		goto err_expr_new;
3374 
3375 	return expr;
3376 err_expr_new:
3377 	kfree(expr);
3378 err_expr_stateful:
3379 	owner = expr_info.ops->type->owner;
3380 	if (expr_info.ops->type->release_ops)
3381 		expr_info.ops->type->release_ops(expr_info.ops);
3382 
3383 	module_put(owner);
3384 err_expr_parse:
3385 	return ERR_PTR(err);
3386 }
3387 
nft_expr_clone(struct nft_expr * dst,struct nft_expr * src,gfp_t gfp)3388 int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src, gfp_t gfp)
3389 {
3390 	int err;
3391 
3392 	if (WARN_ON_ONCE(!src->ops->clone))
3393 		return -EINVAL;
3394 
3395 	dst->ops = src->ops;
3396 	err = src->ops->clone(dst, src, gfp);
3397 	if (err < 0)
3398 		return err;
3399 
3400 	__module_get(src->ops->type->owner);
3401 
3402 	return 0;
3403 }
3404 
nft_expr_destroy(const struct nft_ctx * ctx,struct nft_expr * expr)3405 void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr)
3406 {
3407 	nf_tables_expr_destroy(ctx, expr);
3408 	kfree(expr);
3409 }
3410 
3411 /*
3412  * Rules
3413  */
3414 
__nft_rule_lookup(const struct nft_chain * chain,u64 handle)3415 static struct nft_rule *__nft_rule_lookup(const struct nft_chain *chain,
3416 					  u64 handle)
3417 {
3418 	struct nft_rule *rule;
3419 
3420 	// FIXME: this sucks
3421 	list_for_each_entry_rcu(rule, &chain->rules, list) {
3422 		if (handle == rule->handle)
3423 			return rule;
3424 	}
3425 
3426 	return ERR_PTR(-ENOENT);
3427 }
3428 
nft_rule_lookup(const struct nft_chain * chain,const struct nlattr * nla)3429 static struct nft_rule *nft_rule_lookup(const struct nft_chain *chain,
3430 					const struct nlattr *nla)
3431 {
3432 	if (nla == NULL)
3433 		return ERR_PTR(-EINVAL);
3434 
3435 	return __nft_rule_lookup(chain, be64_to_cpu(nla_get_be64(nla)));
3436 }
3437 
3438 static const struct nla_policy nft_rule_policy[NFTA_RULE_MAX + 1] = {
3439 	[NFTA_RULE_TABLE]	= { .type = NLA_STRING,
3440 				    .len = NFT_TABLE_MAXNAMELEN - 1 },
3441 	[NFTA_RULE_CHAIN]	= { .type = NLA_STRING,
3442 				    .len = NFT_CHAIN_MAXNAMELEN - 1 },
3443 	[NFTA_RULE_HANDLE]	= { .type = NLA_U64 },
3444 	[NFTA_RULE_EXPRESSIONS]	= NLA_POLICY_NESTED_ARRAY(nft_expr_policy),
3445 	[NFTA_RULE_COMPAT]	= { .type = NLA_NESTED },
3446 	[NFTA_RULE_POSITION]	= { .type = NLA_U64 },
3447 	[NFTA_RULE_USERDATA]	= { .type = NLA_BINARY,
3448 				    .len = NFT_USERDATA_MAXLEN },
3449 	[NFTA_RULE_ID]		= { .type = NLA_U32 },
3450 	[NFTA_RULE_POSITION_ID]	= { .type = NLA_U32 },
3451 	[NFTA_RULE_CHAIN_ID]	= { .type = NLA_U32 },
3452 };
3453 
nf_tables_fill_rule_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq,int event,u32 flags,int family,const struct nft_table * table,const struct nft_chain * chain,const struct nft_rule * rule,u64 handle,bool reset)3454 static int nf_tables_fill_rule_info(struct sk_buff *skb, struct net *net,
3455 				    u32 portid, u32 seq, int event,
3456 				    u32 flags, int family,
3457 				    const struct nft_table *table,
3458 				    const struct nft_chain *chain,
3459 				    const struct nft_rule *rule, u64 handle,
3460 				    bool reset)
3461 {
3462 	struct nlmsghdr *nlh;
3463 	const struct nft_expr *expr, *next;
3464 	struct nlattr *list;
3465 	u16 type = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
3466 
3467 	nlh = nfnl_msg_put(skb, portid, seq, type, flags, family, NFNETLINK_V0,
3468 			   nft_base_seq(net));
3469 	if (!nlh)
3470 		goto nla_put_failure;
3471 
3472 	if (nla_put_string(skb, NFTA_RULE_TABLE, table->name))
3473 		goto nla_put_failure;
3474 	if (nla_put_string(skb, NFTA_RULE_CHAIN, chain->name))
3475 		goto nla_put_failure;
3476 	if (nla_put_be64(skb, NFTA_RULE_HANDLE, cpu_to_be64(rule->handle),
3477 			 NFTA_RULE_PAD))
3478 		goto nla_put_failure;
3479 
3480 	if (event != NFT_MSG_DELRULE && handle) {
3481 		if (nla_put_be64(skb, NFTA_RULE_POSITION, cpu_to_be64(handle),
3482 				 NFTA_RULE_PAD))
3483 			goto nla_put_failure;
3484 	}
3485 
3486 	if (chain->flags & NFT_CHAIN_HW_OFFLOAD)
3487 		nft_flow_rule_stats(chain, rule);
3488 
3489 	list = nla_nest_start_noflag(skb, NFTA_RULE_EXPRESSIONS);
3490 	if (list == NULL)
3491 		goto nla_put_failure;
3492 	nft_rule_for_each_expr(expr, next, rule) {
3493 		if (nft_expr_dump(skb, NFTA_LIST_ELEM, expr, reset) < 0)
3494 			goto nla_put_failure;
3495 	}
3496 	nla_nest_end(skb, list);
3497 
3498 	if (rule->udata) {
3499 		struct nft_userdata *udata = nft_userdata(rule);
3500 		if (nla_put(skb, NFTA_RULE_USERDATA, udata->len + 1,
3501 			    udata->data) < 0)
3502 			goto nla_put_failure;
3503 	}
3504 
3505 	nlmsg_end(skb, nlh);
3506 	return 0;
3507 
3508 nla_put_failure:
3509 	nlmsg_trim(skb, nlh);
3510 	return -1;
3511 }
3512 
nf_tables_rule_notify(const struct nft_ctx * ctx,const struct nft_rule * rule,int event)3513 static void nf_tables_rule_notify(const struct nft_ctx *ctx,
3514 				  const struct nft_rule *rule, int event)
3515 {
3516 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
3517 	const struct nft_rule *prule;
3518 	struct sk_buff *skb;
3519 	u64 handle = 0;
3520 	u16 flags = 0;
3521 	int err;
3522 
3523 	if (!ctx->report &&
3524 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
3525 		return;
3526 
3527 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
3528 	if (skb == NULL)
3529 		goto err;
3530 
3531 	if (event == NFT_MSG_NEWRULE &&
3532 	    !list_is_first(&rule->list, &ctx->chain->rules) &&
3533 	    !list_is_last(&rule->list, &ctx->chain->rules)) {
3534 		prule = list_prev_entry(rule, list);
3535 		handle = prule->handle;
3536 	}
3537 	if (ctx->flags & (NLM_F_APPEND | NLM_F_REPLACE))
3538 		flags |= NLM_F_APPEND;
3539 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
3540 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
3541 
3542 	err = nf_tables_fill_rule_info(skb, ctx->net, ctx->portid, ctx->seq,
3543 				       event, flags, ctx->family, ctx->table,
3544 				       ctx->chain, rule, handle, false);
3545 	if (err < 0) {
3546 		kfree_skb(skb);
3547 		goto err;
3548 	}
3549 
3550 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
3551 	return;
3552 err:
3553 	nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
3554 }
3555 
audit_log_rule_reset(const struct nft_table * table,unsigned int base_seq,unsigned int nentries)3556 static void audit_log_rule_reset(const struct nft_table *table,
3557 				 unsigned int base_seq,
3558 				 unsigned int nentries)
3559 {
3560 	char *buf = kasprintf(GFP_ATOMIC, "%s:%u",
3561 			      table->name, base_seq);
3562 
3563 	audit_log_nfcfg(buf, table->family, nentries,
3564 			AUDIT_NFT_OP_RULE_RESET, GFP_ATOMIC);
3565 	kfree(buf);
3566 }
3567 
3568 struct nft_rule_dump_ctx {
3569 	unsigned int s_idx;
3570 	char *table;
3571 	char *chain;
3572 	bool reset;
3573 };
3574 
__nf_tables_dump_rules(struct sk_buff * skb,unsigned int * idx,struct netlink_callback * cb,const struct nft_table * table,const struct nft_chain * chain)3575 static int __nf_tables_dump_rules(struct sk_buff *skb,
3576 				  unsigned int *idx,
3577 				  struct netlink_callback *cb,
3578 				  const struct nft_table *table,
3579 				  const struct nft_chain *chain)
3580 {
3581 	struct nft_rule_dump_ctx *ctx = (void *)cb->ctx;
3582 	struct net *net = sock_net(skb->sk);
3583 	const struct nft_rule *rule, *prule;
3584 	unsigned int entries = 0;
3585 	int ret = 0;
3586 	u64 handle;
3587 
3588 	prule = NULL;
3589 	list_for_each_entry_rcu(rule, &chain->rules, list) {
3590 		if (!nft_is_active(net, rule))
3591 			goto cont_skip;
3592 		if (*idx < ctx->s_idx)
3593 			goto cont;
3594 		if (prule)
3595 			handle = prule->handle;
3596 		else
3597 			handle = 0;
3598 
3599 		if (nf_tables_fill_rule_info(skb, net, NETLINK_CB(cb->skb).portid,
3600 					cb->nlh->nlmsg_seq,
3601 					NFT_MSG_NEWRULE,
3602 					NLM_F_MULTI | NLM_F_APPEND,
3603 					table->family,
3604 					table, chain, rule, handle, ctx->reset) < 0) {
3605 			ret = 1;
3606 			break;
3607 		}
3608 		entries++;
3609 		nl_dump_check_consistent(cb, nlmsg_hdr(skb));
3610 cont:
3611 		prule = rule;
3612 cont_skip:
3613 		(*idx)++;
3614 	}
3615 
3616 	if (ctx->reset && entries)
3617 		audit_log_rule_reset(table, cb->seq, entries);
3618 
3619 	return ret;
3620 }
3621 
nf_tables_dump_rules(struct sk_buff * skb,struct netlink_callback * cb)3622 static int nf_tables_dump_rules(struct sk_buff *skb,
3623 				struct netlink_callback *cb)
3624 {
3625 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
3626 	struct nft_rule_dump_ctx *ctx = (void *)cb->ctx;
3627 	struct nft_table *table;
3628 	const struct nft_chain *chain;
3629 	unsigned int idx = 0;
3630 	struct net *net = sock_net(skb->sk);
3631 	int family = nfmsg->nfgen_family;
3632 	struct nftables_pernet *nft_net;
3633 
3634 	rcu_read_lock();
3635 	nft_net = nft_pernet(net);
3636 	cb->seq = READ_ONCE(nft_net->base_seq);
3637 
3638 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
3639 		if (family != NFPROTO_UNSPEC && family != table->family)
3640 			continue;
3641 
3642 		if (ctx->table && strcmp(ctx->table, table->name) != 0)
3643 			continue;
3644 
3645 		if (ctx->table && ctx->chain) {
3646 			struct rhlist_head *list, *tmp;
3647 
3648 			list = rhltable_lookup(&table->chains_ht, ctx->chain,
3649 					       nft_chain_ht_params);
3650 			if (!list)
3651 				goto done;
3652 
3653 			rhl_for_each_entry_rcu(chain, tmp, list, rhlhead) {
3654 				if (!nft_is_active(net, chain))
3655 					continue;
3656 				__nf_tables_dump_rules(skb, &idx,
3657 						       cb, table, chain);
3658 				break;
3659 			}
3660 			goto done;
3661 		}
3662 
3663 		list_for_each_entry_rcu(chain, &table->chains, list) {
3664 			if (__nf_tables_dump_rules(skb, &idx,
3665 						   cb, table, chain))
3666 				goto done;
3667 		}
3668 
3669 		if (ctx->table)
3670 			break;
3671 	}
3672 done:
3673 	rcu_read_unlock();
3674 
3675 	ctx->s_idx = idx;
3676 	return skb->len;
3677 }
3678 
nf_tables_dumpreset_rules(struct sk_buff * skb,struct netlink_callback * cb)3679 static int nf_tables_dumpreset_rules(struct sk_buff *skb,
3680 				     struct netlink_callback *cb)
3681 {
3682 	struct nftables_pernet *nft_net = nft_pernet(sock_net(skb->sk));
3683 	int ret;
3684 
3685 	/* Mutex is held is to prevent that two concurrent dump-and-reset calls
3686 	 * do not underrun counters and quotas. The commit_mutex is used for
3687 	 * the lack a better lock, this is not transaction path.
3688 	 */
3689 	mutex_lock(&nft_net->commit_mutex);
3690 	ret = nf_tables_dump_rules(skb, cb);
3691 	mutex_unlock(&nft_net->commit_mutex);
3692 
3693 	return ret;
3694 }
3695 
nf_tables_dump_rules_start(struct netlink_callback * cb)3696 static int nf_tables_dump_rules_start(struct netlink_callback *cb)
3697 {
3698 	struct nft_rule_dump_ctx *ctx = (void *)cb->ctx;
3699 	const struct nlattr * const *nla = cb->data;
3700 
3701 	BUILD_BUG_ON(sizeof(*ctx) > sizeof(cb->ctx));
3702 
3703 	if (nla[NFTA_RULE_TABLE]) {
3704 		ctx->table = nla_strdup(nla[NFTA_RULE_TABLE], GFP_ATOMIC);
3705 		if (!ctx->table)
3706 			return -ENOMEM;
3707 	}
3708 	if (nla[NFTA_RULE_CHAIN]) {
3709 		ctx->chain = nla_strdup(nla[NFTA_RULE_CHAIN], GFP_ATOMIC);
3710 		if (!ctx->chain) {
3711 			kfree(ctx->table);
3712 			return -ENOMEM;
3713 		}
3714 	}
3715 	return 0;
3716 }
3717 
nf_tables_dumpreset_rules_start(struct netlink_callback * cb)3718 static int nf_tables_dumpreset_rules_start(struct netlink_callback *cb)
3719 {
3720 	struct nft_rule_dump_ctx *ctx = (void *)cb->ctx;
3721 
3722 	ctx->reset = true;
3723 
3724 	return nf_tables_dump_rules_start(cb);
3725 }
3726 
nf_tables_dump_rules_done(struct netlink_callback * cb)3727 static int nf_tables_dump_rules_done(struct netlink_callback *cb)
3728 {
3729 	struct nft_rule_dump_ctx *ctx = (void *)cb->ctx;
3730 
3731 	kfree(ctx->table);
3732 	kfree(ctx->chain);
3733 	return 0;
3734 }
3735 
3736 /* called with rcu_read_lock held */
3737 static struct sk_buff *
nf_tables_getrule_single(u32 portid,const struct nfnl_info * info,const struct nlattr * const nla[],bool reset)3738 nf_tables_getrule_single(u32 portid, const struct nfnl_info *info,
3739 			 const struct nlattr * const nla[], bool reset)
3740 {
3741 	struct netlink_ext_ack *extack = info->extack;
3742 	u8 genmask = nft_genmask_cur(info->net);
3743 	u8 family = info->nfmsg->nfgen_family;
3744 	const struct nft_chain *chain;
3745 	const struct nft_rule *rule;
3746 	struct net *net = info->net;
3747 	struct nft_table *table;
3748 	struct sk_buff *skb2;
3749 	int err;
3750 
3751 	table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask, 0);
3752 	if (IS_ERR(table)) {
3753 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]);
3754 		return ERR_CAST(table);
3755 	}
3756 
3757 	chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN], genmask);
3758 	if (IS_ERR(chain)) {
3759 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]);
3760 		return ERR_CAST(chain);
3761 	}
3762 
3763 	rule = nft_rule_lookup(chain, nla[NFTA_RULE_HANDLE]);
3764 	if (IS_ERR(rule)) {
3765 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
3766 		return ERR_CAST(rule);
3767 	}
3768 
3769 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
3770 	if (!skb2)
3771 		return ERR_PTR(-ENOMEM);
3772 
3773 	err = nf_tables_fill_rule_info(skb2, net, portid,
3774 				       info->nlh->nlmsg_seq, NFT_MSG_NEWRULE, 0,
3775 				       family, table, chain, rule, 0, reset);
3776 	if (err < 0) {
3777 		kfree_skb(skb2);
3778 		return ERR_PTR(err);
3779 	}
3780 
3781 	return skb2;
3782 }
3783 
nf_tables_getrule(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])3784 static int nf_tables_getrule(struct sk_buff *skb, const struct nfnl_info *info,
3785 			     const struct nlattr * const nla[])
3786 {
3787 	u32 portid = NETLINK_CB(skb).portid;
3788 	struct net *net = info->net;
3789 	struct sk_buff *skb2;
3790 
3791 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
3792 		struct netlink_dump_control c = {
3793 			.start= nf_tables_dump_rules_start,
3794 			.dump = nf_tables_dump_rules,
3795 			.done = nf_tables_dump_rules_done,
3796 			.module = THIS_MODULE,
3797 			.data = (void *)nla,
3798 		};
3799 
3800 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
3801 	}
3802 
3803 	skb2 = nf_tables_getrule_single(portid, info, nla, false);
3804 	if (IS_ERR(skb2))
3805 		return PTR_ERR(skb2);
3806 
3807 	return nfnetlink_unicast(skb2, net, portid);
3808 }
3809 
nf_tables_getrule_reset(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])3810 static int nf_tables_getrule_reset(struct sk_buff *skb,
3811 				   const struct nfnl_info *info,
3812 				   const struct nlattr * const nla[])
3813 {
3814 	struct nftables_pernet *nft_net = nft_pernet(info->net);
3815 	u32 portid = NETLINK_CB(skb).portid;
3816 	struct net *net = info->net;
3817 	struct sk_buff *skb2;
3818 	char *buf;
3819 
3820 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
3821 		struct netlink_dump_control c = {
3822 			.start= nf_tables_dumpreset_rules_start,
3823 			.dump = nf_tables_dumpreset_rules,
3824 			.done = nf_tables_dump_rules_done,
3825 			.module = THIS_MODULE,
3826 			.data = (void *)nla,
3827 		};
3828 
3829 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
3830 	}
3831 
3832 	if (!try_module_get(THIS_MODULE))
3833 		return -EINVAL;
3834 	rcu_read_unlock();
3835 	mutex_lock(&nft_net->commit_mutex);
3836 	skb2 = nf_tables_getrule_single(portid, info, nla, true);
3837 	mutex_unlock(&nft_net->commit_mutex);
3838 	rcu_read_lock();
3839 	module_put(THIS_MODULE);
3840 
3841 	if (IS_ERR(skb2))
3842 		return PTR_ERR(skb2);
3843 
3844 	buf = kasprintf(GFP_ATOMIC, "%.*s:%u",
3845 			nla_len(nla[NFTA_RULE_TABLE]),
3846 			(char *)nla_data(nla[NFTA_RULE_TABLE]),
3847 			nft_net->base_seq);
3848 	audit_log_nfcfg(buf, info->nfmsg->nfgen_family, 1,
3849 			AUDIT_NFT_OP_RULE_RESET, GFP_ATOMIC);
3850 	kfree(buf);
3851 
3852 	return nfnetlink_unicast(skb2, net, portid);
3853 }
3854 
nf_tables_rule_destroy(const struct nft_ctx * ctx,struct nft_rule * rule)3855 void nf_tables_rule_destroy(const struct nft_ctx *ctx, struct nft_rule *rule)
3856 {
3857 	struct nft_expr *expr, *next;
3858 
3859 	/*
3860 	 * Careful: some expressions might not be initialized in case this
3861 	 * is called on error from nf_tables_newrule().
3862 	 */
3863 	expr = nft_expr_first(rule);
3864 	while (nft_expr_more(rule, expr)) {
3865 		next = nft_expr_next(expr);
3866 		nf_tables_expr_destroy(ctx, expr);
3867 		expr = next;
3868 	}
3869 	kfree(rule);
3870 }
3871 
nf_tables_rule_release(const struct nft_ctx * ctx,struct nft_rule * rule)3872 static void nf_tables_rule_release(const struct nft_ctx *ctx, struct nft_rule *rule)
3873 {
3874 	nft_rule_expr_deactivate(ctx, rule, NFT_TRANS_RELEASE);
3875 	nf_tables_rule_destroy(ctx, rule);
3876 }
3877 
3878 /** nft_chain_validate - loop detection and hook validation
3879  *
3880  * @ctx: context containing call depth and base chain
3881  * @chain: chain to validate
3882  *
3883  * Walk through the rules of the given chain and chase all jumps/gotos
3884  * and set lookups until either the jump limit is hit or all reachable
3885  * chains have been validated.
3886  */
nft_chain_validate(const struct nft_ctx * ctx,const struct nft_chain * chain)3887 int nft_chain_validate(const struct nft_ctx *ctx, const struct nft_chain *chain)
3888 {
3889 	struct nft_expr *expr, *last;
3890 	struct nft_rule *rule;
3891 	int err;
3892 
3893 	if (ctx->level == NFT_JUMP_STACK_SIZE)
3894 		return -EMLINK;
3895 
3896 	list_for_each_entry(rule, &chain->rules, list) {
3897 		if (fatal_signal_pending(current))
3898 			return -EINTR;
3899 
3900 		if (!nft_is_active_next(ctx->net, rule))
3901 			continue;
3902 
3903 		nft_rule_for_each_expr(expr, last, rule) {
3904 			if (!expr->ops->validate)
3905 				continue;
3906 
3907 			/* This may call nft_chain_validate() recursively,
3908 			 * callers that do so must increment ctx->level.
3909 			 */
3910 			err = expr->ops->validate(ctx, expr);
3911 			if (err < 0)
3912 				return err;
3913 		}
3914 	}
3915 
3916 	return 0;
3917 }
3918 EXPORT_SYMBOL_GPL(nft_chain_validate);
3919 
nft_table_validate(struct net * net,const struct nft_table * table)3920 static int nft_table_validate(struct net *net, const struct nft_table *table)
3921 {
3922 	struct nft_chain *chain;
3923 	struct nft_ctx ctx = {
3924 		.net	= net,
3925 		.family	= table->family,
3926 	};
3927 	int err;
3928 
3929 	list_for_each_entry(chain, &table->chains, list) {
3930 		if (!nft_is_base_chain(chain))
3931 			continue;
3932 
3933 		ctx.chain = chain;
3934 		err = nft_chain_validate(&ctx, chain);
3935 		if (err < 0)
3936 			return err;
3937 
3938 		cond_resched();
3939 	}
3940 
3941 	return 0;
3942 }
3943 
nft_setelem_validate(const struct nft_ctx * ctx,struct nft_set * set,const struct nft_set_iter * iter,struct nft_elem_priv * elem_priv)3944 int nft_setelem_validate(const struct nft_ctx *ctx, struct nft_set *set,
3945 			 const struct nft_set_iter *iter,
3946 			 struct nft_elem_priv *elem_priv)
3947 {
3948 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
3949 	struct nft_ctx *pctx = (struct nft_ctx *)ctx;
3950 	const struct nft_data *data;
3951 	int err;
3952 
3953 	if (!nft_set_elem_active(ext, iter->genmask))
3954 		return 0;
3955 
3956 	if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
3957 	    *nft_set_ext_flags(ext) & NFT_SET_ELEM_INTERVAL_END)
3958 		return 0;
3959 
3960 	data = nft_set_ext_data(ext);
3961 	switch (data->verdict.code) {
3962 	case NFT_JUMP:
3963 	case NFT_GOTO:
3964 		pctx->level++;
3965 		err = nft_chain_validate(ctx, data->verdict.chain);
3966 		if (err < 0)
3967 			return err;
3968 		pctx->level--;
3969 		break;
3970 	default:
3971 		break;
3972 	}
3973 
3974 	return 0;
3975 }
3976 
nft_set_catchall_validate(const struct nft_ctx * ctx,struct nft_set * set)3977 int nft_set_catchall_validate(const struct nft_ctx *ctx, struct nft_set *set)
3978 {
3979 	struct nft_set_iter dummy_iter = {
3980 		.genmask	= nft_genmask_next(ctx->net),
3981 	};
3982 	struct nft_set_elem_catchall *catchall;
3983 
3984 	struct nft_set_ext *ext;
3985 	int ret = 0;
3986 
3987 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
3988 		ext = nft_set_elem_ext(set, catchall->elem);
3989 		if (!nft_set_elem_active(ext, dummy_iter.genmask))
3990 			continue;
3991 
3992 		ret = nft_setelem_validate(ctx, set, &dummy_iter, catchall->elem);
3993 		if (ret < 0)
3994 			return ret;
3995 	}
3996 
3997 	return ret;
3998 }
3999 
4000 static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
4001 					     const struct nft_chain *chain,
4002 					     const struct nlattr *nla);
4003 
4004 #define NFT_RULE_MAXEXPRS	128
4005 
nf_tables_newrule(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])4006 static int nf_tables_newrule(struct sk_buff *skb, const struct nfnl_info *info,
4007 			     const struct nlattr * const nla[])
4008 {
4009 	struct nftables_pernet *nft_net = nft_pernet(info->net);
4010 	struct netlink_ext_ack *extack = info->extack;
4011 	unsigned int size, i, n, ulen = 0, usize = 0;
4012 	u8 genmask = nft_genmask_next(info->net);
4013 	struct nft_rule *rule, *old_rule = NULL;
4014 	struct nft_expr_info *expr_info = NULL;
4015 	u8 family = info->nfmsg->nfgen_family;
4016 	struct nft_flow_rule *flow = NULL;
4017 	struct net *net = info->net;
4018 	struct nft_userdata *udata;
4019 	struct nft_table *table;
4020 	struct nft_chain *chain;
4021 	struct nft_trans *trans;
4022 	u64 handle, pos_handle;
4023 	struct nft_expr *expr;
4024 	struct nft_ctx ctx;
4025 	struct nlattr *tmp;
4026 	int err, rem;
4027 
4028 	lockdep_assert_held(&nft_net->commit_mutex);
4029 
4030 	table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask,
4031 				 NETLINK_CB(skb).portid);
4032 	if (IS_ERR(table)) {
4033 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]);
4034 		return PTR_ERR(table);
4035 	}
4036 
4037 	if (nla[NFTA_RULE_CHAIN]) {
4038 		chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN],
4039 					 genmask);
4040 		if (IS_ERR(chain)) {
4041 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]);
4042 			return PTR_ERR(chain);
4043 		}
4044 
4045 	} else if (nla[NFTA_RULE_CHAIN_ID]) {
4046 		chain = nft_chain_lookup_byid(net, table, nla[NFTA_RULE_CHAIN_ID],
4047 					      genmask);
4048 		if (IS_ERR(chain)) {
4049 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN_ID]);
4050 			return PTR_ERR(chain);
4051 		}
4052 	} else {
4053 		return -EINVAL;
4054 	}
4055 
4056 	if (nft_chain_is_bound(chain))
4057 		return -EOPNOTSUPP;
4058 
4059 	if (nla[NFTA_RULE_HANDLE]) {
4060 		handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_HANDLE]));
4061 		rule = __nft_rule_lookup(chain, handle);
4062 		if (IS_ERR(rule)) {
4063 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
4064 			return PTR_ERR(rule);
4065 		}
4066 
4067 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
4068 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
4069 			return -EEXIST;
4070 		}
4071 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
4072 			old_rule = rule;
4073 		else
4074 			return -EOPNOTSUPP;
4075 	} else {
4076 		if (!(info->nlh->nlmsg_flags & NLM_F_CREATE) ||
4077 		    info->nlh->nlmsg_flags & NLM_F_REPLACE)
4078 			return -EINVAL;
4079 		handle = nf_tables_alloc_handle(table);
4080 
4081 		if (nla[NFTA_RULE_POSITION]) {
4082 			pos_handle = be64_to_cpu(nla_get_be64(nla[NFTA_RULE_POSITION]));
4083 			old_rule = __nft_rule_lookup(chain, pos_handle);
4084 			if (IS_ERR(old_rule)) {
4085 				NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION]);
4086 				return PTR_ERR(old_rule);
4087 			}
4088 		} else if (nla[NFTA_RULE_POSITION_ID]) {
4089 			old_rule = nft_rule_lookup_byid(net, chain, nla[NFTA_RULE_POSITION_ID]);
4090 			if (IS_ERR(old_rule)) {
4091 				NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_POSITION_ID]);
4092 				return PTR_ERR(old_rule);
4093 			}
4094 		}
4095 	}
4096 
4097 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla);
4098 
4099 	n = 0;
4100 	size = 0;
4101 	if (nla[NFTA_RULE_EXPRESSIONS]) {
4102 		expr_info = kvmalloc_array(NFT_RULE_MAXEXPRS,
4103 					   sizeof(struct nft_expr_info),
4104 					   GFP_KERNEL);
4105 		if (!expr_info)
4106 			return -ENOMEM;
4107 
4108 		nla_for_each_nested(tmp, nla[NFTA_RULE_EXPRESSIONS], rem) {
4109 			err = -EINVAL;
4110 			if (nla_type(tmp) != NFTA_LIST_ELEM)
4111 				goto err_release_expr;
4112 			if (n == NFT_RULE_MAXEXPRS)
4113 				goto err_release_expr;
4114 			err = nf_tables_expr_parse(&ctx, tmp, &expr_info[n]);
4115 			if (err < 0) {
4116 				NL_SET_BAD_ATTR(extack, tmp);
4117 				goto err_release_expr;
4118 			}
4119 			size += expr_info[n].ops->size;
4120 			n++;
4121 		}
4122 	}
4123 	/* Check for overflow of dlen field */
4124 	err = -EFBIG;
4125 	if (size >= 1 << 12)
4126 		goto err_release_expr;
4127 
4128 	if (nla[NFTA_RULE_USERDATA]) {
4129 		ulen = nla_len(nla[NFTA_RULE_USERDATA]);
4130 		if (ulen > 0)
4131 			usize = sizeof(struct nft_userdata) + ulen;
4132 	}
4133 
4134 	err = -ENOMEM;
4135 	rule = kzalloc(sizeof(*rule) + size + usize, GFP_KERNEL_ACCOUNT);
4136 	if (rule == NULL)
4137 		goto err_release_expr;
4138 
4139 	nft_activate_next(net, rule);
4140 
4141 	rule->handle = handle;
4142 	rule->dlen   = size;
4143 	rule->udata  = ulen ? 1 : 0;
4144 
4145 	if (ulen) {
4146 		udata = nft_userdata(rule);
4147 		udata->len = ulen - 1;
4148 		nla_memcpy(udata->data, nla[NFTA_RULE_USERDATA], ulen);
4149 	}
4150 
4151 	expr = nft_expr_first(rule);
4152 	for (i = 0; i < n; i++) {
4153 		err = nf_tables_newexpr(&ctx, &expr_info[i], expr);
4154 		if (err < 0) {
4155 			NL_SET_BAD_ATTR(extack, expr_info[i].attr);
4156 			goto err_release_rule;
4157 		}
4158 
4159 		if (expr_info[i].ops->validate)
4160 			nft_validate_state_update(table, NFT_VALIDATE_NEED);
4161 
4162 		expr_info[i].ops = NULL;
4163 		expr = nft_expr_next(expr);
4164 	}
4165 
4166 	if (chain->flags & NFT_CHAIN_HW_OFFLOAD) {
4167 		flow = nft_flow_rule_create(net, rule);
4168 		if (IS_ERR(flow)) {
4169 			err = PTR_ERR(flow);
4170 			goto err_release_rule;
4171 		}
4172 	}
4173 
4174 	if (!nft_use_inc(&chain->use)) {
4175 		err = -EMFILE;
4176 		goto err_release_rule;
4177 	}
4178 
4179 	if (info->nlh->nlmsg_flags & NLM_F_REPLACE) {
4180 		if (nft_chain_binding(chain)) {
4181 			err = -EOPNOTSUPP;
4182 			goto err_destroy_flow_rule;
4183 		}
4184 
4185 		err = nft_delrule(&ctx, old_rule);
4186 		if (err < 0)
4187 			goto err_destroy_flow_rule;
4188 
4189 		trans = nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule);
4190 		if (trans == NULL) {
4191 			err = -ENOMEM;
4192 			goto err_destroy_flow_rule;
4193 		}
4194 		list_add_tail_rcu(&rule->list, &old_rule->list);
4195 	} else {
4196 		trans = nft_trans_rule_add(&ctx, NFT_MSG_NEWRULE, rule);
4197 		if (!trans) {
4198 			err = -ENOMEM;
4199 			goto err_destroy_flow_rule;
4200 		}
4201 
4202 		if (info->nlh->nlmsg_flags & NLM_F_APPEND) {
4203 			if (old_rule)
4204 				list_add_rcu(&rule->list, &old_rule->list);
4205 			else
4206 				list_add_tail_rcu(&rule->list, &chain->rules);
4207 		 } else {
4208 			if (old_rule)
4209 				list_add_tail_rcu(&rule->list, &old_rule->list);
4210 			else
4211 				list_add_rcu(&rule->list, &chain->rules);
4212 		}
4213 	}
4214 	kvfree(expr_info);
4215 
4216 	if (flow)
4217 		nft_trans_flow_rule(trans) = flow;
4218 
4219 	if (table->validate_state == NFT_VALIDATE_DO)
4220 		return nft_table_validate(net, table);
4221 
4222 	return 0;
4223 
4224 err_destroy_flow_rule:
4225 	nft_use_dec_restore(&chain->use);
4226 	if (flow)
4227 		nft_flow_rule_destroy(flow);
4228 err_release_rule:
4229 	nft_rule_expr_deactivate(&ctx, rule, NFT_TRANS_PREPARE_ERROR);
4230 	nf_tables_rule_destroy(&ctx, rule);
4231 err_release_expr:
4232 	for (i = 0; i < n; i++) {
4233 		if (expr_info[i].ops) {
4234 			module_put(expr_info[i].ops->type->owner);
4235 			if (expr_info[i].ops->type->release_ops)
4236 				expr_info[i].ops->type->release_ops(expr_info[i].ops);
4237 		}
4238 	}
4239 	kvfree(expr_info);
4240 
4241 	return err;
4242 }
4243 
nft_rule_lookup_byid(const struct net * net,const struct nft_chain * chain,const struct nlattr * nla)4244 static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
4245 					     const struct nft_chain *chain,
4246 					     const struct nlattr *nla)
4247 {
4248 	struct nftables_pernet *nft_net = nft_pernet(net);
4249 	u32 id = ntohl(nla_get_be32(nla));
4250 	struct nft_trans *trans;
4251 
4252 	list_for_each_entry(trans, &nft_net->commit_list, list) {
4253 		if (trans->msg_type == NFT_MSG_NEWRULE &&
4254 		    nft_trans_rule_chain(trans) == chain &&
4255 		    id == nft_trans_rule_id(trans))
4256 			return nft_trans_rule(trans);
4257 	}
4258 	return ERR_PTR(-ENOENT);
4259 }
4260 
nf_tables_delrule(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])4261 static int nf_tables_delrule(struct sk_buff *skb, const struct nfnl_info *info,
4262 			     const struct nlattr * const nla[])
4263 {
4264 	struct netlink_ext_ack *extack = info->extack;
4265 	u8 genmask = nft_genmask_next(info->net);
4266 	u8 family = info->nfmsg->nfgen_family;
4267 	struct nft_chain *chain = NULL;
4268 	struct net *net = info->net;
4269 	struct nft_table *table;
4270 	struct nft_rule *rule;
4271 	struct nft_ctx ctx;
4272 	int err = 0;
4273 
4274 	table = nft_table_lookup(net, nla[NFTA_RULE_TABLE], family, genmask,
4275 				 NETLINK_CB(skb).portid);
4276 	if (IS_ERR(table)) {
4277 		NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_TABLE]);
4278 		return PTR_ERR(table);
4279 	}
4280 
4281 	if (nla[NFTA_RULE_CHAIN]) {
4282 		chain = nft_chain_lookup(net, table, nla[NFTA_RULE_CHAIN],
4283 					 genmask);
4284 		if (IS_ERR(chain)) {
4285 			if (PTR_ERR(chain) == -ENOENT &&
4286 			    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYRULE)
4287 				return 0;
4288 
4289 			NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_CHAIN]);
4290 			return PTR_ERR(chain);
4291 		}
4292 		if (nft_chain_binding(chain))
4293 			return -EOPNOTSUPP;
4294 	}
4295 
4296 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, chain, nla);
4297 
4298 	if (chain) {
4299 		if (nla[NFTA_RULE_HANDLE]) {
4300 			rule = nft_rule_lookup(chain, nla[NFTA_RULE_HANDLE]);
4301 			if (IS_ERR(rule)) {
4302 				if (PTR_ERR(rule) == -ENOENT &&
4303 				    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYRULE)
4304 					return 0;
4305 
4306 				NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_HANDLE]);
4307 				return PTR_ERR(rule);
4308 			}
4309 
4310 			err = nft_delrule(&ctx, rule);
4311 		} else if (nla[NFTA_RULE_ID]) {
4312 			rule = nft_rule_lookup_byid(net, chain, nla[NFTA_RULE_ID]);
4313 			if (IS_ERR(rule)) {
4314 				NL_SET_BAD_ATTR(extack, nla[NFTA_RULE_ID]);
4315 				return PTR_ERR(rule);
4316 			}
4317 
4318 			err = nft_delrule(&ctx, rule);
4319 		} else {
4320 			err = nft_delrule_by_chain(&ctx);
4321 		}
4322 	} else {
4323 		list_for_each_entry(chain, &table->chains, list) {
4324 			if (!nft_is_active_next(net, chain))
4325 				continue;
4326 			if (nft_chain_binding(chain))
4327 				continue;
4328 
4329 			ctx.chain = chain;
4330 			err = nft_delrule_by_chain(&ctx);
4331 			if (err < 0)
4332 				break;
4333 		}
4334 	}
4335 
4336 	return err;
4337 }
4338 
4339 /*
4340  * Sets
4341  */
4342 static const struct nft_set_type *nft_set_types[] = {
4343 	&nft_set_hash_fast_type,
4344 	&nft_set_hash_type,
4345 	&nft_set_rhash_type,
4346 	&nft_set_bitmap_type,
4347 	&nft_set_rbtree_type,
4348 #if defined(CONFIG_X86_64) && !defined(CONFIG_UML)
4349 	&nft_set_pipapo_avx2_type,
4350 #endif
4351 	&nft_set_pipapo_type,
4352 };
4353 
4354 #define NFT_SET_FEATURES	(NFT_SET_INTERVAL | NFT_SET_MAP | \
4355 				 NFT_SET_TIMEOUT | NFT_SET_OBJECT | \
4356 				 NFT_SET_EVAL)
4357 
nft_set_ops_candidate(const struct nft_set_type * type,u32 flags)4358 static bool nft_set_ops_candidate(const struct nft_set_type *type, u32 flags)
4359 {
4360 	return (flags & type->features) == (flags & NFT_SET_FEATURES);
4361 }
4362 
4363 /*
4364  * Select a set implementation based on the data characteristics and the
4365  * given policy. The total memory use might not be known if no size is
4366  * given, in that case the amount of memory per element is used.
4367  */
4368 static const struct nft_set_ops *
nft_select_set_ops(const struct nft_ctx * ctx,u32 flags,const struct nft_set_desc * desc)4369 nft_select_set_ops(const struct nft_ctx *ctx, u32 flags,
4370 		   const struct nft_set_desc *desc)
4371 {
4372 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
4373 	const struct nft_set_ops *ops, *bops;
4374 	struct nft_set_estimate est, best;
4375 	const struct nft_set_type *type;
4376 	int i;
4377 
4378 	lockdep_assert_held(&nft_net->commit_mutex);
4379 	lockdep_nfnl_nft_mutex_not_held();
4380 
4381 	bops	    = NULL;
4382 	best.size   = ~0;
4383 	best.lookup = ~0;
4384 	best.space  = ~0;
4385 
4386 	for (i = 0; i < ARRAY_SIZE(nft_set_types); i++) {
4387 		type = nft_set_types[i];
4388 		ops = &type->ops;
4389 
4390 		if (!nft_set_ops_candidate(type, flags))
4391 			continue;
4392 		if (!ops->estimate(desc, flags, &est))
4393 			continue;
4394 
4395 		switch (desc->policy) {
4396 		case NFT_SET_POL_PERFORMANCE:
4397 			if (est.lookup < best.lookup)
4398 				break;
4399 			if (est.lookup == best.lookup &&
4400 			    est.space < best.space)
4401 				break;
4402 			continue;
4403 		case NFT_SET_POL_MEMORY:
4404 			if (!desc->size) {
4405 				if (est.space < best.space)
4406 					break;
4407 				if (est.space == best.space &&
4408 				    est.lookup < best.lookup)
4409 					break;
4410 			} else if (est.size < best.size || !bops) {
4411 				break;
4412 			}
4413 			continue;
4414 		default:
4415 			break;
4416 		}
4417 
4418 		bops = ops;
4419 		best = est;
4420 	}
4421 
4422 	if (bops != NULL)
4423 		return bops;
4424 
4425 	return ERR_PTR(-EOPNOTSUPP);
4426 }
4427 
4428 static const struct nla_policy nft_set_policy[NFTA_SET_MAX + 1] = {
4429 	[NFTA_SET_TABLE]		= { .type = NLA_STRING,
4430 					    .len = NFT_TABLE_MAXNAMELEN - 1 },
4431 	[NFTA_SET_NAME]			= { .type = NLA_STRING,
4432 					    .len = NFT_SET_MAXNAMELEN - 1 },
4433 	[NFTA_SET_FLAGS]		= { .type = NLA_U32 },
4434 	[NFTA_SET_KEY_TYPE]		= { .type = NLA_U32 },
4435 	[NFTA_SET_KEY_LEN]		= { .type = NLA_U32 },
4436 	[NFTA_SET_DATA_TYPE]		= { .type = NLA_U32 },
4437 	[NFTA_SET_DATA_LEN]		= { .type = NLA_U32 },
4438 	[NFTA_SET_POLICY]		= { .type = NLA_U32 },
4439 	[NFTA_SET_DESC]			= { .type = NLA_NESTED },
4440 	[NFTA_SET_ID]			= { .type = NLA_U32 },
4441 	[NFTA_SET_TIMEOUT]		= { .type = NLA_U64 },
4442 	[NFTA_SET_GC_INTERVAL]		= { .type = NLA_U32 },
4443 	[NFTA_SET_USERDATA]		= { .type = NLA_BINARY,
4444 					    .len  = NFT_USERDATA_MAXLEN },
4445 	[NFTA_SET_OBJ_TYPE]		= { .type = NLA_U32 },
4446 	[NFTA_SET_HANDLE]		= { .type = NLA_U64 },
4447 	[NFTA_SET_EXPR]			= { .type = NLA_NESTED },
4448 	[NFTA_SET_EXPRESSIONS]		= NLA_POLICY_NESTED_ARRAY(nft_expr_policy),
4449 };
4450 
4451 static const struct nla_policy nft_concat_policy[NFTA_SET_FIELD_MAX + 1] = {
4452 	[NFTA_SET_FIELD_LEN]	= { .type = NLA_U32 },
4453 };
4454 
4455 static const struct nla_policy nft_set_desc_policy[NFTA_SET_DESC_MAX + 1] = {
4456 	[NFTA_SET_DESC_SIZE]		= { .type = NLA_U32 },
4457 	[NFTA_SET_DESC_CONCAT]		= NLA_POLICY_NESTED_ARRAY(nft_concat_policy),
4458 };
4459 
nft_set_lookup(const struct nft_table * table,const struct nlattr * nla,u8 genmask)4460 static struct nft_set *nft_set_lookup(const struct nft_table *table,
4461 				      const struct nlattr *nla, u8 genmask)
4462 {
4463 	struct nft_set *set;
4464 
4465 	if (nla == NULL)
4466 		return ERR_PTR(-EINVAL);
4467 
4468 	list_for_each_entry_rcu(set, &table->sets, list) {
4469 		if (!nla_strcmp(nla, set->name) &&
4470 		    nft_active_genmask(set, genmask))
4471 			return set;
4472 	}
4473 	return ERR_PTR(-ENOENT);
4474 }
4475 
nft_set_lookup_byhandle(const struct nft_table * table,const struct nlattr * nla,u8 genmask)4476 static struct nft_set *nft_set_lookup_byhandle(const struct nft_table *table,
4477 					       const struct nlattr *nla,
4478 					       u8 genmask)
4479 {
4480 	struct nft_set *set;
4481 
4482 	list_for_each_entry(set, &table->sets, list) {
4483 		if (be64_to_cpu(nla_get_be64(nla)) == set->handle &&
4484 		    nft_active_genmask(set, genmask))
4485 			return set;
4486 	}
4487 	return ERR_PTR(-ENOENT);
4488 }
4489 
nft_set_lookup_byid(const struct net * net,const struct nft_table * table,const struct nlattr * nla,u8 genmask)4490 static struct nft_set *nft_set_lookup_byid(const struct net *net,
4491 					   const struct nft_table *table,
4492 					   const struct nlattr *nla, u8 genmask)
4493 {
4494 	struct nftables_pernet *nft_net = nft_pernet(net);
4495 	u32 id = ntohl(nla_get_be32(nla));
4496 	struct nft_trans_set *trans;
4497 
4498 	/* its likely the id we need is at the tail, not at start */
4499 	list_for_each_entry_reverse(trans, &nft_net->commit_set_list, list_trans_newset) {
4500 		struct nft_set *set = trans->set;
4501 
4502 		if (id == trans->set_id &&
4503 		    set->table == table &&
4504 		    nft_active_genmask(set, genmask))
4505 			return set;
4506 	}
4507 	return ERR_PTR(-ENOENT);
4508 }
4509 
nft_set_lookup_global(const struct net * net,const struct nft_table * table,const struct nlattr * nla_set_name,const struct nlattr * nla_set_id,u8 genmask)4510 struct nft_set *nft_set_lookup_global(const struct net *net,
4511 				      const struct nft_table *table,
4512 				      const struct nlattr *nla_set_name,
4513 				      const struct nlattr *nla_set_id,
4514 				      u8 genmask)
4515 {
4516 	struct nft_set *set;
4517 
4518 	set = nft_set_lookup(table, nla_set_name, genmask);
4519 	if (IS_ERR(set)) {
4520 		if (!nla_set_id)
4521 			return set;
4522 
4523 		set = nft_set_lookup_byid(net, table, nla_set_id, genmask);
4524 	}
4525 	return set;
4526 }
4527 EXPORT_SYMBOL_GPL(nft_set_lookup_global);
4528 
nf_tables_set_alloc_name(struct nft_ctx * ctx,struct nft_set * set,const char * name)4529 static int nf_tables_set_alloc_name(struct nft_ctx *ctx, struct nft_set *set,
4530 				    const char *name)
4531 {
4532 	const struct nft_set *i;
4533 	const char *p;
4534 	unsigned long *inuse;
4535 	unsigned int n = 0, min = 0;
4536 
4537 	p = strchr(name, '%');
4538 	if (p != NULL) {
4539 		if (p[1] != 'd' || strchr(p + 2, '%'))
4540 			return -EINVAL;
4541 
4542 		if (strnlen(name, NFT_SET_MAX_ANONLEN) >= NFT_SET_MAX_ANONLEN)
4543 			return -EINVAL;
4544 
4545 		inuse = (unsigned long *)get_zeroed_page(GFP_KERNEL);
4546 		if (inuse == NULL)
4547 			return -ENOMEM;
4548 cont:
4549 		list_for_each_entry(i, &ctx->table->sets, list) {
4550 			int tmp;
4551 
4552 			if (!nft_is_active_next(ctx->net, i))
4553 				continue;
4554 			if (!sscanf(i->name, name, &tmp))
4555 				continue;
4556 			if (tmp < min || tmp >= min + BITS_PER_BYTE * PAGE_SIZE)
4557 				continue;
4558 
4559 			set_bit(tmp - min, inuse);
4560 		}
4561 
4562 		n = find_first_zero_bit(inuse, BITS_PER_BYTE * PAGE_SIZE);
4563 		if (n >= BITS_PER_BYTE * PAGE_SIZE) {
4564 			min += BITS_PER_BYTE * PAGE_SIZE;
4565 			memset(inuse, 0, PAGE_SIZE);
4566 			goto cont;
4567 		}
4568 		free_page((unsigned long)inuse);
4569 	}
4570 
4571 	set->name = kasprintf(GFP_KERNEL_ACCOUNT, name, min + n);
4572 	if (!set->name)
4573 		return -ENOMEM;
4574 
4575 	list_for_each_entry(i, &ctx->table->sets, list) {
4576 		if (!nft_is_active_next(ctx->net, i))
4577 			continue;
4578 		if (!strcmp(set->name, i->name)) {
4579 			kfree(set->name);
4580 			set->name = NULL;
4581 			return -ENFILE;
4582 		}
4583 	}
4584 	return 0;
4585 }
4586 
nf_msecs_to_jiffies64(const struct nlattr * nla,u64 * result)4587 int nf_msecs_to_jiffies64(const struct nlattr *nla, u64 *result)
4588 {
4589 	u64 ms = be64_to_cpu(nla_get_be64(nla));
4590 	u64 max = (u64)(~((u64)0));
4591 
4592 	max = div_u64(max, NSEC_PER_MSEC);
4593 	if (ms >= max)
4594 		return -ERANGE;
4595 
4596 	ms *= NSEC_PER_MSEC;
4597 	*result = nsecs_to_jiffies64(ms) ? : !!ms;
4598 	return 0;
4599 }
4600 
nf_jiffies64_to_msecs(u64 input)4601 __be64 nf_jiffies64_to_msecs(u64 input)
4602 {
4603 	return cpu_to_be64(jiffies64_to_msecs(input));
4604 }
4605 
nf_tables_fill_set_concat(struct sk_buff * skb,const struct nft_set * set)4606 static int nf_tables_fill_set_concat(struct sk_buff *skb,
4607 				     const struct nft_set *set)
4608 {
4609 	struct nlattr *concat, *field;
4610 	int i;
4611 
4612 	concat = nla_nest_start_noflag(skb, NFTA_SET_DESC_CONCAT);
4613 	if (!concat)
4614 		return -ENOMEM;
4615 
4616 	for (i = 0; i < set->field_count; i++) {
4617 		field = nla_nest_start_noflag(skb, NFTA_LIST_ELEM);
4618 		if (!field)
4619 			return -ENOMEM;
4620 
4621 		if (nla_put_be32(skb, NFTA_SET_FIELD_LEN,
4622 				 htonl(set->field_len[i])))
4623 			return -ENOMEM;
4624 
4625 		nla_nest_end(skb, field);
4626 	}
4627 
4628 	nla_nest_end(skb, concat);
4629 
4630 	return 0;
4631 }
4632 
nf_tables_fill_set(struct sk_buff * skb,const struct nft_ctx * ctx,const struct nft_set * set,u16 event,u16 flags)4633 static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx,
4634 			      const struct nft_set *set, u16 event, u16 flags)
4635 {
4636 	u64 timeout = READ_ONCE(set->timeout);
4637 	u32 gc_int = READ_ONCE(set->gc_int);
4638 	u32 portid = ctx->portid;
4639 	struct nlmsghdr *nlh;
4640 	struct nlattr *nest;
4641 	u32 seq = ctx->seq;
4642 	int i;
4643 
4644 	event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
4645 	nlh = nfnl_msg_put(skb, portid, seq, event, flags, ctx->family,
4646 			   NFNETLINK_V0, nft_base_seq(ctx->net));
4647 	if (!nlh)
4648 		goto nla_put_failure;
4649 
4650 	if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name))
4651 		goto nla_put_failure;
4652 	if (nla_put_string(skb, NFTA_SET_NAME, set->name))
4653 		goto nla_put_failure;
4654 	if (nla_put_be64(skb, NFTA_SET_HANDLE, cpu_to_be64(set->handle),
4655 			 NFTA_SET_PAD))
4656 		goto nla_put_failure;
4657 
4658 	if (event == NFT_MSG_DELSET) {
4659 		nlmsg_end(skb, nlh);
4660 		return 0;
4661 	}
4662 
4663 	if (set->flags != 0)
4664 		if (nla_put_be32(skb, NFTA_SET_FLAGS, htonl(set->flags)))
4665 			goto nla_put_failure;
4666 
4667 	if (nla_put_be32(skb, NFTA_SET_KEY_TYPE, htonl(set->ktype)))
4668 		goto nla_put_failure;
4669 	if (nla_put_be32(skb, NFTA_SET_KEY_LEN, htonl(set->klen)))
4670 		goto nla_put_failure;
4671 	if (set->flags & NFT_SET_MAP) {
4672 		if (nla_put_be32(skb, NFTA_SET_DATA_TYPE, htonl(set->dtype)))
4673 			goto nla_put_failure;
4674 		if (nla_put_be32(skb, NFTA_SET_DATA_LEN, htonl(set->dlen)))
4675 			goto nla_put_failure;
4676 	}
4677 	if (set->flags & NFT_SET_OBJECT &&
4678 	    nla_put_be32(skb, NFTA_SET_OBJ_TYPE, htonl(set->objtype)))
4679 		goto nla_put_failure;
4680 
4681 	if (timeout &&
4682 	    nla_put_be64(skb, NFTA_SET_TIMEOUT,
4683 			 nf_jiffies64_to_msecs(timeout),
4684 			 NFTA_SET_PAD))
4685 		goto nla_put_failure;
4686 	if (gc_int &&
4687 	    nla_put_be32(skb, NFTA_SET_GC_INTERVAL, htonl(gc_int)))
4688 		goto nla_put_failure;
4689 
4690 	if (set->policy != NFT_SET_POL_PERFORMANCE) {
4691 		if (nla_put_be32(skb, NFTA_SET_POLICY, htonl(set->policy)))
4692 			goto nla_put_failure;
4693 	}
4694 
4695 	if (set->udata &&
4696 	    nla_put(skb, NFTA_SET_USERDATA, set->udlen, set->udata))
4697 		goto nla_put_failure;
4698 
4699 	nest = nla_nest_start_noflag(skb, NFTA_SET_DESC);
4700 	if (!nest)
4701 		goto nla_put_failure;
4702 	if (set->size &&
4703 	    nla_put_be32(skb, NFTA_SET_DESC_SIZE, htonl(set->size)))
4704 		goto nla_put_failure;
4705 
4706 	if (set->field_count > 1 &&
4707 	    nf_tables_fill_set_concat(skb, set))
4708 		goto nla_put_failure;
4709 
4710 	nla_nest_end(skb, nest);
4711 
4712 	if (set->num_exprs == 1) {
4713 		nest = nla_nest_start_noflag(skb, NFTA_SET_EXPR);
4714 		if (nf_tables_fill_expr_info(skb, set->exprs[0], false) < 0)
4715 			goto nla_put_failure;
4716 
4717 		nla_nest_end(skb, nest);
4718 	} else if (set->num_exprs > 1) {
4719 		nest = nla_nest_start_noflag(skb, NFTA_SET_EXPRESSIONS);
4720 		if (nest == NULL)
4721 			goto nla_put_failure;
4722 
4723 		for (i = 0; i < set->num_exprs; i++) {
4724 			if (nft_expr_dump(skb, NFTA_LIST_ELEM,
4725 					  set->exprs[i], false) < 0)
4726 				goto nla_put_failure;
4727 		}
4728 		nla_nest_end(skb, nest);
4729 	}
4730 
4731 	nlmsg_end(skb, nlh);
4732 	return 0;
4733 
4734 nla_put_failure:
4735 	nlmsg_trim(skb, nlh);
4736 	return -1;
4737 }
4738 
nf_tables_set_notify(const struct nft_ctx * ctx,const struct nft_set * set,int event,gfp_t gfp_flags)4739 static void nf_tables_set_notify(const struct nft_ctx *ctx,
4740 				 const struct nft_set *set, int event,
4741 			         gfp_t gfp_flags)
4742 {
4743 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
4744 	u32 portid = ctx->portid;
4745 	struct sk_buff *skb;
4746 	u16 flags = 0;
4747 	int err;
4748 
4749 	if (!ctx->report &&
4750 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
4751 		return;
4752 
4753 	skb = nlmsg_new(NLMSG_GOODSIZE, gfp_flags);
4754 	if (skb == NULL)
4755 		goto err;
4756 
4757 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
4758 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
4759 
4760 	err = nf_tables_fill_set(skb, ctx, set, event, flags);
4761 	if (err < 0) {
4762 		kfree_skb(skb);
4763 		goto err;
4764 	}
4765 
4766 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
4767 	return;
4768 err:
4769 	nfnetlink_set_err(ctx->net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
4770 }
4771 
nf_tables_dump_sets(struct sk_buff * skb,struct netlink_callback * cb)4772 static int nf_tables_dump_sets(struct sk_buff *skb, struct netlink_callback *cb)
4773 {
4774 	const struct nft_set *set;
4775 	unsigned int idx, s_idx = cb->args[0];
4776 	struct nft_table *table, *cur_table = (struct nft_table *)cb->args[2];
4777 	struct net *net = sock_net(skb->sk);
4778 	struct nft_ctx *ctx = cb->data, ctx_set;
4779 	struct nftables_pernet *nft_net;
4780 
4781 	if (cb->args[1])
4782 		return skb->len;
4783 
4784 	rcu_read_lock();
4785 	nft_net = nft_pernet(net);
4786 	cb->seq = READ_ONCE(nft_net->base_seq);
4787 
4788 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
4789 		if (ctx->family != NFPROTO_UNSPEC &&
4790 		    ctx->family != table->family)
4791 			continue;
4792 
4793 		if (ctx->table && ctx->table != table)
4794 			continue;
4795 
4796 		if (cur_table) {
4797 			if (cur_table != table)
4798 				continue;
4799 
4800 			cur_table = NULL;
4801 		}
4802 		idx = 0;
4803 		list_for_each_entry_rcu(set, &table->sets, list) {
4804 			if (idx < s_idx)
4805 				goto cont;
4806 			if (!nft_is_active(net, set))
4807 				goto cont;
4808 
4809 			ctx_set = *ctx;
4810 			ctx_set.table = table;
4811 			ctx_set.family = table->family;
4812 
4813 			if (nf_tables_fill_set(skb, &ctx_set, set,
4814 					       NFT_MSG_NEWSET,
4815 					       NLM_F_MULTI) < 0) {
4816 				cb->args[0] = idx;
4817 				cb->args[2] = (unsigned long) table;
4818 				goto done;
4819 			}
4820 			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
4821 cont:
4822 			idx++;
4823 		}
4824 		if (s_idx)
4825 			s_idx = 0;
4826 	}
4827 	cb->args[1] = 1;
4828 done:
4829 	rcu_read_unlock();
4830 	return skb->len;
4831 }
4832 
nf_tables_dump_sets_start(struct netlink_callback * cb)4833 static int nf_tables_dump_sets_start(struct netlink_callback *cb)
4834 {
4835 	struct nft_ctx *ctx_dump = NULL;
4836 
4837 	ctx_dump = kmemdup(cb->data, sizeof(*ctx_dump), GFP_ATOMIC);
4838 	if (ctx_dump == NULL)
4839 		return -ENOMEM;
4840 
4841 	cb->data = ctx_dump;
4842 	return 0;
4843 }
4844 
nf_tables_dump_sets_done(struct netlink_callback * cb)4845 static int nf_tables_dump_sets_done(struct netlink_callback *cb)
4846 {
4847 	kfree(cb->data);
4848 	return 0;
4849 }
4850 
4851 /* called with rcu_read_lock held */
nf_tables_getset(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])4852 static int nf_tables_getset(struct sk_buff *skb, const struct nfnl_info *info,
4853 			    const struct nlattr * const nla[])
4854 {
4855 	struct netlink_ext_ack *extack = info->extack;
4856 	u8 genmask = nft_genmask_cur(info->net);
4857 	u8 family = info->nfmsg->nfgen_family;
4858 	struct nft_table *table = NULL;
4859 	struct net *net = info->net;
4860 	const struct nft_set *set;
4861 	struct sk_buff *skb2;
4862 	struct nft_ctx ctx;
4863 	int err;
4864 
4865 	if (nla[NFTA_SET_TABLE]) {
4866 		table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family,
4867 					 genmask, 0);
4868 		if (IS_ERR(table)) {
4869 			NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]);
4870 			return PTR_ERR(table);
4871 		}
4872 	}
4873 
4874 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
4875 
4876 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
4877 		struct netlink_dump_control c = {
4878 			.start = nf_tables_dump_sets_start,
4879 			.dump = nf_tables_dump_sets,
4880 			.done = nf_tables_dump_sets_done,
4881 			.data = &ctx,
4882 			.module = THIS_MODULE,
4883 		};
4884 
4885 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
4886 	}
4887 
4888 	/* Only accept unspec with dump */
4889 	if (info->nfmsg->nfgen_family == NFPROTO_UNSPEC)
4890 		return -EAFNOSUPPORT;
4891 	if (!nla[NFTA_SET_TABLE])
4892 		return -EINVAL;
4893 
4894 	set = nft_set_lookup(table, nla[NFTA_SET_NAME], genmask);
4895 	if (IS_ERR(set)) {
4896 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
4897 		return PTR_ERR(set);
4898 	}
4899 
4900 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
4901 	if (skb2 == NULL)
4902 		return -ENOMEM;
4903 
4904 	err = nf_tables_fill_set(skb2, &ctx, set, NFT_MSG_NEWSET, 0);
4905 	if (err < 0)
4906 		goto err_fill_set_info;
4907 
4908 	return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid);
4909 
4910 err_fill_set_info:
4911 	kfree_skb(skb2);
4912 	return err;
4913 }
4914 
nft_set_desc_concat_parse(const struct nlattr * attr,struct nft_set_desc * desc)4915 static int nft_set_desc_concat_parse(const struct nlattr *attr,
4916 				     struct nft_set_desc *desc)
4917 {
4918 	struct nlattr *tb[NFTA_SET_FIELD_MAX + 1];
4919 	u32 len;
4920 	int err;
4921 
4922 	if (desc->field_count >= ARRAY_SIZE(desc->field_len))
4923 		return -E2BIG;
4924 
4925 	err = nla_parse_nested_deprecated(tb, NFTA_SET_FIELD_MAX, attr,
4926 					  nft_concat_policy, NULL);
4927 	if (err < 0)
4928 		return err;
4929 
4930 	if (!tb[NFTA_SET_FIELD_LEN])
4931 		return -EINVAL;
4932 
4933 	len = ntohl(nla_get_be32(tb[NFTA_SET_FIELD_LEN]));
4934 	if (!len || len > U8_MAX)
4935 		return -EINVAL;
4936 
4937 	desc->field_len[desc->field_count++] = len;
4938 
4939 	return 0;
4940 }
4941 
nft_set_desc_concat(struct nft_set_desc * desc,const struct nlattr * nla)4942 static int nft_set_desc_concat(struct nft_set_desc *desc,
4943 			       const struct nlattr *nla)
4944 {
4945 	u32 num_regs = 0, key_num_regs = 0;
4946 	struct nlattr *attr;
4947 	int rem, err, i;
4948 
4949 	nla_for_each_nested(attr, nla, rem) {
4950 		if (nla_type(attr) != NFTA_LIST_ELEM)
4951 			return -EINVAL;
4952 
4953 		err = nft_set_desc_concat_parse(attr, desc);
4954 		if (err < 0)
4955 			return err;
4956 	}
4957 
4958 	for (i = 0; i < desc->field_count; i++)
4959 		num_regs += DIV_ROUND_UP(desc->field_len[i], sizeof(u32));
4960 
4961 	key_num_regs = DIV_ROUND_UP(desc->klen, sizeof(u32));
4962 	if (key_num_regs != num_regs)
4963 		return -EINVAL;
4964 
4965 	if (num_regs > NFT_REG32_COUNT)
4966 		return -E2BIG;
4967 
4968 	return 0;
4969 }
4970 
nf_tables_set_desc_parse(struct nft_set_desc * desc,const struct nlattr * nla)4971 static int nf_tables_set_desc_parse(struct nft_set_desc *desc,
4972 				    const struct nlattr *nla)
4973 {
4974 	struct nlattr *da[NFTA_SET_DESC_MAX + 1];
4975 	int err;
4976 
4977 	err = nla_parse_nested_deprecated(da, NFTA_SET_DESC_MAX, nla,
4978 					  nft_set_desc_policy, NULL);
4979 	if (err < 0)
4980 		return err;
4981 
4982 	if (da[NFTA_SET_DESC_SIZE] != NULL)
4983 		desc->size = ntohl(nla_get_be32(da[NFTA_SET_DESC_SIZE]));
4984 	if (da[NFTA_SET_DESC_CONCAT])
4985 		err = nft_set_desc_concat(desc, da[NFTA_SET_DESC_CONCAT]);
4986 
4987 	return err;
4988 }
4989 
nft_set_expr_alloc(struct nft_ctx * ctx,struct nft_set * set,const struct nlattr * const * nla,struct nft_expr ** exprs,int * num_exprs,u32 flags)4990 static int nft_set_expr_alloc(struct nft_ctx *ctx, struct nft_set *set,
4991 			      const struct nlattr * const *nla,
4992 			      struct nft_expr **exprs, int *num_exprs,
4993 			      u32 flags)
4994 {
4995 	struct nft_expr *expr;
4996 	int err, i;
4997 
4998 	if (nla[NFTA_SET_EXPR]) {
4999 		expr = nft_set_elem_expr_alloc(ctx, set, nla[NFTA_SET_EXPR]);
5000 		if (IS_ERR(expr)) {
5001 			err = PTR_ERR(expr);
5002 			goto err_set_expr_alloc;
5003 		}
5004 		exprs[0] = expr;
5005 		(*num_exprs)++;
5006 	} else if (nla[NFTA_SET_EXPRESSIONS]) {
5007 		struct nlattr *tmp;
5008 		int left;
5009 
5010 		if (!(flags & NFT_SET_EXPR)) {
5011 			err = -EINVAL;
5012 			goto err_set_expr_alloc;
5013 		}
5014 		i = 0;
5015 		nla_for_each_nested(tmp, nla[NFTA_SET_EXPRESSIONS], left) {
5016 			if (i == NFT_SET_EXPR_MAX) {
5017 				err = -E2BIG;
5018 				goto err_set_expr_alloc;
5019 			}
5020 			if (nla_type(tmp) != NFTA_LIST_ELEM) {
5021 				err = -EINVAL;
5022 				goto err_set_expr_alloc;
5023 			}
5024 			expr = nft_set_elem_expr_alloc(ctx, set, tmp);
5025 			if (IS_ERR(expr)) {
5026 				err = PTR_ERR(expr);
5027 				goto err_set_expr_alloc;
5028 			}
5029 			exprs[i++] = expr;
5030 			(*num_exprs)++;
5031 		}
5032 	}
5033 
5034 	return 0;
5035 
5036 err_set_expr_alloc:
5037 	for (i = 0; i < *num_exprs; i++)
5038 		nft_expr_destroy(ctx, exprs[i]);
5039 
5040 	return err;
5041 }
5042 
nft_set_is_same(const struct nft_set * set,const struct nft_set_desc * desc,struct nft_expr * exprs[],u32 num_exprs,u32 flags)5043 static bool nft_set_is_same(const struct nft_set *set,
5044 			    const struct nft_set_desc *desc,
5045 			    struct nft_expr *exprs[], u32 num_exprs, u32 flags)
5046 {
5047 	int i;
5048 
5049 	if (set->ktype != desc->ktype ||
5050 	    set->dtype != desc->dtype ||
5051 	    set->flags != flags ||
5052 	    set->klen != desc->klen ||
5053 	    set->dlen != desc->dlen ||
5054 	    set->field_count != desc->field_count ||
5055 	    set->num_exprs != num_exprs)
5056 		return false;
5057 
5058 	for (i = 0; i < desc->field_count; i++) {
5059 		if (set->field_len[i] != desc->field_len[i])
5060 			return false;
5061 	}
5062 
5063 	for (i = 0; i < num_exprs; i++) {
5064 		if (set->exprs[i]->ops != exprs[i]->ops)
5065 			return false;
5066 	}
5067 
5068 	return true;
5069 }
5070 
nf_tables_newset(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])5071 static int nf_tables_newset(struct sk_buff *skb, const struct nfnl_info *info,
5072 			    const struct nlattr * const nla[])
5073 {
5074 	struct netlink_ext_ack *extack = info->extack;
5075 	u8 genmask = nft_genmask_next(info->net);
5076 	u8 family = info->nfmsg->nfgen_family;
5077 	const struct nft_set_ops *ops;
5078 	struct net *net = info->net;
5079 	struct nft_set_desc desc;
5080 	struct nft_table *table;
5081 	unsigned char *udata;
5082 	struct nft_set *set;
5083 	struct nft_ctx ctx;
5084 	size_t alloc_size;
5085 	int num_exprs = 0;
5086 	char *name;
5087 	int err, i;
5088 	u16 udlen;
5089 	u32 flags;
5090 	u64 size;
5091 
5092 	if (nla[NFTA_SET_TABLE] == NULL ||
5093 	    nla[NFTA_SET_NAME] == NULL ||
5094 	    nla[NFTA_SET_KEY_LEN] == NULL ||
5095 	    nla[NFTA_SET_ID] == NULL)
5096 		return -EINVAL;
5097 
5098 	memset(&desc, 0, sizeof(desc));
5099 
5100 	desc.ktype = NFT_DATA_VALUE;
5101 	if (nla[NFTA_SET_KEY_TYPE] != NULL) {
5102 		desc.ktype = ntohl(nla_get_be32(nla[NFTA_SET_KEY_TYPE]));
5103 		if ((desc.ktype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK)
5104 			return -EINVAL;
5105 	}
5106 
5107 	desc.klen = ntohl(nla_get_be32(nla[NFTA_SET_KEY_LEN]));
5108 	if (desc.klen == 0 || desc.klen > NFT_DATA_VALUE_MAXLEN)
5109 		return -EINVAL;
5110 
5111 	flags = 0;
5112 	if (nla[NFTA_SET_FLAGS] != NULL) {
5113 		flags = ntohl(nla_get_be32(nla[NFTA_SET_FLAGS]));
5114 		if (flags & ~(NFT_SET_ANONYMOUS | NFT_SET_CONSTANT |
5115 			      NFT_SET_INTERVAL | NFT_SET_TIMEOUT |
5116 			      NFT_SET_MAP | NFT_SET_EVAL |
5117 			      NFT_SET_OBJECT | NFT_SET_CONCAT | NFT_SET_EXPR))
5118 			return -EOPNOTSUPP;
5119 		/* Only one of these operations is supported */
5120 		if ((flags & (NFT_SET_MAP | NFT_SET_OBJECT)) ==
5121 			     (NFT_SET_MAP | NFT_SET_OBJECT))
5122 			return -EOPNOTSUPP;
5123 		if ((flags & (NFT_SET_EVAL | NFT_SET_OBJECT)) ==
5124 			     (NFT_SET_EVAL | NFT_SET_OBJECT))
5125 			return -EOPNOTSUPP;
5126 		if ((flags & (NFT_SET_ANONYMOUS | NFT_SET_TIMEOUT | NFT_SET_EVAL)) ==
5127 			     (NFT_SET_ANONYMOUS | NFT_SET_TIMEOUT))
5128 			return -EOPNOTSUPP;
5129 		if ((flags & (NFT_SET_CONSTANT | NFT_SET_TIMEOUT)) ==
5130 			     (NFT_SET_CONSTANT | NFT_SET_TIMEOUT))
5131 			return -EOPNOTSUPP;
5132 	}
5133 
5134 	desc.dtype = 0;
5135 	if (nla[NFTA_SET_DATA_TYPE] != NULL) {
5136 		if (!(flags & NFT_SET_MAP))
5137 			return -EINVAL;
5138 
5139 		desc.dtype = ntohl(nla_get_be32(nla[NFTA_SET_DATA_TYPE]));
5140 		if ((desc.dtype & NFT_DATA_RESERVED_MASK) == NFT_DATA_RESERVED_MASK &&
5141 		    desc.dtype != NFT_DATA_VERDICT)
5142 			return -EINVAL;
5143 
5144 		if (desc.dtype != NFT_DATA_VERDICT) {
5145 			if (nla[NFTA_SET_DATA_LEN] == NULL)
5146 				return -EINVAL;
5147 			desc.dlen = ntohl(nla_get_be32(nla[NFTA_SET_DATA_LEN]));
5148 			if (desc.dlen == 0 || desc.dlen > NFT_DATA_VALUE_MAXLEN)
5149 				return -EINVAL;
5150 		} else
5151 			desc.dlen = sizeof(struct nft_verdict);
5152 	} else if (flags & NFT_SET_MAP)
5153 		return -EINVAL;
5154 
5155 	if (nla[NFTA_SET_OBJ_TYPE] != NULL) {
5156 		if (!(flags & NFT_SET_OBJECT))
5157 			return -EINVAL;
5158 
5159 		desc.objtype = ntohl(nla_get_be32(nla[NFTA_SET_OBJ_TYPE]));
5160 		if (desc.objtype == NFT_OBJECT_UNSPEC ||
5161 		    desc.objtype > NFT_OBJECT_MAX)
5162 			return -EOPNOTSUPP;
5163 	} else if (flags & NFT_SET_OBJECT)
5164 		return -EINVAL;
5165 	else
5166 		desc.objtype = NFT_OBJECT_UNSPEC;
5167 
5168 	desc.timeout = 0;
5169 	if (nla[NFTA_SET_TIMEOUT] != NULL) {
5170 		if (!(flags & NFT_SET_TIMEOUT))
5171 			return -EINVAL;
5172 
5173 		if (flags & NFT_SET_ANONYMOUS)
5174 			return -EOPNOTSUPP;
5175 
5176 		err = nf_msecs_to_jiffies64(nla[NFTA_SET_TIMEOUT], &desc.timeout);
5177 		if (err)
5178 			return err;
5179 	}
5180 	desc.gc_int = 0;
5181 	if (nla[NFTA_SET_GC_INTERVAL] != NULL) {
5182 		if (!(flags & NFT_SET_TIMEOUT))
5183 			return -EINVAL;
5184 
5185 		if (flags & NFT_SET_ANONYMOUS)
5186 			return -EOPNOTSUPP;
5187 
5188 		desc.gc_int = ntohl(nla_get_be32(nla[NFTA_SET_GC_INTERVAL]));
5189 	}
5190 
5191 	desc.policy = NFT_SET_POL_PERFORMANCE;
5192 	if (nla[NFTA_SET_POLICY] != NULL) {
5193 		desc.policy = ntohl(nla_get_be32(nla[NFTA_SET_POLICY]));
5194 		switch (desc.policy) {
5195 		case NFT_SET_POL_PERFORMANCE:
5196 		case NFT_SET_POL_MEMORY:
5197 			break;
5198 		default:
5199 			return -EOPNOTSUPP;
5200 		}
5201 	}
5202 
5203 	if (nla[NFTA_SET_DESC] != NULL) {
5204 		err = nf_tables_set_desc_parse(&desc, nla[NFTA_SET_DESC]);
5205 		if (err < 0)
5206 			return err;
5207 
5208 		if (desc.field_count > 1) {
5209 			if (!(flags & NFT_SET_CONCAT))
5210 				return -EINVAL;
5211 		} else if (flags & NFT_SET_CONCAT) {
5212 			return -EINVAL;
5213 		}
5214 	} else if (flags & NFT_SET_CONCAT) {
5215 		return -EINVAL;
5216 	}
5217 
5218 	if (nla[NFTA_SET_EXPR] || nla[NFTA_SET_EXPRESSIONS])
5219 		desc.expr = true;
5220 
5221 	table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family, genmask,
5222 				 NETLINK_CB(skb).portid);
5223 	if (IS_ERR(table)) {
5224 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]);
5225 		return PTR_ERR(table);
5226 	}
5227 
5228 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
5229 
5230 	set = nft_set_lookup(table, nla[NFTA_SET_NAME], genmask);
5231 	if (IS_ERR(set)) {
5232 		if (PTR_ERR(set) != -ENOENT) {
5233 			NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
5234 			return PTR_ERR(set);
5235 		}
5236 	} else {
5237 		struct nft_expr *exprs[NFT_SET_EXPR_MAX] = {};
5238 
5239 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
5240 			NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
5241 			return -EEXIST;
5242 		}
5243 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
5244 			return -EOPNOTSUPP;
5245 
5246 		if (nft_set_is_anonymous(set))
5247 			return -EOPNOTSUPP;
5248 
5249 		err = nft_set_expr_alloc(&ctx, set, nla, exprs, &num_exprs, flags);
5250 		if (err < 0)
5251 			return err;
5252 
5253 		err = 0;
5254 		if (!nft_set_is_same(set, &desc, exprs, num_exprs, flags)) {
5255 			NL_SET_BAD_ATTR(extack, nla[NFTA_SET_NAME]);
5256 			err = -EEXIST;
5257 		}
5258 
5259 		for (i = 0; i < num_exprs; i++)
5260 			nft_expr_destroy(&ctx, exprs[i]);
5261 
5262 		if (err < 0)
5263 			return err;
5264 
5265 		return __nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set, &desc);
5266 	}
5267 
5268 	if (!(info->nlh->nlmsg_flags & NLM_F_CREATE))
5269 		return -ENOENT;
5270 
5271 	ops = nft_select_set_ops(&ctx, flags, &desc);
5272 	if (IS_ERR(ops))
5273 		return PTR_ERR(ops);
5274 
5275 	udlen = 0;
5276 	if (nla[NFTA_SET_USERDATA])
5277 		udlen = nla_len(nla[NFTA_SET_USERDATA]);
5278 
5279 	size = 0;
5280 	if (ops->privsize != NULL)
5281 		size = ops->privsize(nla, &desc);
5282 	alloc_size = sizeof(*set) + size + udlen;
5283 	if (alloc_size < size || alloc_size > INT_MAX)
5284 		return -ENOMEM;
5285 
5286 	if (!nft_use_inc(&table->use))
5287 		return -EMFILE;
5288 
5289 	set = kvzalloc(alloc_size, GFP_KERNEL_ACCOUNT);
5290 	if (!set) {
5291 		err = -ENOMEM;
5292 		goto err_alloc;
5293 	}
5294 
5295 	name = nla_strdup(nla[NFTA_SET_NAME], GFP_KERNEL_ACCOUNT);
5296 	if (!name) {
5297 		err = -ENOMEM;
5298 		goto err_set_name;
5299 	}
5300 
5301 	err = nf_tables_set_alloc_name(&ctx, set, name);
5302 	kfree(name);
5303 	if (err < 0)
5304 		goto err_set_name;
5305 
5306 	udata = NULL;
5307 	if (udlen) {
5308 		udata = set->data + size;
5309 		nla_memcpy(udata, nla[NFTA_SET_USERDATA], udlen);
5310 	}
5311 
5312 	INIT_LIST_HEAD(&set->bindings);
5313 	INIT_LIST_HEAD(&set->catchall_list);
5314 	refcount_set(&set->refs, 1);
5315 	set->table = table;
5316 	write_pnet(&set->net, net);
5317 	set->ops = ops;
5318 	set->ktype = desc.ktype;
5319 	set->klen = desc.klen;
5320 	set->dtype = desc.dtype;
5321 	set->objtype = desc.objtype;
5322 	set->dlen = desc.dlen;
5323 	set->flags = flags;
5324 	set->size = desc.size;
5325 	set->policy = desc.policy;
5326 	set->udlen = udlen;
5327 	set->udata = udata;
5328 	set->timeout = desc.timeout;
5329 	set->gc_int = desc.gc_int;
5330 
5331 	set->field_count = desc.field_count;
5332 	for (i = 0; i < desc.field_count; i++)
5333 		set->field_len[i] = desc.field_len[i];
5334 
5335 	err = ops->init(set, &desc, nla);
5336 	if (err < 0)
5337 		goto err_set_init;
5338 
5339 	err = nft_set_expr_alloc(&ctx, set, nla, set->exprs, &num_exprs, flags);
5340 	if (err < 0)
5341 		goto err_set_destroy;
5342 
5343 	set->num_exprs = num_exprs;
5344 	set->handle = nf_tables_alloc_handle(table);
5345 	INIT_LIST_HEAD(&set->pending_update);
5346 
5347 	err = nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set);
5348 	if (err < 0)
5349 		goto err_set_expr_alloc;
5350 
5351 	list_add_tail_rcu(&set->list, &table->sets);
5352 
5353 	return 0;
5354 
5355 err_set_expr_alloc:
5356 	for (i = 0; i < set->num_exprs; i++)
5357 		nft_expr_destroy(&ctx, set->exprs[i]);
5358 err_set_destroy:
5359 	ops->destroy(&ctx, set);
5360 err_set_init:
5361 	kfree(set->name);
5362 err_set_name:
5363 	kvfree(set);
5364 err_alloc:
5365 	nft_use_dec_restore(&table->use);
5366 
5367 	return err;
5368 }
5369 
nft_set_catchall_destroy(const struct nft_ctx * ctx,struct nft_set * set)5370 static void nft_set_catchall_destroy(const struct nft_ctx *ctx,
5371 				     struct nft_set *set)
5372 {
5373 	struct nft_set_elem_catchall *next, *catchall;
5374 
5375 	list_for_each_entry_safe(catchall, next, &set->catchall_list, list) {
5376 		list_del_rcu(&catchall->list);
5377 		nf_tables_set_elem_destroy(ctx, set, catchall->elem);
5378 		kfree_rcu(catchall, rcu);
5379 	}
5380 }
5381 
nft_set_put(struct nft_set * set)5382 static void nft_set_put(struct nft_set *set)
5383 {
5384 	if (refcount_dec_and_test(&set->refs)) {
5385 		kfree(set->name);
5386 		kvfree(set);
5387 	}
5388 }
5389 
nft_set_destroy(const struct nft_ctx * ctx,struct nft_set * set)5390 static void nft_set_destroy(const struct nft_ctx *ctx, struct nft_set *set)
5391 {
5392 	int i;
5393 
5394 	if (WARN_ON(set->use > 0))
5395 		return;
5396 
5397 	for (i = 0; i < set->num_exprs; i++)
5398 		nft_expr_destroy(ctx, set->exprs[i]);
5399 
5400 	set->ops->destroy(ctx, set);
5401 	nft_set_catchall_destroy(ctx, set);
5402 	nft_set_put(set);
5403 }
5404 
nf_tables_delset(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])5405 static int nf_tables_delset(struct sk_buff *skb, const struct nfnl_info *info,
5406 			    const struct nlattr * const nla[])
5407 {
5408 	struct netlink_ext_ack *extack = info->extack;
5409 	u8 genmask = nft_genmask_next(info->net);
5410 	u8 family = info->nfmsg->nfgen_family;
5411 	struct net *net = info->net;
5412 	const struct nlattr *attr;
5413 	struct nft_table *table;
5414 	struct nft_set *set;
5415 	struct nft_ctx ctx;
5416 
5417 	if (info->nfmsg->nfgen_family == NFPROTO_UNSPEC)
5418 		return -EAFNOSUPPORT;
5419 
5420 	table = nft_table_lookup(net, nla[NFTA_SET_TABLE], family,
5421 				 genmask, NETLINK_CB(skb).portid);
5422 	if (IS_ERR(table)) {
5423 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_TABLE]);
5424 		return PTR_ERR(table);
5425 	}
5426 
5427 	if (nla[NFTA_SET_HANDLE]) {
5428 		attr = nla[NFTA_SET_HANDLE];
5429 		set = nft_set_lookup_byhandle(table, attr, genmask);
5430 	} else {
5431 		attr = nla[NFTA_SET_NAME];
5432 		set = nft_set_lookup(table, attr, genmask);
5433 	}
5434 
5435 	if (IS_ERR(set)) {
5436 		if (PTR_ERR(set) == -ENOENT &&
5437 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYSET)
5438 			return 0;
5439 
5440 		NL_SET_BAD_ATTR(extack, attr);
5441 		return PTR_ERR(set);
5442 	}
5443 	if (set->use ||
5444 	    (info->nlh->nlmsg_flags & NLM_F_NONREC &&
5445 	     atomic_read(&set->nelems) > 0)) {
5446 		NL_SET_BAD_ATTR(extack, attr);
5447 		return -EBUSY;
5448 	}
5449 
5450 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
5451 
5452 	return nft_delset(&ctx, set);
5453 }
5454 
5455 static int nft_validate_register_store(const struct nft_ctx *ctx,
5456 				       enum nft_registers reg,
5457 				       const struct nft_data *data,
5458 				       enum nft_data_types type,
5459 				       unsigned int len);
5460 
nft_setelem_data_validate(const struct nft_ctx * ctx,struct nft_set * set,struct nft_elem_priv * elem_priv)5461 static int nft_setelem_data_validate(const struct nft_ctx *ctx,
5462 				     struct nft_set *set,
5463 				     struct nft_elem_priv *elem_priv)
5464 {
5465 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
5466 	enum nft_registers dreg;
5467 
5468 	dreg = nft_type_to_reg(set->dtype);
5469 	return nft_validate_register_store(ctx, dreg, nft_set_ext_data(ext),
5470 					   set->dtype == NFT_DATA_VERDICT ?
5471 					   NFT_DATA_VERDICT : NFT_DATA_VALUE,
5472 					   set->dlen);
5473 }
5474 
nf_tables_bind_check_setelem(const struct nft_ctx * ctx,struct nft_set * set,const struct nft_set_iter * iter,struct nft_elem_priv * elem_priv)5475 static int nf_tables_bind_check_setelem(const struct nft_ctx *ctx,
5476 					struct nft_set *set,
5477 					const struct nft_set_iter *iter,
5478 					struct nft_elem_priv *elem_priv)
5479 {
5480 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
5481 
5482 	if (!nft_set_elem_active(ext, iter->genmask))
5483 		return 0;
5484 
5485 	return nft_setelem_data_validate(ctx, set, elem_priv);
5486 }
5487 
nft_set_catchall_bind_check(const struct nft_ctx * ctx,struct nft_set * set)5488 static int nft_set_catchall_bind_check(const struct nft_ctx *ctx,
5489 				       struct nft_set *set)
5490 {
5491 	u8 genmask = nft_genmask_next(ctx->net);
5492 	struct nft_set_elem_catchall *catchall;
5493 	struct nft_set_ext *ext;
5494 	int ret = 0;
5495 
5496 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
5497 		ext = nft_set_elem_ext(set, catchall->elem);
5498 		if (!nft_set_elem_active(ext, genmask))
5499 			continue;
5500 
5501 		ret = nft_setelem_data_validate(ctx, set, catchall->elem);
5502 		if (ret < 0)
5503 			break;
5504 	}
5505 
5506 	return ret;
5507 }
5508 
nf_tables_bind_set(const struct nft_ctx * ctx,struct nft_set * set,struct nft_set_binding * binding)5509 int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set,
5510 		       struct nft_set_binding *binding)
5511 {
5512 	struct nft_set_binding *i;
5513 	struct nft_set_iter iter;
5514 
5515 	if (!list_empty(&set->bindings) && nft_set_is_anonymous(set))
5516 		return -EBUSY;
5517 
5518 	if (binding->flags & NFT_SET_MAP) {
5519 		/* If the set is already bound to the same chain all
5520 		 * jumps are already validated for that chain.
5521 		 */
5522 		list_for_each_entry(i, &set->bindings, list) {
5523 			if (i->flags & NFT_SET_MAP &&
5524 			    i->chain == binding->chain)
5525 				goto bind;
5526 		}
5527 
5528 		iter.genmask	= nft_genmask_next(ctx->net);
5529 		iter.type	= NFT_ITER_UPDATE;
5530 		iter.skip 	= 0;
5531 		iter.count	= 0;
5532 		iter.err	= 0;
5533 		iter.fn		= nf_tables_bind_check_setelem;
5534 
5535 		set->ops->walk(ctx, set, &iter);
5536 		if (!iter.err)
5537 			iter.err = nft_set_catchall_bind_check(ctx, set);
5538 
5539 		if (iter.err < 0)
5540 			return iter.err;
5541 	}
5542 bind:
5543 	if (!nft_use_inc(&set->use))
5544 		return -EMFILE;
5545 
5546 	binding->chain = ctx->chain;
5547 	list_add_tail_rcu(&binding->list, &set->bindings);
5548 	nft_set_trans_bind(ctx, set);
5549 
5550 	return 0;
5551 }
5552 EXPORT_SYMBOL_GPL(nf_tables_bind_set);
5553 
nf_tables_unbind_set(const struct nft_ctx * ctx,struct nft_set * set,struct nft_set_binding * binding,bool event)5554 static void nf_tables_unbind_set(const struct nft_ctx *ctx, struct nft_set *set,
5555 				 struct nft_set_binding *binding, bool event)
5556 {
5557 	list_del_rcu(&binding->list);
5558 
5559 	if (list_empty(&set->bindings) && nft_set_is_anonymous(set)) {
5560 		list_del_rcu(&set->list);
5561 		set->dead = 1;
5562 		if (event)
5563 			nf_tables_set_notify(ctx, set, NFT_MSG_DELSET,
5564 					     GFP_KERNEL);
5565 	}
5566 }
5567 
5568 static void nft_setelem_data_activate(const struct net *net,
5569 				      const struct nft_set *set,
5570 				      struct nft_elem_priv *elem_priv);
5571 
nft_mapelem_activate(const struct nft_ctx * ctx,struct nft_set * set,const struct nft_set_iter * iter,struct nft_elem_priv * elem_priv)5572 static int nft_mapelem_activate(const struct nft_ctx *ctx,
5573 				struct nft_set *set,
5574 				const struct nft_set_iter *iter,
5575 				struct nft_elem_priv *elem_priv)
5576 {
5577 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
5578 
5579 	/* called from abort path, reverse check to undo changes. */
5580 	if (nft_set_elem_active(ext, iter->genmask))
5581 		return 0;
5582 
5583 	nft_clear(ctx->net, ext);
5584 	nft_setelem_data_activate(ctx->net, set, elem_priv);
5585 
5586 	return 0;
5587 }
5588 
nft_map_catchall_activate(const struct nft_ctx * ctx,struct nft_set * set)5589 static void nft_map_catchall_activate(const struct nft_ctx *ctx,
5590 				      struct nft_set *set)
5591 {
5592 	u8 genmask = nft_genmask_next(ctx->net);
5593 	struct nft_set_elem_catchall *catchall;
5594 	struct nft_set_ext *ext;
5595 
5596 	list_for_each_entry(catchall, &set->catchall_list, list) {
5597 		ext = nft_set_elem_ext(set, catchall->elem);
5598 		if (!nft_set_elem_active(ext, genmask))
5599 			continue;
5600 
5601 		nft_clear(ctx->net, ext);
5602 		nft_setelem_data_activate(ctx->net, set, catchall->elem);
5603 		break;
5604 	}
5605 }
5606 
nft_map_activate(const struct nft_ctx * ctx,struct nft_set * set)5607 static void nft_map_activate(const struct nft_ctx *ctx, struct nft_set *set)
5608 {
5609 	struct nft_set_iter iter = {
5610 		.genmask	= nft_genmask_next(ctx->net),
5611 		.type		= NFT_ITER_UPDATE,
5612 		.fn		= nft_mapelem_activate,
5613 	};
5614 
5615 	set->ops->walk(ctx, set, &iter);
5616 	WARN_ON_ONCE(iter.err);
5617 
5618 	nft_map_catchall_activate(ctx, set);
5619 }
5620 
nf_tables_activate_set(const struct nft_ctx * ctx,struct nft_set * set)5621 void nf_tables_activate_set(const struct nft_ctx *ctx, struct nft_set *set)
5622 {
5623 	if (nft_set_is_anonymous(set)) {
5624 		if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
5625 			nft_map_activate(ctx, set);
5626 
5627 		nft_clear(ctx->net, set);
5628 	}
5629 
5630 	nft_use_inc_restore(&set->use);
5631 }
5632 EXPORT_SYMBOL_GPL(nf_tables_activate_set);
5633 
nf_tables_deactivate_set(const struct nft_ctx * ctx,struct nft_set * set,struct nft_set_binding * binding,enum nft_trans_phase phase)5634 void nf_tables_deactivate_set(const struct nft_ctx *ctx, struct nft_set *set,
5635 			      struct nft_set_binding *binding,
5636 			      enum nft_trans_phase phase)
5637 {
5638 	switch (phase) {
5639 	case NFT_TRANS_PREPARE_ERROR:
5640 		nft_set_trans_unbind(ctx, set);
5641 		if (nft_set_is_anonymous(set))
5642 			nft_deactivate_next(ctx->net, set);
5643 		else
5644 			list_del_rcu(&binding->list);
5645 
5646 		nft_use_dec(&set->use);
5647 		break;
5648 	case NFT_TRANS_PREPARE:
5649 		if (nft_set_is_anonymous(set)) {
5650 			if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
5651 				nft_map_deactivate(ctx, set);
5652 
5653 			nft_deactivate_next(ctx->net, set);
5654 		}
5655 		nft_use_dec(&set->use);
5656 		return;
5657 	case NFT_TRANS_ABORT:
5658 	case NFT_TRANS_RELEASE:
5659 		if (nft_set_is_anonymous(set) &&
5660 		    set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
5661 			nft_map_deactivate(ctx, set);
5662 
5663 		nft_use_dec(&set->use);
5664 		fallthrough;
5665 	default:
5666 		nf_tables_unbind_set(ctx, set, binding,
5667 				     phase == NFT_TRANS_COMMIT);
5668 	}
5669 }
5670 EXPORT_SYMBOL_GPL(nf_tables_deactivate_set);
5671 
nf_tables_destroy_set(const struct nft_ctx * ctx,struct nft_set * set)5672 void nf_tables_destroy_set(const struct nft_ctx *ctx, struct nft_set *set)
5673 {
5674 	if (list_empty(&set->bindings) && nft_set_is_anonymous(set))
5675 		nft_set_destroy(ctx, set);
5676 }
5677 EXPORT_SYMBOL_GPL(nf_tables_destroy_set);
5678 
5679 const struct nft_set_ext_type nft_set_ext_types[] = {
5680 	[NFT_SET_EXT_KEY]		= {
5681 		.align	= __alignof__(u32),
5682 	},
5683 	[NFT_SET_EXT_DATA]		= {
5684 		.align	= __alignof__(u32),
5685 	},
5686 	[NFT_SET_EXT_EXPRESSIONS]	= {
5687 		.align	= __alignof__(struct nft_set_elem_expr),
5688 	},
5689 	[NFT_SET_EXT_OBJREF]		= {
5690 		.len	= sizeof(struct nft_object *),
5691 		.align	= __alignof__(struct nft_object *),
5692 	},
5693 	[NFT_SET_EXT_FLAGS]		= {
5694 		.len	= sizeof(u8),
5695 		.align	= __alignof__(u8),
5696 	},
5697 	[NFT_SET_EXT_TIMEOUT]		= {
5698 		.len	= sizeof(struct nft_timeout),
5699 		.align	= __alignof__(struct nft_timeout),
5700 	},
5701 	[NFT_SET_EXT_USERDATA]		= {
5702 		.len	= sizeof(struct nft_userdata),
5703 		.align	= __alignof__(struct nft_userdata),
5704 	},
5705 	[NFT_SET_EXT_KEY_END]		= {
5706 		.align	= __alignof__(u32),
5707 	},
5708 };
5709 
5710 /*
5711  * Set elements
5712  */
5713 
5714 static const struct nla_policy nft_set_elem_policy[NFTA_SET_ELEM_MAX + 1] = {
5715 	[NFTA_SET_ELEM_KEY]		= { .type = NLA_NESTED },
5716 	[NFTA_SET_ELEM_DATA]		= { .type = NLA_NESTED },
5717 	[NFTA_SET_ELEM_FLAGS]		= { .type = NLA_U32 },
5718 	[NFTA_SET_ELEM_TIMEOUT]		= { .type = NLA_U64 },
5719 	[NFTA_SET_ELEM_EXPIRATION]	= { .type = NLA_U64 },
5720 	[NFTA_SET_ELEM_USERDATA]	= { .type = NLA_BINARY,
5721 					    .len = NFT_USERDATA_MAXLEN },
5722 	[NFTA_SET_ELEM_EXPR]		= { .type = NLA_NESTED },
5723 	[NFTA_SET_ELEM_OBJREF]		= { .type = NLA_STRING,
5724 					    .len = NFT_OBJ_MAXNAMELEN - 1 },
5725 	[NFTA_SET_ELEM_KEY_END]		= { .type = NLA_NESTED },
5726 	[NFTA_SET_ELEM_EXPRESSIONS]	= NLA_POLICY_NESTED_ARRAY(nft_expr_policy),
5727 };
5728 
5729 static const struct nla_policy nft_set_elem_list_policy[NFTA_SET_ELEM_LIST_MAX + 1] = {
5730 	[NFTA_SET_ELEM_LIST_TABLE]	= { .type = NLA_STRING,
5731 					    .len = NFT_TABLE_MAXNAMELEN - 1 },
5732 	[NFTA_SET_ELEM_LIST_SET]	= { .type = NLA_STRING,
5733 					    .len = NFT_SET_MAXNAMELEN - 1 },
5734 	[NFTA_SET_ELEM_LIST_ELEMENTS]	= NLA_POLICY_NESTED_ARRAY(nft_set_elem_policy),
5735 	[NFTA_SET_ELEM_LIST_SET_ID]	= { .type = NLA_U32 },
5736 };
5737 
nft_set_elem_expr_dump(struct sk_buff * skb,const struct nft_set * set,const struct nft_set_ext * ext,bool reset)5738 static int nft_set_elem_expr_dump(struct sk_buff *skb,
5739 				  const struct nft_set *set,
5740 				  const struct nft_set_ext *ext,
5741 				  bool reset)
5742 {
5743 	struct nft_set_elem_expr *elem_expr;
5744 	u32 size, num_exprs = 0;
5745 	struct nft_expr *expr;
5746 	struct nlattr *nest;
5747 
5748 	elem_expr = nft_set_ext_expr(ext);
5749 	nft_setelem_expr_foreach(expr, elem_expr, size)
5750 		num_exprs++;
5751 
5752 	if (num_exprs == 1) {
5753 		expr = nft_setelem_expr_at(elem_expr, 0);
5754 		if (nft_expr_dump(skb, NFTA_SET_ELEM_EXPR, expr, reset) < 0)
5755 			return -1;
5756 
5757 		return 0;
5758 	} else if (num_exprs > 1) {
5759 		nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_EXPRESSIONS);
5760 		if (nest == NULL)
5761 			goto nla_put_failure;
5762 
5763 		nft_setelem_expr_foreach(expr, elem_expr, size) {
5764 			expr = nft_setelem_expr_at(elem_expr, size);
5765 			if (nft_expr_dump(skb, NFTA_LIST_ELEM, expr, reset) < 0)
5766 				goto nla_put_failure;
5767 		}
5768 		nla_nest_end(skb, nest);
5769 	}
5770 	return 0;
5771 
5772 nla_put_failure:
5773 	return -1;
5774 }
5775 
nf_tables_fill_setelem(struct sk_buff * skb,const struct nft_set * set,const struct nft_elem_priv * elem_priv,bool reset)5776 static int nf_tables_fill_setelem(struct sk_buff *skb,
5777 				  const struct nft_set *set,
5778 				  const struct nft_elem_priv *elem_priv,
5779 				  bool reset)
5780 {
5781 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
5782 	unsigned char *b = skb_tail_pointer(skb);
5783 	struct nlattr *nest;
5784 
5785 	nest = nla_nest_start_noflag(skb, NFTA_LIST_ELEM);
5786 	if (nest == NULL)
5787 		goto nla_put_failure;
5788 
5789 	if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY) &&
5790 	    nft_data_dump(skb, NFTA_SET_ELEM_KEY, nft_set_ext_key(ext),
5791 			  NFT_DATA_VALUE, set->klen) < 0)
5792 		goto nla_put_failure;
5793 
5794 	if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END) &&
5795 	    nft_data_dump(skb, NFTA_SET_ELEM_KEY_END, nft_set_ext_key_end(ext),
5796 			  NFT_DATA_VALUE, set->klen) < 0)
5797 		goto nla_put_failure;
5798 
5799 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
5800 	    nft_data_dump(skb, NFTA_SET_ELEM_DATA, nft_set_ext_data(ext),
5801 			  nft_set_datatype(set), set->dlen) < 0)
5802 		goto nla_put_failure;
5803 
5804 	if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS) &&
5805 	    nft_set_elem_expr_dump(skb, set, ext, reset))
5806 		goto nla_put_failure;
5807 
5808 	if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) &&
5809 	    nla_put_string(skb, NFTA_SET_ELEM_OBJREF,
5810 			   (*nft_set_ext_obj(ext))->key.name) < 0)
5811 		goto nla_put_failure;
5812 
5813 	if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
5814 	    nla_put_be32(skb, NFTA_SET_ELEM_FLAGS,
5815 		         htonl(*nft_set_ext_flags(ext))))
5816 		goto nla_put_failure;
5817 
5818 	if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT)) {
5819 		u64 timeout = READ_ONCE(nft_set_ext_timeout(ext)->timeout);
5820 		u64 set_timeout = READ_ONCE(set->timeout);
5821 		__be64 msecs = 0;
5822 
5823 		if (set_timeout != timeout) {
5824 			msecs = nf_jiffies64_to_msecs(timeout);
5825 			if (nla_put_be64(skb, NFTA_SET_ELEM_TIMEOUT, msecs,
5826 					 NFTA_SET_ELEM_PAD))
5827 				goto nla_put_failure;
5828 		}
5829 
5830 		if (timeout > 0) {
5831 			u64 expires, now = get_jiffies_64();
5832 
5833 			expires = READ_ONCE(nft_set_ext_timeout(ext)->expiration);
5834 			if (time_before64(now, expires))
5835 				expires -= now;
5836 			else
5837 				expires = 0;
5838 
5839 			if (nla_put_be64(skb, NFTA_SET_ELEM_EXPIRATION,
5840 					 nf_jiffies64_to_msecs(expires),
5841 					 NFTA_SET_ELEM_PAD))
5842 				goto nla_put_failure;
5843 		}
5844 	}
5845 
5846 	if (nft_set_ext_exists(ext, NFT_SET_EXT_USERDATA)) {
5847 		struct nft_userdata *udata;
5848 
5849 		udata = nft_set_ext_userdata(ext);
5850 		if (nla_put(skb, NFTA_SET_ELEM_USERDATA,
5851 			    udata->len + 1, udata->data))
5852 			goto nla_put_failure;
5853 	}
5854 
5855 	nla_nest_end(skb, nest);
5856 	return 0;
5857 
5858 nla_put_failure:
5859 	nlmsg_trim(skb, b);
5860 	return -EMSGSIZE;
5861 }
5862 
5863 struct nft_set_dump_args {
5864 	const struct netlink_callback	*cb;
5865 	struct nft_set_iter		iter;
5866 	struct sk_buff			*skb;
5867 	bool				reset;
5868 };
5869 
nf_tables_dump_setelem(const struct nft_ctx * ctx,struct nft_set * set,const struct nft_set_iter * iter,struct nft_elem_priv * elem_priv)5870 static int nf_tables_dump_setelem(const struct nft_ctx *ctx,
5871 				  struct nft_set *set,
5872 				  const struct nft_set_iter *iter,
5873 				  struct nft_elem_priv *elem_priv)
5874 {
5875 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
5876 	struct nft_set_dump_args *args;
5877 
5878 	if (!nft_set_elem_active(ext, iter->genmask))
5879 		return 0;
5880 
5881 	if (nft_set_elem_expired(ext) || nft_set_elem_is_dead(ext))
5882 		return 0;
5883 
5884 	args = container_of(iter, struct nft_set_dump_args, iter);
5885 	return nf_tables_fill_setelem(args->skb, set, elem_priv, args->reset);
5886 }
5887 
audit_log_nft_set_reset(const struct nft_table * table,unsigned int base_seq,unsigned int nentries)5888 static void audit_log_nft_set_reset(const struct nft_table *table,
5889 				    unsigned int base_seq,
5890 				    unsigned int nentries)
5891 {
5892 	char *buf = kasprintf(GFP_ATOMIC, "%s:%u", table->name, base_seq);
5893 
5894 	audit_log_nfcfg(buf, table->family, nentries,
5895 			AUDIT_NFT_OP_SETELEM_RESET, GFP_ATOMIC);
5896 	kfree(buf);
5897 }
5898 
5899 struct nft_set_dump_ctx {
5900 	const struct nft_set	*set;
5901 	struct nft_ctx		ctx;
5902 	bool			reset;
5903 };
5904 
nft_set_catchall_dump(struct net * net,struct sk_buff * skb,const struct nft_set * set,bool reset,unsigned int base_seq)5905 static int nft_set_catchall_dump(struct net *net, struct sk_buff *skb,
5906 				 const struct nft_set *set, bool reset,
5907 				 unsigned int base_seq)
5908 {
5909 	struct nft_set_elem_catchall *catchall;
5910 	u8 genmask = nft_genmask_cur(net);
5911 	struct nft_set_ext *ext;
5912 	int ret = 0;
5913 
5914 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
5915 		ext = nft_set_elem_ext(set, catchall->elem);
5916 		if (!nft_set_elem_active(ext, genmask) ||
5917 		    nft_set_elem_expired(ext))
5918 			continue;
5919 
5920 		ret = nf_tables_fill_setelem(skb, set, catchall->elem, reset);
5921 		if (reset && !ret)
5922 			audit_log_nft_set_reset(set->table, base_seq, 1);
5923 		break;
5924 	}
5925 
5926 	return ret;
5927 }
5928 
nf_tables_dump_set(struct sk_buff * skb,struct netlink_callback * cb)5929 static int nf_tables_dump_set(struct sk_buff *skb, struct netlink_callback *cb)
5930 {
5931 	struct nft_set_dump_ctx *dump_ctx = cb->data;
5932 	struct net *net = sock_net(skb->sk);
5933 	struct nftables_pernet *nft_net;
5934 	struct nft_table *table;
5935 	struct nft_set *set;
5936 	struct nft_set_dump_args args;
5937 	bool set_found = false;
5938 	struct nlmsghdr *nlh;
5939 	struct nlattr *nest;
5940 	u32 portid, seq;
5941 	int event;
5942 
5943 	rcu_read_lock();
5944 	nft_net = nft_pernet(net);
5945 	cb->seq = READ_ONCE(nft_net->base_seq);
5946 
5947 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
5948 		if (dump_ctx->ctx.family != NFPROTO_UNSPEC &&
5949 		    dump_ctx->ctx.family != table->family)
5950 			continue;
5951 
5952 		if (table != dump_ctx->ctx.table)
5953 			continue;
5954 
5955 		list_for_each_entry_rcu(set, &table->sets, list) {
5956 			if (set == dump_ctx->set) {
5957 				set_found = true;
5958 				break;
5959 			}
5960 		}
5961 		break;
5962 	}
5963 
5964 	if (!set_found) {
5965 		rcu_read_unlock();
5966 		return -ENOENT;
5967 	}
5968 
5969 	event  = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, NFT_MSG_NEWSETELEM);
5970 	portid = NETLINK_CB(cb->skb).portid;
5971 	seq    = cb->nlh->nlmsg_seq;
5972 
5973 	nlh = nfnl_msg_put(skb, portid, seq, event, NLM_F_MULTI,
5974 			   table->family, NFNETLINK_V0, nft_base_seq(net));
5975 	if (!nlh)
5976 		goto nla_put_failure;
5977 
5978 	if (nla_put_string(skb, NFTA_SET_ELEM_LIST_TABLE, table->name))
5979 		goto nla_put_failure;
5980 	if (nla_put_string(skb, NFTA_SET_ELEM_LIST_SET, set->name))
5981 		goto nla_put_failure;
5982 
5983 	nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_LIST_ELEMENTS);
5984 	if (nest == NULL)
5985 		goto nla_put_failure;
5986 
5987 	args.cb			= cb;
5988 	args.skb		= skb;
5989 	args.reset		= dump_ctx->reset;
5990 	args.iter.genmask	= nft_genmask_cur(net);
5991 	args.iter.type		= NFT_ITER_READ;
5992 	args.iter.skip		= cb->args[0];
5993 	args.iter.count		= 0;
5994 	args.iter.err		= 0;
5995 	args.iter.fn		= nf_tables_dump_setelem;
5996 	set->ops->walk(&dump_ctx->ctx, set, &args.iter);
5997 
5998 	if (!args.iter.err && args.iter.count == cb->args[0])
5999 		args.iter.err = nft_set_catchall_dump(net, skb, set,
6000 						      dump_ctx->reset, cb->seq);
6001 	nla_nest_end(skb, nest);
6002 	nlmsg_end(skb, nlh);
6003 
6004 	rcu_read_unlock();
6005 
6006 	if (args.iter.err && args.iter.err != -EMSGSIZE)
6007 		return args.iter.err;
6008 	if (args.iter.count == cb->args[0])
6009 		return 0;
6010 
6011 	cb->args[0] = args.iter.count;
6012 	return skb->len;
6013 
6014 nla_put_failure:
6015 	rcu_read_unlock();
6016 	return -ENOSPC;
6017 }
6018 
nf_tables_dumpreset_set(struct sk_buff * skb,struct netlink_callback * cb)6019 static int nf_tables_dumpreset_set(struct sk_buff *skb,
6020 				   struct netlink_callback *cb)
6021 {
6022 	struct nftables_pernet *nft_net = nft_pernet(sock_net(skb->sk));
6023 	struct nft_set_dump_ctx *dump_ctx = cb->data;
6024 	int ret, skip = cb->args[0];
6025 
6026 	mutex_lock(&nft_net->commit_mutex);
6027 
6028 	ret = nf_tables_dump_set(skb, cb);
6029 
6030 	if (cb->args[0] > skip)
6031 		audit_log_nft_set_reset(dump_ctx->ctx.table, cb->seq,
6032 					cb->args[0] - skip);
6033 
6034 	mutex_unlock(&nft_net->commit_mutex);
6035 
6036 	return ret;
6037 }
6038 
nf_tables_dump_set_start(struct netlink_callback * cb)6039 static int nf_tables_dump_set_start(struct netlink_callback *cb)
6040 {
6041 	struct nft_set_dump_ctx *dump_ctx = cb->data;
6042 
6043 	cb->data = kmemdup(dump_ctx, sizeof(*dump_ctx), GFP_ATOMIC);
6044 
6045 	return cb->data ? 0 : -ENOMEM;
6046 }
6047 
nf_tables_dump_set_done(struct netlink_callback * cb)6048 static int nf_tables_dump_set_done(struct netlink_callback *cb)
6049 {
6050 	kfree(cb->data);
6051 	return 0;
6052 }
6053 
nf_tables_fill_setelem_info(struct sk_buff * skb,const struct nft_ctx * ctx,u32 seq,u32 portid,int event,u16 flags,const struct nft_set * set,const struct nft_elem_priv * elem_priv,bool reset)6054 static int nf_tables_fill_setelem_info(struct sk_buff *skb,
6055 				       const struct nft_ctx *ctx, u32 seq,
6056 				       u32 portid, int event, u16 flags,
6057 				       const struct nft_set *set,
6058 				       const struct nft_elem_priv *elem_priv,
6059 				       bool reset)
6060 {
6061 	struct nlmsghdr *nlh;
6062 	struct nlattr *nest;
6063 	int err;
6064 
6065 	event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
6066 	nlh = nfnl_msg_put(skb, portid, seq, event, flags, ctx->family,
6067 			   NFNETLINK_V0, nft_base_seq(ctx->net));
6068 	if (!nlh)
6069 		goto nla_put_failure;
6070 
6071 	if (nla_put_string(skb, NFTA_SET_TABLE, ctx->table->name))
6072 		goto nla_put_failure;
6073 	if (nla_put_string(skb, NFTA_SET_NAME, set->name))
6074 		goto nla_put_failure;
6075 
6076 	nest = nla_nest_start_noflag(skb, NFTA_SET_ELEM_LIST_ELEMENTS);
6077 	if (nest == NULL)
6078 		goto nla_put_failure;
6079 
6080 	err = nf_tables_fill_setelem(skb, set, elem_priv, reset);
6081 	if (err < 0)
6082 		goto nla_put_failure;
6083 
6084 	nla_nest_end(skb, nest);
6085 
6086 	nlmsg_end(skb, nlh);
6087 	return 0;
6088 
6089 nla_put_failure:
6090 	nlmsg_trim(skb, nlh);
6091 	return -1;
6092 }
6093 
nft_setelem_parse_flags(const struct nft_set * set,const struct nlattr * attr,u32 * flags)6094 static int nft_setelem_parse_flags(const struct nft_set *set,
6095 				   const struct nlattr *attr, u32 *flags)
6096 {
6097 	if (attr == NULL)
6098 		return 0;
6099 
6100 	*flags = ntohl(nla_get_be32(attr));
6101 	if (*flags & ~(NFT_SET_ELEM_INTERVAL_END | NFT_SET_ELEM_CATCHALL))
6102 		return -EOPNOTSUPP;
6103 	if (!(set->flags & NFT_SET_INTERVAL) &&
6104 	    *flags & NFT_SET_ELEM_INTERVAL_END)
6105 		return -EINVAL;
6106 	if ((*flags & (NFT_SET_ELEM_INTERVAL_END | NFT_SET_ELEM_CATCHALL)) ==
6107 	    (NFT_SET_ELEM_INTERVAL_END | NFT_SET_ELEM_CATCHALL))
6108 		return -EINVAL;
6109 
6110 	return 0;
6111 }
6112 
nft_setelem_parse_key(struct nft_ctx * ctx,const struct nft_set * set,struct nft_data * key,struct nlattr * attr)6113 static int nft_setelem_parse_key(struct nft_ctx *ctx, const struct nft_set *set,
6114 				 struct nft_data *key, struct nlattr *attr)
6115 {
6116 	struct nft_data_desc desc = {
6117 		.type	= NFT_DATA_VALUE,
6118 		.size	= NFT_DATA_VALUE_MAXLEN,
6119 		.len	= set->klen,
6120 	};
6121 
6122 	return nft_data_init(ctx, key, &desc, attr);
6123 }
6124 
nft_setelem_parse_data(struct nft_ctx * ctx,struct nft_set * set,struct nft_data_desc * desc,struct nft_data * data,struct nlattr * attr)6125 static int nft_setelem_parse_data(struct nft_ctx *ctx, struct nft_set *set,
6126 				  struct nft_data_desc *desc,
6127 				  struct nft_data *data,
6128 				  struct nlattr *attr)
6129 {
6130 	u32 dtype;
6131 
6132 	if (set->dtype == NFT_DATA_VERDICT)
6133 		dtype = NFT_DATA_VERDICT;
6134 	else
6135 		dtype = NFT_DATA_VALUE;
6136 
6137 	desc->type = dtype;
6138 	desc->size = NFT_DATA_VALUE_MAXLEN;
6139 	desc->len = set->dlen;
6140 	desc->flags = NFT_DATA_DESC_SETELEM;
6141 
6142 	return nft_data_init(ctx, data, desc, attr);
6143 }
6144 
nft_setelem_catchall_get(const struct net * net,const struct nft_set * set)6145 static void *nft_setelem_catchall_get(const struct net *net,
6146 				      const struct nft_set *set)
6147 {
6148 	struct nft_set_elem_catchall *catchall;
6149 	u8 genmask = nft_genmask_cur(net);
6150 	struct nft_set_ext *ext;
6151 	void *priv = NULL;
6152 
6153 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
6154 		ext = nft_set_elem_ext(set, catchall->elem);
6155 		if (!nft_set_elem_active(ext, genmask) ||
6156 		    nft_set_elem_expired(ext))
6157 			continue;
6158 
6159 		priv = catchall->elem;
6160 		break;
6161 	}
6162 
6163 	return priv;
6164 }
6165 
nft_setelem_get(struct nft_ctx * ctx,const struct nft_set * set,struct nft_set_elem * elem,u32 flags)6166 static int nft_setelem_get(struct nft_ctx *ctx, const struct nft_set *set,
6167 			   struct nft_set_elem *elem, u32 flags)
6168 {
6169 	void *priv;
6170 
6171 	if (!(flags & NFT_SET_ELEM_CATCHALL)) {
6172 		priv = set->ops->get(ctx->net, set, elem, flags);
6173 		if (IS_ERR(priv))
6174 			return PTR_ERR(priv);
6175 	} else {
6176 		priv = nft_setelem_catchall_get(ctx->net, set);
6177 		if (!priv)
6178 			return -ENOENT;
6179 	}
6180 	elem->priv = priv;
6181 
6182 	return 0;
6183 }
6184 
nft_get_set_elem(struct nft_ctx * ctx,const struct nft_set * set,const struct nlattr * attr,bool reset)6185 static int nft_get_set_elem(struct nft_ctx *ctx, const struct nft_set *set,
6186 			    const struct nlattr *attr, bool reset)
6187 {
6188 	struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
6189 	struct nft_set_elem elem;
6190 	struct sk_buff *skb;
6191 	uint32_t flags = 0;
6192 	int err;
6193 
6194 	err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
6195 					  nft_set_elem_policy, NULL);
6196 	if (err < 0)
6197 		return err;
6198 
6199 	err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
6200 	if (err < 0)
6201 		return err;
6202 
6203 	if (!nla[NFTA_SET_ELEM_KEY] && !(flags & NFT_SET_ELEM_CATCHALL))
6204 		return -EINVAL;
6205 
6206 	if (nla[NFTA_SET_ELEM_KEY]) {
6207 		err = nft_setelem_parse_key(ctx, set, &elem.key.val,
6208 					    nla[NFTA_SET_ELEM_KEY]);
6209 		if (err < 0)
6210 			return err;
6211 	}
6212 
6213 	if (nla[NFTA_SET_ELEM_KEY_END]) {
6214 		err = nft_setelem_parse_key(ctx, set, &elem.key_end.val,
6215 					    nla[NFTA_SET_ELEM_KEY_END]);
6216 		if (err < 0)
6217 			return err;
6218 	}
6219 
6220 	err = nft_setelem_get(ctx, set, &elem, flags);
6221 	if (err < 0)
6222 		return err;
6223 
6224 	err = -ENOMEM;
6225 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC);
6226 	if (skb == NULL)
6227 		return err;
6228 
6229 	err = nf_tables_fill_setelem_info(skb, ctx, ctx->seq, ctx->portid,
6230 					  NFT_MSG_NEWSETELEM, 0, set, elem.priv,
6231 					  reset);
6232 	if (err < 0)
6233 		goto err_fill_setelem;
6234 
6235 	return nfnetlink_unicast(skb, ctx->net, ctx->portid);
6236 
6237 err_fill_setelem:
6238 	kfree_skb(skb);
6239 	return err;
6240 }
6241 
nft_set_dump_ctx_init(struct nft_set_dump_ctx * dump_ctx,const struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[],bool reset)6242 static int nft_set_dump_ctx_init(struct nft_set_dump_ctx *dump_ctx,
6243 				 const struct sk_buff *skb,
6244 				 const struct nfnl_info *info,
6245 				 const struct nlattr * const nla[],
6246 				 bool reset)
6247 {
6248 	struct netlink_ext_ack *extack = info->extack;
6249 	u8 genmask = nft_genmask_cur(info->net);
6250 	u8 family = info->nfmsg->nfgen_family;
6251 	struct net *net = info->net;
6252 	struct nft_table *table;
6253 	struct nft_set *set;
6254 
6255 	table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family,
6256 				 genmask, 0);
6257 	if (IS_ERR(table)) {
6258 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]);
6259 		return PTR_ERR(table);
6260 	}
6261 
6262 	set = nft_set_lookup(table, nla[NFTA_SET_ELEM_LIST_SET], genmask);
6263 	if (IS_ERR(set)) {
6264 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_SET]);
6265 		return PTR_ERR(set);
6266 	}
6267 
6268 	nft_ctx_init(&dump_ctx->ctx, net, skb,
6269 		     info->nlh, family, table, NULL, nla);
6270 	dump_ctx->set = set;
6271 	dump_ctx->reset = reset;
6272 	return 0;
6273 }
6274 
6275 /* called with rcu_read_lock held */
nf_tables_getsetelem(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])6276 static int nf_tables_getsetelem(struct sk_buff *skb,
6277 				const struct nfnl_info *info,
6278 				const struct nlattr * const nla[])
6279 {
6280 	struct netlink_ext_ack *extack = info->extack;
6281 	struct nft_set_dump_ctx dump_ctx;
6282 	struct nlattr *attr;
6283 	int rem, err = 0;
6284 
6285 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
6286 		struct netlink_dump_control c = {
6287 			.start = nf_tables_dump_set_start,
6288 			.dump = nf_tables_dump_set,
6289 			.done = nf_tables_dump_set_done,
6290 			.module = THIS_MODULE,
6291 		};
6292 
6293 		err = nft_set_dump_ctx_init(&dump_ctx, skb, info, nla, false);
6294 		if (err)
6295 			return err;
6296 
6297 		c.data = &dump_ctx;
6298 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
6299 	}
6300 
6301 	if (!nla[NFTA_SET_ELEM_LIST_ELEMENTS])
6302 		return -EINVAL;
6303 
6304 	err = nft_set_dump_ctx_init(&dump_ctx, skb, info, nla, false);
6305 	if (err)
6306 		return err;
6307 
6308 	nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
6309 		err = nft_get_set_elem(&dump_ctx.ctx, dump_ctx.set, attr, false);
6310 		if (err < 0) {
6311 			NL_SET_BAD_ATTR(extack, attr);
6312 			break;
6313 		}
6314 	}
6315 
6316 	return err;
6317 }
6318 
nf_tables_getsetelem_reset(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])6319 static int nf_tables_getsetelem_reset(struct sk_buff *skb,
6320 				      const struct nfnl_info *info,
6321 				      const struct nlattr * const nla[])
6322 {
6323 	struct nftables_pernet *nft_net = nft_pernet(info->net);
6324 	struct netlink_ext_ack *extack = info->extack;
6325 	struct nft_set_dump_ctx dump_ctx;
6326 	int rem, err = 0, nelems = 0;
6327 	struct nlattr *attr;
6328 
6329 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
6330 		struct netlink_dump_control c = {
6331 			.start = nf_tables_dump_set_start,
6332 			.dump = nf_tables_dumpreset_set,
6333 			.done = nf_tables_dump_set_done,
6334 			.module = THIS_MODULE,
6335 		};
6336 
6337 		err = nft_set_dump_ctx_init(&dump_ctx, skb, info, nla, true);
6338 		if (err)
6339 			return err;
6340 
6341 		c.data = &dump_ctx;
6342 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
6343 	}
6344 
6345 	if (!nla[NFTA_SET_ELEM_LIST_ELEMENTS])
6346 		return -EINVAL;
6347 
6348 	if (!try_module_get(THIS_MODULE))
6349 		return -EINVAL;
6350 	rcu_read_unlock();
6351 	mutex_lock(&nft_net->commit_mutex);
6352 	rcu_read_lock();
6353 
6354 	err = nft_set_dump_ctx_init(&dump_ctx, skb, info, nla, true);
6355 	if (err)
6356 		goto out_unlock;
6357 
6358 	nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
6359 		err = nft_get_set_elem(&dump_ctx.ctx, dump_ctx.set, attr, true);
6360 		if (err < 0) {
6361 			NL_SET_BAD_ATTR(extack, attr);
6362 			break;
6363 		}
6364 		nelems++;
6365 	}
6366 	audit_log_nft_set_reset(dump_ctx.ctx.table, nft_net->base_seq, nelems);
6367 
6368 out_unlock:
6369 	rcu_read_unlock();
6370 	mutex_unlock(&nft_net->commit_mutex);
6371 	rcu_read_lock();
6372 	module_put(THIS_MODULE);
6373 
6374 	return err;
6375 }
6376 
nf_tables_setelem_notify(const struct nft_ctx * ctx,const struct nft_set * set,const struct nft_elem_priv * elem_priv,int event)6377 static void nf_tables_setelem_notify(const struct nft_ctx *ctx,
6378 				     const struct nft_set *set,
6379 				     const struct nft_elem_priv *elem_priv,
6380 				     int event)
6381 {
6382 	struct nftables_pernet *nft_net;
6383 	struct net *net = ctx->net;
6384 	u32 portid = ctx->portid;
6385 	struct sk_buff *skb;
6386 	u16 flags = 0;
6387 	int err;
6388 
6389 	if (!ctx->report && !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
6390 		return;
6391 
6392 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
6393 	if (skb == NULL)
6394 		goto err;
6395 
6396 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
6397 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
6398 
6399 	err = nf_tables_fill_setelem_info(skb, ctx, 0, portid, event, flags,
6400 					  set, elem_priv, false);
6401 	if (err < 0) {
6402 		kfree_skb(skb);
6403 		goto err;
6404 	}
6405 
6406 	nft_net = nft_pernet(net);
6407 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
6408 	return;
6409 err:
6410 	nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
6411 }
6412 
nft_trans_elem_alloc(struct nft_ctx * ctx,int msg_type,struct nft_set * set)6413 static struct nft_trans *nft_trans_elem_alloc(struct nft_ctx *ctx,
6414 					      int msg_type,
6415 					      struct nft_set *set)
6416 {
6417 	struct nft_trans *trans;
6418 
6419 	trans = nft_trans_alloc(ctx, msg_type, sizeof(struct nft_trans_elem));
6420 	if (trans == NULL)
6421 		return NULL;
6422 
6423 	nft_trans_elem_set(trans) = set;
6424 	return trans;
6425 }
6426 
nft_set_elem_expr_alloc(const struct nft_ctx * ctx,const struct nft_set * set,const struct nlattr * attr)6427 struct nft_expr *nft_set_elem_expr_alloc(const struct nft_ctx *ctx,
6428 					 const struct nft_set *set,
6429 					 const struct nlattr *attr)
6430 {
6431 	struct nft_expr *expr;
6432 	int err;
6433 
6434 	expr = nft_expr_init(ctx, attr);
6435 	if (IS_ERR(expr))
6436 		return expr;
6437 
6438 	err = -EOPNOTSUPP;
6439 	if (expr->ops->type->flags & NFT_EXPR_GC) {
6440 		if (set->flags & NFT_SET_TIMEOUT)
6441 			goto err_set_elem_expr;
6442 		if (!set->ops->gc_init)
6443 			goto err_set_elem_expr;
6444 		set->ops->gc_init(set);
6445 	}
6446 
6447 	return expr;
6448 
6449 err_set_elem_expr:
6450 	nft_expr_destroy(ctx, expr);
6451 	return ERR_PTR(err);
6452 }
6453 
nft_set_ext_check(const struct nft_set_ext_tmpl * tmpl,u8 id,u32 len)6454 static int nft_set_ext_check(const struct nft_set_ext_tmpl *tmpl, u8 id, u32 len)
6455 {
6456 	len += nft_set_ext_types[id].len;
6457 	if (len > tmpl->ext_len[id] ||
6458 	    len > U8_MAX)
6459 		return -1;
6460 
6461 	return 0;
6462 }
6463 
nft_set_ext_memcpy(const struct nft_set_ext_tmpl * tmpl,u8 id,void * to,const void * from,u32 len)6464 static int nft_set_ext_memcpy(const struct nft_set_ext_tmpl *tmpl, u8 id,
6465 			      void *to, const void *from, u32 len)
6466 {
6467 	if (nft_set_ext_check(tmpl, id, len) < 0)
6468 		return -1;
6469 
6470 	memcpy(to, from, len);
6471 
6472 	return 0;
6473 }
6474 
nft_set_elem_init(const struct nft_set * set,const struct nft_set_ext_tmpl * tmpl,const u32 * key,const u32 * key_end,const u32 * data,u64 timeout,u64 expiration,gfp_t gfp)6475 struct nft_elem_priv *nft_set_elem_init(const struct nft_set *set,
6476 					const struct nft_set_ext_tmpl *tmpl,
6477 					const u32 *key, const u32 *key_end,
6478 					const u32 *data,
6479 					u64 timeout, u64 expiration, gfp_t gfp)
6480 {
6481 	struct nft_set_ext *ext;
6482 	void *elem;
6483 
6484 	elem = kzalloc(set->ops->elemsize + tmpl->len, gfp);
6485 	if (elem == NULL)
6486 		return ERR_PTR(-ENOMEM);
6487 
6488 	ext = nft_set_elem_ext(set, elem);
6489 	nft_set_ext_init(ext, tmpl);
6490 
6491 	if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY) &&
6492 	    nft_set_ext_memcpy(tmpl, NFT_SET_EXT_KEY,
6493 			       nft_set_ext_key(ext), key, set->klen) < 0)
6494 		goto err_ext_check;
6495 
6496 	if (nft_set_ext_exists(ext, NFT_SET_EXT_KEY_END) &&
6497 	    nft_set_ext_memcpy(tmpl, NFT_SET_EXT_KEY_END,
6498 			       nft_set_ext_key_end(ext), key_end, set->klen) < 0)
6499 		goto err_ext_check;
6500 
6501 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
6502 	    nft_set_ext_memcpy(tmpl, NFT_SET_EXT_DATA,
6503 			       nft_set_ext_data(ext), data, set->dlen) < 0)
6504 		goto err_ext_check;
6505 
6506 	if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT)) {
6507 		nft_set_ext_timeout(ext)->timeout = timeout;
6508 
6509 		if (expiration == 0)
6510 			expiration = timeout;
6511 
6512 		nft_set_ext_timeout(ext)->expiration = get_jiffies_64() + expiration;
6513 	}
6514 
6515 	return elem;
6516 
6517 err_ext_check:
6518 	kfree(elem);
6519 
6520 	return ERR_PTR(-EINVAL);
6521 }
6522 
__nft_set_elem_expr_destroy(const struct nft_ctx * ctx,struct nft_expr * expr)6523 static void __nft_set_elem_expr_destroy(const struct nft_ctx *ctx,
6524 					struct nft_expr *expr)
6525 {
6526 	if (expr->ops->destroy_clone) {
6527 		expr->ops->destroy_clone(ctx, expr);
6528 		module_put(expr->ops->type->owner);
6529 	} else {
6530 		nf_tables_expr_destroy(ctx, expr);
6531 	}
6532 }
6533 
nft_set_elem_expr_destroy(const struct nft_ctx * ctx,struct nft_set_elem_expr * elem_expr)6534 static void nft_set_elem_expr_destroy(const struct nft_ctx *ctx,
6535 				      struct nft_set_elem_expr *elem_expr)
6536 {
6537 	struct nft_expr *expr;
6538 	u32 size;
6539 
6540 	nft_setelem_expr_foreach(expr, elem_expr, size)
6541 		__nft_set_elem_expr_destroy(ctx, expr);
6542 }
6543 
6544 /* Drop references and destroy. Called from gc, dynset and abort path. */
nft_set_elem_destroy(const struct nft_set * set,const struct nft_elem_priv * elem_priv,bool destroy_expr)6545 void nft_set_elem_destroy(const struct nft_set *set,
6546 			  const struct nft_elem_priv *elem_priv,
6547 			  bool destroy_expr)
6548 {
6549 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
6550 	struct nft_ctx ctx = {
6551 		.net	= read_pnet(&set->net),
6552 		.family	= set->table->family,
6553 	};
6554 
6555 	nft_data_release(nft_set_ext_key(ext), NFT_DATA_VALUE);
6556 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
6557 		nft_data_release(nft_set_ext_data(ext), set->dtype);
6558 	if (destroy_expr && nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS))
6559 		nft_set_elem_expr_destroy(&ctx, nft_set_ext_expr(ext));
6560 	if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF))
6561 		nft_use_dec(&(*nft_set_ext_obj(ext))->use);
6562 
6563 	kfree(elem_priv);
6564 }
6565 EXPORT_SYMBOL_GPL(nft_set_elem_destroy);
6566 
6567 /* Destroy element. References have been already dropped in the preparation
6568  * path via nft_setelem_data_deactivate().
6569  */
nf_tables_set_elem_destroy(const struct nft_ctx * ctx,const struct nft_set * set,const struct nft_elem_priv * elem_priv)6570 void nf_tables_set_elem_destroy(const struct nft_ctx *ctx,
6571 				const struct nft_set *set,
6572 				const struct nft_elem_priv *elem_priv)
6573 {
6574 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
6575 
6576 	if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPRESSIONS))
6577 		nft_set_elem_expr_destroy(ctx, nft_set_ext_expr(ext));
6578 
6579 	kfree(elem_priv);
6580 }
6581 
nft_set_elem_expr_clone(const struct nft_ctx * ctx,struct nft_set * set,struct nft_expr * expr_array[])6582 int nft_set_elem_expr_clone(const struct nft_ctx *ctx, struct nft_set *set,
6583 			    struct nft_expr *expr_array[])
6584 {
6585 	struct nft_expr *expr;
6586 	int err, i, k;
6587 
6588 	for (i = 0; i < set->num_exprs; i++) {
6589 		expr = kzalloc(set->exprs[i]->ops->size, GFP_KERNEL_ACCOUNT);
6590 		if (!expr)
6591 			goto err_expr;
6592 
6593 		err = nft_expr_clone(expr, set->exprs[i], GFP_KERNEL_ACCOUNT);
6594 		if (err < 0) {
6595 			kfree(expr);
6596 			goto err_expr;
6597 		}
6598 		expr_array[i] = expr;
6599 	}
6600 
6601 	return 0;
6602 
6603 err_expr:
6604 	for (k = i - 1; k >= 0; k--)
6605 		nft_expr_destroy(ctx, expr_array[k]);
6606 
6607 	return -ENOMEM;
6608 }
6609 
nft_set_elem_expr_setup(struct nft_ctx * ctx,const struct nft_set_ext_tmpl * tmpl,const struct nft_set_ext * ext,struct nft_expr * expr_array[],u32 num_exprs)6610 static int nft_set_elem_expr_setup(struct nft_ctx *ctx,
6611 				   const struct nft_set_ext_tmpl *tmpl,
6612 				   const struct nft_set_ext *ext,
6613 				   struct nft_expr *expr_array[],
6614 				   u32 num_exprs)
6615 {
6616 	struct nft_set_elem_expr *elem_expr = nft_set_ext_expr(ext);
6617 	u32 len = sizeof(struct nft_set_elem_expr);
6618 	struct nft_expr *expr;
6619 	int i, err;
6620 
6621 	if (num_exprs == 0)
6622 		return 0;
6623 
6624 	for (i = 0; i < num_exprs; i++)
6625 		len += expr_array[i]->ops->size;
6626 
6627 	if (nft_set_ext_check(tmpl, NFT_SET_EXT_EXPRESSIONS, len) < 0)
6628 		return -EINVAL;
6629 
6630 	for (i = 0; i < num_exprs; i++) {
6631 		expr = nft_setelem_expr_at(elem_expr, elem_expr->size);
6632 		err = nft_expr_clone(expr, expr_array[i], GFP_KERNEL_ACCOUNT);
6633 		if (err < 0)
6634 			goto err_elem_expr_setup;
6635 
6636 		elem_expr->size += expr_array[i]->ops->size;
6637 		nft_expr_destroy(ctx, expr_array[i]);
6638 		expr_array[i] = NULL;
6639 	}
6640 
6641 	return 0;
6642 
6643 err_elem_expr_setup:
6644 	for (; i < num_exprs; i++) {
6645 		nft_expr_destroy(ctx, expr_array[i]);
6646 		expr_array[i] = NULL;
6647 	}
6648 
6649 	return -ENOMEM;
6650 }
6651 
nft_set_catchall_lookup(const struct net * net,const struct nft_set * set)6652 struct nft_set_ext *nft_set_catchall_lookup(const struct net *net,
6653 					    const struct nft_set *set)
6654 {
6655 	struct nft_set_elem_catchall *catchall;
6656 	u8 genmask = nft_genmask_cur(net);
6657 	struct nft_set_ext *ext;
6658 
6659 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
6660 		ext = nft_set_elem_ext(set, catchall->elem);
6661 		if (nft_set_elem_active(ext, genmask) &&
6662 		    !nft_set_elem_expired(ext) &&
6663 		    !nft_set_elem_is_dead(ext))
6664 			return ext;
6665 	}
6666 
6667 	return NULL;
6668 }
6669 EXPORT_SYMBOL_GPL(nft_set_catchall_lookup);
6670 
nft_setelem_catchall_insert(const struct net * net,struct nft_set * set,const struct nft_set_elem * elem,struct nft_elem_priv ** priv)6671 static int nft_setelem_catchall_insert(const struct net *net,
6672 				       struct nft_set *set,
6673 				       const struct nft_set_elem *elem,
6674 				       struct nft_elem_priv **priv)
6675 {
6676 	struct nft_set_elem_catchall *catchall;
6677 	u8 genmask = nft_genmask_next(net);
6678 	struct nft_set_ext *ext;
6679 
6680 	list_for_each_entry(catchall, &set->catchall_list, list) {
6681 		ext = nft_set_elem_ext(set, catchall->elem);
6682 		if (nft_set_elem_active(ext, genmask)) {
6683 			*priv = catchall->elem;
6684 			return -EEXIST;
6685 		}
6686 	}
6687 
6688 	catchall = kmalloc(sizeof(*catchall), GFP_KERNEL_ACCOUNT);
6689 	if (!catchall)
6690 		return -ENOMEM;
6691 
6692 	catchall->elem = elem->priv;
6693 	list_add_tail_rcu(&catchall->list, &set->catchall_list);
6694 
6695 	return 0;
6696 }
6697 
nft_setelem_insert(const struct net * net,struct nft_set * set,const struct nft_set_elem * elem,struct nft_elem_priv ** elem_priv,unsigned int flags)6698 static int nft_setelem_insert(const struct net *net,
6699 			      struct nft_set *set,
6700 			      const struct nft_set_elem *elem,
6701 			      struct nft_elem_priv **elem_priv,
6702 			      unsigned int flags)
6703 {
6704 	int ret;
6705 
6706 	if (flags & NFT_SET_ELEM_CATCHALL)
6707 		ret = nft_setelem_catchall_insert(net, set, elem, elem_priv);
6708 	else
6709 		ret = set->ops->insert(net, set, elem, elem_priv);
6710 
6711 	return ret;
6712 }
6713 
nft_setelem_is_catchall(const struct nft_set * set,const struct nft_elem_priv * elem_priv)6714 static bool nft_setelem_is_catchall(const struct nft_set *set,
6715 				    const struct nft_elem_priv *elem_priv)
6716 {
6717 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
6718 
6719 	if (nft_set_ext_exists(ext, NFT_SET_EXT_FLAGS) &&
6720 	    *nft_set_ext_flags(ext) & NFT_SET_ELEM_CATCHALL)
6721 		return true;
6722 
6723 	return false;
6724 }
6725 
nft_setelem_activate(struct net * net,struct nft_set * set,struct nft_elem_priv * elem_priv)6726 static void nft_setelem_activate(struct net *net, struct nft_set *set,
6727 				 struct nft_elem_priv *elem_priv)
6728 {
6729 	struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
6730 
6731 	if (nft_setelem_is_catchall(set, elem_priv)) {
6732 		nft_clear(net, ext);
6733 	} else {
6734 		set->ops->activate(net, set, elem_priv);
6735 	}
6736 }
6737 
nft_setelem_catchall_deactivate(const struct net * net,struct nft_set * set,struct nft_set_elem * elem)6738 static int nft_setelem_catchall_deactivate(const struct net *net,
6739 					   struct nft_set *set,
6740 					   struct nft_set_elem *elem)
6741 {
6742 	struct nft_set_elem_catchall *catchall;
6743 	struct nft_set_ext *ext;
6744 
6745 	list_for_each_entry(catchall, &set->catchall_list, list) {
6746 		ext = nft_set_elem_ext(set, catchall->elem);
6747 		if (!nft_is_active_next(net, ext))
6748 			continue;
6749 
6750 		kfree(elem->priv);
6751 		elem->priv = catchall->elem;
6752 		nft_set_elem_change_active(net, set, ext);
6753 		return 0;
6754 	}
6755 
6756 	return -ENOENT;
6757 }
6758 
__nft_setelem_deactivate(const struct net * net,struct nft_set * set,struct nft_set_elem * elem)6759 static int __nft_setelem_deactivate(const struct net *net,
6760 				    struct nft_set *set,
6761 				    struct nft_set_elem *elem)
6762 {
6763 	void *priv;
6764 
6765 	priv = set->ops->deactivate(net, set, elem);
6766 	if (!priv)
6767 		return -ENOENT;
6768 
6769 	kfree(elem->priv);
6770 	elem->priv = priv;
6771 	set->ndeact++;
6772 
6773 	return 0;
6774 }
6775 
nft_setelem_deactivate(const struct net * net,struct nft_set * set,struct nft_set_elem * elem,u32 flags)6776 static int nft_setelem_deactivate(const struct net *net,
6777 				  struct nft_set *set,
6778 				  struct nft_set_elem *elem, u32 flags)
6779 {
6780 	int ret;
6781 
6782 	if (flags & NFT_SET_ELEM_CATCHALL)
6783 		ret = nft_setelem_catchall_deactivate(net, set, elem);
6784 	else
6785 		ret = __nft_setelem_deactivate(net, set, elem);
6786 
6787 	return ret;
6788 }
6789 
nft_setelem_catchall_destroy(struct nft_set_elem_catchall * catchall)6790 static void nft_setelem_catchall_destroy(struct nft_set_elem_catchall *catchall)
6791 {
6792 	list_del_rcu(&catchall->list);
6793 	kfree_rcu(catchall, rcu);
6794 }
6795 
nft_setelem_catchall_remove(const struct net * net,const struct nft_set * set,struct nft_elem_priv * elem_priv)6796 static void nft_setelem_catchall_remove(const struct net *net,
6797 					const struct nft_set *set,
6798 					struct nft_elem_priv *elem_priv)
6799 {
6800 	struct nft_set_elem_catchall *catchall, *next;
6801 
6802 	list_for_each_entry_safe(catchall, next, &set->catchall_list, list) {
6803 		if (catchall->elem == elem_priv) {
6804 			nft_setelem_catchall_destroy(catchall);
6805 			break;
6806 		}
6807 	}
6808 }
6809 
nft_setelem_remove(const struct net * net,const struct nft_set * set,struct nft_elem_priv * elem_priv)6810 static void nft_setelem_remove(const struct net *net,
6811 			       const struct nft_set *set,
6812 			       struct nft_elem_priv *elem_priv)
6813 {
6814 	if (nft_setelem_is_catchall(set, elem_priv))
6815 		nft_setelem_catchall_remove(net, set, elem_priv);
6816 	else
6817 		set->ops->remove(net, set, elem_priv);
6818 }
6819 
nft_setelem_valid_key_end(const struct nft_set * set,struct nlattr ** nla,u32 flags)6820 static bool nft_setelem_valid_key_end(const struct nft_set *set,
6821 				      struct nlattr **nla, u32 flags)
6822 {
6823 	if ((set->flags & (NFT_SET_CONCAT | NFT_SET_INTERVAL)) ==
6824 			  (NFT_SET_CONCAT | NFT_SET_INTERVAL)) {
6825 		if (flags & NFT_SET_ELEM_INTERVAL_END)
6826 			return false;
6827 
6828 		if (nla[NFTA_SET_ELEM_KEY_END] &&
6829 		    flags & NFT_SET_ELEM_CATCHALL)
6830 			return false;
6831 	} else {
6832 		if (nla[NFTA_SET_ELEM_KEY_END])
6833 			return false;
6834 	}
6835 
6836 	return true;
6837 }
6838 
nft_add_set_elem(struct nft_ctx * ctx,struct nft_set * set,const struct nlattr * attr,u32 nlmsg_flags)6839 static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
6840 			    const struct nlattr *attr, u32 nlmsg_flags)
6841 {
6842 	struct nft_expr *expr_array[NFT_SET_EXPR_MAX] = {};
6843 	struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
6844 	u8 genmask = nft_genmask_next(ctx->net);
6845 	u32 flags = 0, size = 0, num_exprs = 0;
6846 	struct nft_set_ext_tmpl tmpl;
6847 	struct nft_set_ext *ext, *ext2;
6848 	struct nft_set_elem elem;
6849 	struct nft_set_binding *binding;
6850 	struct nft_elem_priv *elem_priv;
6851 	struct nft_object *obj = NULL;
6852 	struct nft_userdata *udata;
6853 	struct nft_data_desc desc;
6854 	enum nft_registers dreg;
6855 	struct nft_trans *trans;
6856 	u8 update_flags;
6857 	u64 expiration;
6858 	u64 timeout;
6859 	int err, i;
6860 	u8 ulen;
6861 
6862 	err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
6863 					  nft_set_elem_policy, NULL);
6864 	if (err < 0)
6865 		return err;
6866 
6867 	nft_set_ext_prepare(&tmpl);
6868 
6869 	err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
6870 	if (err < 0)
6871 		return err;
6872 
6873 	if (((flags & NFT_SET_ELEM_CATCHALL) && nla[NFTA_SET_ELEM_KEY]) ||
6874 	    (!(flags & NFT_SET_ELEM_CATCHALL) && !nla[NFTA_SET_ELEM_KEY]))
6875 		return -EINVAL;
6876 
6877 	if (flags != 0) {
6878 		err = nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
6879 		if (err < 0)
6880 			return err;
6881 	}
6882 
6883 	if (set->flags & NFT_SET_MAP) {
6884 		if (nla[NFTA_SET_ELEM_DATA] == NULL &&
6885 		    !(flags & NFT_SET_ELEM_INTERVAL_END))
6886 			return -EINVAL;
6887 	} else {
6888 		if (nla[NFTA_SET_ELEM_DATA] != NULL)
6889 			return -EINVAL;
6890 	}
6891 
6892 	if (set->flags & NFT_SET_OBJECT) {
6893 		if (!nla[NFTA_SET_ELEM_OBJREF] &&
6894 		    !(flags & NFT_SET_ELEM_INTERVAL_END))
6895 			return -EINVAL;
6896 	} else {
6897 		if (nla[NFTA_SET_ELEM_OBJREF])
6898 			return -EINVAL;
6899 	}
6900 
6901 	if (!nft_setelem_valid_key_end(set, nla, flags))
6902 		return -EINVAL;
6903 
6904 	if ((flags & NFT_SET_ELEM_INTERVAL_END) &&
6905 	     (nla[NFTA_SET_ELEM_DATA] ||
6906 	      nla[NFTA_SET_ELEM_OBJREF] ||
6907 	      nla[NFTA_SET_ELEM_TIMEOUT] ||
6908 	      nla[NFTA_SET_ELEM_EXPIRATION] ||
6909 	      nla[NFTA_SET_ELEM_USERDATA] ||
6910 	      nla[NFTA_SET_ELEM_EXPR] ||
6911 	      nla[NFTA_SET_ELEM_KEY_END] ||
6912 	      nla[NFTA_SET_ELEM_EXPRESSIONS]))
6913 		return -EINVAL;
6914 
6915 	timeout = 0;
6916 	if (nla[NFTA_SET_ELEM_TIMEOUT] != NULL) {
6917 		if (!(set->flags & NFT_SET_TIMEOUT))
6918 			return -EINVAL;
6919 		err = nf_msecs_to_jiffies64(nla[NFTA_SET_ELEM_TIMEOUT],
6920 					    &timeout);
6921 		if (err)
6922 			return err;
6923 	} else if (set->flags & NFT_SET_TIMEOUT &&
6924 		   !(flags & NFT_SET_ELEM_INTERVAL_END)) {
6925 		timeout = set->timeout;
6926 	}
6927 
6928 	expiration = 0;
6929 	if (nla[NFTA_SET_ELEM_EXPIRATION] != NULL) {
6930 		if (!(set->flags & NFT_SET_TIMEOUT))
6931 			return -EINVAL;
6932 		if (timeout == 0)
6933 			return -EOPNOTSUPP;
6934 
6935 		err = nf_msecs_to_jiffies64(nla[NFTA_SET_ELEM_EXPIRATION],
6936 					    &expiration);
6937 		if (err)
6938 			return err;
6939 
6940 		if (expiration > timeout)
6941 			return -ERANGE;
6942 	}
6943 
6944 	if (nla[NFTA_SET_ELEM_EXPR]) {
6945 		struct nft_expr *expr;
6946 
6947 		if (set->num_exprs && set->num_exprs != 1)
6948 			return -EOPNOTSUPP;
6949 
6950 		expr = nft_set_elem_expr_alloc(ctx, set,
6951 					       nla[NFTA_SET_ELEM_EXPR]);
6952 		if (IS_ERR(expr))
6953 			return PTR_ERR(expr);
6954 
6955 		expr_array[0] = expr;
6956 		num_exprs = 1;
6957 
6958 		if (set->num_exprs && set->exprs[0]->ops != expr->ops) {
6959 			err = -EOPNOTSUPP;
6960 			goto err_set_elem_expr;
6961 		}
6962 	} else if (nla[NFTA_SET_ELEM_EXPRESSIONS]) {
6963 		struct nft_expr *expr;
6964 		struct nlattr *tmp;
6965 		int left;
6966 
6967 		i = 0;
6968 		nla_for_each_nested(tmp, nla[NFTA_SET_ELEM_EXPRESSIONS], left) {
6969 			if (i == NFT_SET_EXPR_MAX ||
6970 			    (set->num_exprs && set->num_exprs == i)) {
6971 				err = -E2BIG;
6972 				goto err_set_elem_expr;
6973 			}
6974 			if (nla_type(tmp) != NFTA_LIST_ELEM) {
6975 				err = -EINVAL;
6976 				goto err_set_elem_expr;
6977 			}
6978 			expr = nft_set_elem_expr_alloc(ctx, set, tmp);
6979 			if (IS_ERR(expr)) {
6980 				err = PTR_ERR(expr);
6981 				goto err_set_elem_expr;
6982 			}
6983 			expr_array[i] = expr;
6984 			num_exprs++;
6985 
6986 			if (set->num_exprs && expr->ops != set->exprs[i]->ops) {
6987 				err = -EOPNOTSUPP;
6988 				goto err_set_elem_expr;
6989 			}
6990 			i++;
6991 		}
6992 		if (set->num_exprs && set->num_exprs != i) {
6993 			err = -EOPNOTSUPP;
6994 			goto err_set_elem_expr;
6995 		}
6996 	} else if (set->num_exprs > 0 &&
6997 		   !(flags & NFT_SET_ELEM_INTERVAL_END)) {
6998 		err = nft_set_elem_expr_clone(ctx, set, expr_array);
6999 		if (err < 0)
7000 			goto err_set_elem_expr_clone;
7001 
7002 		num_exprs = set->num_exprs;
7003 	}
7004 
7005 	if (nla[NFTA_SET_ELEM_KEY]) {
7006 		err = nft_setelem_parse_key(ctx, set, &elem.key.val,
7007 					    nla[NFTA_SET_ELEM_KEY]);
7008 		if (err < 0)
7009 			goto err_set_elem_expr;
7010 
7011 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, set->klen);
7012 		if (err < 0)
7013 			goto err_parse_key;
7014 	}
7015 
7016 	if (nla[NFTA_SET_ELEM_KEY_END]) {
7017 		err = nft_setelem_parse_key(ctx, set, &elem.key_end.val,
7018 					    nla[NFTA_SET_ELEM_KEY_END]);
7019 		if (err < 0)
7020 			goto err_parse_key;
7021 
7022 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY_END, set->klen);
7023 		if (err < 0)
7024 			goto err_parse_key_end;
7025 	}
7026 
7027 	if (set->flags & NFT_SET_TIMEOUT) {
7028 		err = nft_set_ext_add(&tmpl, NFT_SET_EXT_TIMEOUT);
7029 		if (err < 0)
7030 			goto err_parse_key_end;
7031 	}
7032 
7033 	if (num_exprs) {
7034 		for (i = 0; i < num_exprs; i++)
7035 			size += expr_array[i]->ops->size;
7036 
7037 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_EXPRESSIONS,
7038 					     sizeof(struct nft_set_elem_expr) + size);
7039 		if (err < 0)
7040 			goto err_parse_key_end;
7041 	}
7042 
7043 	if (nla[NFTA_SET_ELEM_OBJREF] != NULL) {
7044 		obj = nft_obj_lookup(ctx->net, ctx->table,
7045 				     nla[NFTA_SET_ELEM_OBJREF],
7046 				     set->objtype, genmask);
7047 		if (IS_ERR(obj)) {
7048 			err = PTR_ERR(obj);
7049 			obj = NULL;
7050 			goto err_parse_key_end;
7051 		}
7052 
7053 		if (!nft_use_inc(&obj->use)) {
7054 			err = -EMFILE;
7055 			obj = NULL;
7056 			goto err_parse_key_end;
7057 		}
7058 
7059 		err = nft_set_ext_add(&tmpl, NFT_SET_EXT_OBJREF);
7060 		if (err < 0)
7061 			goto err_parse_key_end;
7062 	}
7063 
7064 	if (nla[NFTA_SET_ELEM_DATA] != NULL) {
7065 		err = nft_setelem_parse_data(ctx, set, &desc, &elem.data.val,
7066 					     nla[NFTA_SET_ELEM_DATA]);
7067 		if (err < 0)
7068 			goto err_parse_key_end;
7069 
7070 		dreg = nft_type_to_reg(set->dtype);
7071 		list_for_each_entry(binding, &set->bindings, list) {
7072 			struct nft_ctx bind_ctx = {
7073 				.net	= ctx->net,
7074 				.family	= ctx->family,
7075 				.table	= ctx->table,
7076 				.chain	= (struct nft_chain *)binding->chain,
7077 			};
7078 
7079 			if (!(binding->flags & NFT_SET_MAP))
7080 				continue;
7081 
7082 			err = nft_validate_register_store(&bind_ctx, dreg,
7083 							  &elem.data.val,
7084 							  desc.type, desc.len);
7085 			if (err < 0)
7086 				goto err_parse_data;
7087 
7088 			if (desc.type == NFT_DATA_VERDICT &&
7089 			    (elem.data.val.verdict.code == NFT_GOTO ||
7090 			     elem.data.val.verdict.code == NFT_JUMP))
7091 				nft_validate_state_update(ctx->table,
7092 							  NFT_VALIDATE_NEED);
7093 		}
7094 
7095 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_DATA, desc.len);
7096 		if (err < 0)
7097 			goto err_parse_data;
7098 	}
7099 
7100 	/* The full maximum length of userdata can exceed the maximum
7101 	 * offset value (U8_MAX) for following extensions, therefor it
7102 	 * must be the last extension added.
7103 	 */
7104 	ulen = 0;
7105 	if (nla[NFTA_SET_ELEM_USERDATA] != NULL) {
7106 		ulen = nla_len(nla[NFTA_SET_ELEM_USERDATA]);
7107 		if (ulen > 0) {
7108 			err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_USERDATA,
7109 						     ulen);
7110 			if (err < 0)
7111 				goto err_parse_data;
7112 		}
7113 	}
7114 
7115 	elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data,
7116 				      elem.key_end.val.data, elem.data.val.data,
7117 				      timeout, expiration, GFP_KERNEL_ACCOUNT);
7118 	if (IS_ERR(elem.priv)) {
7119 		err = PTR_ERR(elem.priv);
7120 		goto err_parse_data;
7121 	}
7122 
7123 	ext = nft_set_elem_ext(set, elem.priv);
7124 	if (flags)
7125 		*nft_set_ext_flags(ext) = flags;
7126 
7127 	if (obj)
7128 		*nft_set_ext_obj(ext) = obj;
7129 
7130 	if (ulen > 0) {
7131 		if (nft_set_ext_check(&tmpl, NFT_SET_EXT_USERDATA, ulen) < 0) {
7132 			err = -EINVAL;
7133 			goto err_elem_free;
7134 		}
7135 		udata = nft_set_ext_userdata(ext);
7136 		udata->len = ulen - 1;
7137 		nla_memcpy(&udata->data, nla[NFTA_SET_ELEM_USERDATA], ulen);
7138 	}
7139 	err = nft_set_elem_expr_setup(ctx, &tmpl, ext, expr_array, num_exprs);
7140 	if (err < 0)
7141 		goto err_elem_free;
7142 
7143 	trans = nft_trans_elem_alloc(ctx, NFT_MSG_NEWSETELEM, set);
7144 	if (trans == NULL) {
7145 		err = -ENOMEM;
7146 		goto err_elem_free;
7147 	}
7148 
7149 	ext->genmask = nft_genmask_cur(ctx->net);
7150 
7151 	err = nft_setelem_insert(ctx->net, set, &elem, &elem_priv, flags);
7152 	if (err) {
7153 		if (err == -EEXIST) {
7154 			ext2 = nft_set_elem_ext(set, elem_priv);
7155 			if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA) ^
7156 			    nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) ||
7157 			    nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) ^
7158 			    nft_set_ext_exists(ext2, NFT_SET_EXT_OBJREF))
7159 				goto err_element_clash;
7160 			if ((nft_set_ext_exists(ext, NFT_SET_EXT_DATA) &&
7161 			     nft_set_ext_exists(ext2, NFT_SET_EXT_DATA) &&
7162 			     memcmp(nft_set_ext_data(ext),
7163 				    nft_set_ext_data(ext2), set->dlen) != 0) ||
7164 			    (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF) &&
7165 			     nft_set_ext_exists(ext2, NFT_SET_EXT_OBJREF) &&
7166 			     *nft_set_ext_obj(ext) != *nft_set_ext_obj(ext2)))
7167 				goto err_element_clash;
7168 			else if (!(nlmsg_flags & NLM_F_EXCL)) {
7169 				err = 0;
7170 				if (nft_set_ext_exists(ext2, NFT_SET_EXT_TIMEOUT)) {
7171 					update_flags = 0;
7172 					if (timeout != nft_set_ext_timeout(ext2)->timeout) {
7173 						nft_trans_elem_timeout(trans) = timeout;
7174 						if (expiration == 0)
7175 							expiration = timeout;
7176 
7177 						update_flags |= NFT_TRANS_UPD_TIMEOUT;
7178 					}
7179 					if (expiration) {
7180 						nft_trans_elem_expiration(trans) = expiration;
7181 						update_flags |= NFT_TRANS_UPD_EXPIRATION;
7182 					}
7183 
7184 					if (update_flags) {
7185 						nft_trans_elem_priv(trans) = elem_priv;
7186 						nft_trans_elem_update_flags(trans) = update_flags;
7187 						nft_trans_commit_list_add_tail(ctx->net, trans);
7188 						goto err_elem_free;
7189 					}
7190 				}
7191 			}
7192 		} else if (err == -ENOTEMPTY) {
7193 			/* ENOTEMPTY reports overlapping between this element
7194 			 * and an existing one.
7195 			 */
7196 			err = -EEXIST;
7197 		}
7198 		goto err_element_clash;
7199 	}
7200 
7201 	if (!(flags & NFT_SET_ELEM_CATCHALL)) {
7202 		unsigned int max = set->size ? set->size + set->ndeact : UINT_MAX;
7203 
7204 		if (!atomic_add_unless(&set->nelems, 1, max)) {
7205 			err = -ENFILE;
7206 			goto err_set_full;
7207 		}
7208 	}
7209 
7210 	nft_trans_elem_priv(trans) = elem.priv;
7211 	nft_trans_commit_list_add_tail(ctx->net, trans);
7212 	return 0;
7213 
7214 err_set_full:
7215 	nft_setelem_remove(ctx->net, set, elem.priv);
7216 err_element_clash:
7217 	kfree(trans);
7218 err_elem_free:
7219 	nf_tables_set_elem_destroy(ctx, set, elem.priv);
7220 err_parse_data:
7221 	if (nla[NFTA_SET_ELEM_DATA] != NULL)
7222 		nft_data_release(&elem.data.val, desc.type);
7223 err_parse_key_end:
7224 	if (obj)
7225 		nft_use_dec_restore(&obj->use);
7226 
7227 	nft_data_release(&elem.key_end.val, NFT_DATA_VALUE);
7228 err_parse_key:
7229 	nft_data_release(&elem.key.val, NFT_DATA_VALUE);
7230 err_set_elem_expr:
7231 	for (i = 0; i < num_exprs && expr_array[i]; i++)
7232 		nft_expr_destroy(ctx, expr_array[i]);
7233 err_set_elem_expr_clone:
7234 	return err;
7235 }
7236 
nf_tables_newsetelem(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])7237 static int nf_tables_newsetelem(struct sk_buff *skb,
7238 				const struct nfnl_info *info,
7239 				const struct nlattr * const nla[])
7240 {
7241 	struct netlink_ext_ack *extack = info->extack;
7242 	u8 genmask = nft_genmask_next(info->net);
7243 	u8 family = info->nfmsg->nfgen_family;
7244 	struct net *net = info->net;
7245 	const struct nlattr *attr;
7246 	struct nft_table *table;
7247 	struct nft_set *set;
7248 	struct nft_ctx ctx;
7249 	int rem, err;
7250 
7251 	if (nla[NFTA_SET_ELEM_LIST_ELEMENTS] == NULL)
7252 		return -EINVAL;
7253 
7254 	table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family,
7255 				 genmask, NETLINK_CB(skb).portid);
7256 	if (IS_ERR(table)) {
7257 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]);
7258 		return PTR_ERR(table);
7259 	}
7260 
7261 	set = nft_set_lookup_global(net, table, nla[NFTA_SET_ELEM_LIST_SET],
7262 				    nla[NFTA_SET_ELEM_LIST_SET_ID], genmask);
7263 	if (IS_ERR(set)) {
7264 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_SET]);
7265 		return PTR_ERR(set);
7266 	}
7267 
7268 	if (!list_empty(&set->bindings) &&
7269 	    (set->flags & (NFT_SET_CONSTANT | NFT_SET_ANONYMOUS)))
7270 		return -EBUSY;
7271 
7272 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
7273 
7274 	nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
7275 		err = nft_add_set_elem(&ctx, set, attr, info->nlh->nlmsg_flags);
7276 		if (err < 0) {
7277 			NL_SET_BAD_ATTR(extack, attr);
7278 			return err;
7279 		}
7280 	}
7281 
7282 	if (table->validate_state == NFT_VALIDATE_DO)
7283 		return nft_table_validate(net, table);
7284 
7285 	return 0;
7286 }
7287 
7288 /**
7289  *	nft_data_hold - hold a nft_data item
7290  *
7291  *	@data: struct nft_data to release
7292  *	@type: type of data
7293  *
7294  *	Hold a nft_data item. NFT_DATA_VALUE types can be silently discarded,
7295  *	NFT_DATA_VERDICT bumps the reference to chains in case of NFT_JUMP and
7296  *	NFT_GOTO verdicts. This function must be called on active data objects
7297  *	from the second phase of the commit protocol.
7298  */
nft_data_hold(const struct nft_data * data,enum nft_data_types type)7299 void nft_data_hold(const struct nft_data *data, enum nft_data_types type)
7300 {
7301 	struct nft_chain *chain;
7302 
7303 	if (type == NFT_DATA_VERDICT) {
7304 		switch (data->verdict.code) {
7305 		case NFT_JUMP:
7306 		case NFT_GOTO:
7307 			chain = data->verdict.chain;
7308 			nft_use_inc_restore(&chain->use);
7309 			break;
7310 		}
7311 	}
7312 }
7313 
nft_setelem_active_next(const struct net * net,const struct nft_set * set,struct nft_elem_priv * elem_priv)7314 static int nft_setelem_active_next(const struct net *net,
7315 				   const struct nft_set *set,
7316 				   struct nft_elem_priv *elem_priv)
7317 {
7318 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7319 	u8 genmask = nft_genmask_next(net);
7320 
7321 	return nft_set_elem_active(ext, genmask);
7322 }
7323 
nft_setelem_data_activate(const struct net * net,const struct nft_set * set,struct nft_elem_priv * elem_priv)7324 static void nft_setelem_data_activate(const struct net *net,
7325 				      const struct nft_set *set,
7326 				      struct nft_elem_priv *elem_priv)
7327 {
7328 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7329 
7330 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
7331 		nft_data_hold(nft_set_ext_data(ext), set->dtype);
7332 	if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF))
7333 		nft_use_inc_restore(&(*nft_set_ext_obj(ext))->use);
7334 }
7335 
nft_setelem_data_deactivate(const struct net * net,const struct nft_set * set,struct nft_elem_priv * elem_priv)7336 void nft_setelem_data_deactivate(const struct net *net,
7337 				 const struct nft_set *set,
7338 				 struct nft_elem_priv *elem_priv)
7339 {
7340 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7341 
7342 	if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
7343 		nft_data_release(nft_set_ext_data(ext), set->dtype);
7344 	if (nft_set_ext_exists(ext, NFT_SET_EXT_OBJREF))
7345 		nft_use_dec(&(*nft_set_ext_obj(ext))->use);
7346 }
7347 
nft_del_setelem(struct nft_ctx * ctx,struct nft_set * set,const struct nlattr * attr)7348 static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
7349 			   const struct nlattr *attr)
7350 {
7351 	struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
7352 	struct nft_set_ext_tmpl tmpl;
7353 	struct nft_set_elem elem;
7354 	struct nft_set_ext *ext;
7355 	struct nft_trans *trans;
7356 	u32 flags = 0;
7357 	int err;
7358 
7359 	err = nla_parse_nested_deprecated(nla, NFTA_SET_ELEM_MAX, attr,
7360 					  nft_set_elem_policy, NULL);
7361 	if (err < 0)
7362 		return err;
7363 
7364 	err = nft_setelem_parse_flags(set, nla[NFTA_SET_ELEM_FLAGS], &flags);
7365 	if (err < 0)
7366 		return err;
7367 
7368 	if (!nla[NFTA_SET_ELEM_KEY] && !(flags & NFT_SET_ELEM_CATCHALL))
7369 		return -EINVAL;
7370 
7371 	if (!nft_setelem_valid_key_end(set, nla, flags))
7372 		return -EINVAL;
7373 
7374 	nft_set_ext_prepare(&tmpl);
7375 
7376 	if (flags != 0) {
7377 		err = nft_set_ext_add(&tmpl, NFT_SET_EXT_FLAGS);
7378 		if (err < 0)
7379 			return err;
7380 	}
7381 
7382 	if (nla[NFTA_SET_ELEM_KEY]) {
7383 		err = nft_setelem_parse_key(ctx, set, &elem.key.val,
7384 					    nla[NFTA_SET_ELEM_KEY]);
7385 		if (err < 0)
7386 			return err;
7387 
7388 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY, set->klen);
7389 		if (err < 0)
7390 			goto fail_elem;
7391 	}
7392 
7393 	if (nla[NFTA_SET_ELEM_KEY_END]) {
7394 		err = nft_setelem_parse_key(ctx, set, &elem.key_end.val,
7395 					    nla[NFTA_SET_ELEM_KEY_END]);
7396 		if (err < 0)
7397 			goto fail_elem;
7398 
7399 		err = nft_set_ext_add_length(&tmpl, NFT_SET_EXT_KEY_END, set->klen);
7400 		if (err < 0)
7401 			goto fail_elem_key_end;
7402 	}
7403 
7404 	err = -ENOMEM;
7405 	elem.priv = nft_set_elem_init(set, &tmpl, elem.key.val.data,
7406 				      elem.key_end.val.data, NULL, 0, 0,
7407 				      GFP_KERNEL_ACCOUNT);
7408 	if (IS_ERR(elem.priv)) {
7409 		err = PTR_ERR(elem.priv);
7410 		goto fail_elem_key_end;
7411 	}
7412 
7413 	ext = nft_set_elem_ext(set, elem.priv);
7414 	if (flags)
7415 		*nft_set_ext_flags(ext) = flags;
7416 
7417 	trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set);
7418 	if (trans == NULL)
7419 		goto fail_trans;
7420 
7421 	err = nft_setelem_deactivate(ctx->net, set, &elem, flags);
7422 	if (err < 0)
7423 		goto fail_ops;
7424 
7425 	nft_setelem_data_deactivate(ctx->net, set, elem.priv);
7426 
7427 	nft_trans_elem_priv(trans) = elem.priv;
7428 	nft_trans_commit_list_add_tail(ctx->net, trans);
7429 	return 0;
7430 
7431 fail_ops:
7432 	kfree(trans);
7433 fail_trans:
7434 	kfree(elem.priv);
7435 fail_elem_key_end:
7436 	nft_data_release(&elem.key_end.val, NFT_DATA_VALUE);
7437 fail_elem:
7438 	nft_data_release(&elem.key.val, NFT_DATA_VALUE);
7439 	return err;
7440 }
7441 
nft_setelem_flush(const struct nft_ctx * ctx,struct nft_set * set,const struct nft_set_iter * iter,struct nft_elem_priv * elem_priv)7442 static int nft_setelem_flush(const struct nft_ctx *ctx,
7443 			     struct nft_set *set,
7444 			     const struct nft_set_iter *iter,
7445 			     struct nft_elem_priv *elem_priv)
7446 {
7447 	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem_priv);
7448 	struct nft_trans *trans;
7449 
7450 	if (!nft_set_elem_active(ext, iter->genmask))
7451 		return 0;
7452 
7453 	trans = nft_trans_alloc_gfp(ctx, NFT_MSG_DELSETELEM,
7454 				    sizeof(struct nft_trans_elem), GFP_ATOMIC);
7455 	if (!trans)
7456 		return -ENOMEM;
7457 
7458 	set->ops->flush(ctx->net, set, elem_priv);
7459 	set->ndeact++;
7460 
7461 	nft_setelem_data_deactivate(ctx->net, set, elem_priv);
7462 	nft_trans_elem_set(trans) = set;
7463 	nft_trans_elem_priv(trans) = elem_priv;
7464 	nft_trans_commit_list_add_tail(ctx->net, trans);
7465 
7466 	return 0;
7467 }
7468 
__nft_set_catchall_flush(const struct nft_ctx * ctx,struct nft_set * set,struct nft_elem_priv * elem_priv)7469 static int __nft_set_catchall_flush(const struct nft_ctx *ctx,
7470 				    struct nft_set *set,
7471 				    struct nft_elem_priv *elem_priv)
7472 {
7473 	struct nft_trans *trans;
7474 
7475 	trans = nft_trans_alloc_gfp(ctx, NFT_MSG_DELSETELEM,
7476 				    sizeof(struct nft_trans_elem), GFP_KERNEL);
7477 	if (!trans)
7478 		return -ENOMEM;
7479 
7480 	nft_setelem_data_deactivate(ctx->net, set, elem_priv);
7481 	nft_trans_elem_set(trans) = set;
7482 	nft_trans_elem_priv(trans) = elem_priv;
7483 	nft_trans_commit_list_add_tail(ctx->net, trans);
7484 
7485 	return 0;
7486 }
7487 
nft_set_catchall_flush(const struct nft_ctx * ctx,struct nft_set * set)7488 static int nft_set_catchall_flush(const struct nft_ctx *ctx,
7489 				  struct nft_set *set)
7490 {
7491 	u8 genmask = nft_genmask_next(ctx->net);
7492 	struct nft_set_elem_catchall *catchall;
7493 	struct nft_set_ext *ext;
7494 	int ret = 0;
7495 
7496 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
7497 		ext = nft_set_elem_ext(set, catchall->elem);
7498 		if (!nft_set_elem_active(ext, genmask))
7499 			continue;
7500 
7501 		ret = __nft_set_catchall_flush(ctx, set, catchall->elem);
7502 		if (ret < 0)
7503 			break;
7504 		nft_set_elem_change_active(ctx->net, set, ext);
7505 	}
7506 
7507 	return ret;
7508 }
7509 
nft_set_flush(struct nft_ctx * ctx,struct nft_set * set,u8 genmask)7510 static int nft_set_flush(struct nft_ctx *ctx, struct nft_set *set, u8 genmask)
7511 {
7512 	struct nft_set_iter iter = {
7513 		.genmask	= genmask,
7514 		.type		= NFT_ITER_UPDATE,
7515 		.fn		= nft_setelem_flush,
7516 	};
7517 
7518 	set->ops->walk(ctx, set, &iter);
7519 	if (!iter.err)
7520 		iter.err = nft_set_catchall_flush(ctx, set);
7521 
7522 	return iter.err;
7523 }
7524 
nf_tables_delsetelem(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])7525 static int nf_tables_delsetelem(struct sk_buff *skb,
7526 				const struct nfnl_info *info,
7527 				const struct nlattr * const nla[])
7528 {
7529 	struct netlink_ext_ack *extack = info->extack;
7530 	u8 genmask = nft_genmask_next(info->net);
7531 	u8 family = info->nfmsg->nfgen_family;
7532 	struct net *net = info->net;
7533 	const struct nlattr *attr;
7534 	struct nft_table *table;
7535 	struct nft_set *set;
7536 	struct nft_ctx ctx;
7537 	int rem, err = 0;
7538 
7539 	table = nft_table_lookup(net, nla[NFTA_SET_ELEM_LIST_TABLE], family,
7540 				 genmask, NETLINK_CB(skb).portid);
7541 	if (IS_ERR(table)) {
7542 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_TABLE]);
7543 		return PTR_ERR(table);
7544 	}
7545 
7546 	set = nft_set_lookup(table, nla[NFTA_SET_ELEM_LIST_SET], genmask);
7547 	if (IS_ERR(set)) {
7548 		NL_SET_BAD_ATTR(extack, nla[NFTA_SET_ELEM_LIST_SET]);
7549 		return PTR_ERR(set);
7550 	}
7551 
7552 	if (nft_set_is_anonymous(set))
7553 		return -EOPNOTSUPP;
7554 
7555 	if (!list_empty(&set->bindings) && (set->flags & NFT_SET_CONSTANT))
7556 		return -EBUSY;
7557 
7558 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
7559 
7560 	if (!nla[NFTA_SET_ELEM_LIST_ELEMENTS])
7561 		return nft_set_flush(&ctx, set, genmask);
7562 
7563 	nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
7564 		err = nft_del_setelem(&ctx, set, attr);
7565 		if (err == -ENOENT &&
7566 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYSETELEM)
7567 			continue;
7568 
7569 		if (err < 0) {
7570 			NL_SET_BAD_ATTR(extack, attr);
7571 			return err;
7572 		}
7573 	}
7574 
7575 	return 0;
7576 }
7577 
7578 /*
7579  * Stateful objects
7580  */
7581 
7582 /**
7583  *	nft_register_obj- register nf_tables stateful object type
7584  *	@obj_type: object type
7585  *
7586  *	Registers the object type for use with nf_tables. Returns zero on
7587  *	success or a negative errno code otherwise.
7588  */
nft_register_obj(struct nft_object_type * obj_type)7589 int nft_register_obj(struct nft_object_type *obj_type)
7590 {
7591 	if (obj_type->type == NFT_OBJECT_UNSPEC)
7592 		return -EINVAL;
7593 
7594 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
7595 	list_add_rcu(&obj_type->list, &nf_tables_objects);
7596 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
7597 	return 0;
7598 }
7599 EXPORT_SYMBOL_GPL(nft_register_obj);
7600 
7601 /**
7602  *	nft_unregister_obj - unregister nf_tables object type
7603  *	@obj_type: object type
7604  *
7605  * 	Unregisters the object type for use with nf_tables.
7606  */
nft_unregister_obj(struct nft_object_type * obj_type)7607 void nft_unregister_obj(struct nft_object_type *obj_type)
7608 {
7609 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
7610 	list_del_rcu(&obj_type->list);
7611 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
7612 }
7613 EXPORT_SYMBOL_GPL(nft_unregister_obj);
7614 
nft_obj_lookup(const struct net * net,const struct nft_table * table,const struct nlattr * nla,u32 objtype,u8 genmask)7615 struct nft_object *nft_obj_lookup(const struct net *net,
7616 				  const struct nft_table *table,
7617 				  const struct nlattr *nla, u32 objtype,
7618 				  u8 genmask)
7619 {
7620 	struct nft_object_hash_key k = { .table = table };
7621 	char search[NFT_OBJ_MAXNAMELEN];
7622 	struct rhlist_head *tmp, *list;
7623 	struct nft_object *obj;
7624 
7625 	nla_strscpy(search, nla, sizeof(search));
7626 	k.name = search;
7627 
7628 	WARN_ON_ONCE(!rcu_read_lock_held() &&
7629 		     !lockdep_commit_lock_is_held(net));
7630 
7631 	rcu_read_lock();
7632 	list = rhltable_lookup(&nft_objname_ht, &k, nft_objname_ht_params);
7633 	if (!list)
7634 		goto out;
7635 
7636 	rhl_for_each_entry_rcu(obj, tmp, list, rhlhead) {
7637 		if (objtype == obj->ops->type->type &&
7638 		    nft_active_genmask(obj, genmask)) {
7639 			rcu_read_unlock();
7640 			return obj;
7641 		}
7642 	}
7643 out:
7644 	rcu_read_unlock();
7645 	return ERR_PTR(-ENOENT);
7646 }
7647 EXPORT_SYMBOL_GPL(nft_obj_lookup);
7648 
nft_obj_lookup_byhandle(const struct nft_table * table,const struct nlattr * nla,u32 objtype,u8 genmask)7649 static struct nft_object *nft_obj_lookup_byhandle(const struct nft_table *table,
7650 						  const struct nlattr *nla,
7651 						  u32 objtype, u8 genmask)
7652 {
7653 	struct nft_object *obj;
7654 
7655 	list_for_each_entry(obj, &table->objects, list) {
7656 		if (be64_to_cpu(nla_get_be64(nla)) == obj->handle &&
7657 		    objtype == obj->ops->type->type &&
7658 		    nft_active_genmask(obj, genmask))
7659 			return obj;
7660 	}
7661 	return ERR_PTR(-ENOENT);
7662 }
7663 
7664 static const struct nla_policy nft_obj_policy[NFTA_OBJ_MAX + 1] = {
7665 	[NFTA_OBJ_TABLE]	= { .type = NLA_STRING,
7666 				    .len = NFT_TABLE_MAXNAMELEN - 1 },
7667 	[NFTA_OBJ_NAME]		= { .type = NLA_STRING,
7668 				    .len = NFT_OBJ_MAXNAMELEN - 1 },
7669 	[NFTA_OBJ_TYPE]		= { .type = NLA_U32 },
7670 	[NFTA_OBJ_DATA]		= { .type = NLA_NESTED },
7671 	[NFTA_OBJ_HANDLE]	= { .type = NLA_U64},
7672 	[NFTA_OBJ_USERDATA]	= { .type = NLA_BINARY,
7673 				    .len = NFT_USERDATA_MAXLEN },
7674 };
7675 
nft_obj_init(const struct nft_ctx * ctx,const struct nft_object_type * type,const struct nlattr * attr)7676 static struct nft_object *nft_obj_init(const struct nft_ctx *ctx,
7677 				       const struct nft_object_type *type,
7678 				       const struct nlattr *attr)
7679 {
7680 	struct nlattr **tb;
7681 	const struct nft_object_ops *ops;
7682 	struct nft_object *obj;
7683 	int err = -ENOMEM;
7684 
7685 	tb = kmalloc_array(type->maxattr + 1, sizeof(*tb), GFP_KERNEL);
7686 	if (!tb)
7687 		goto err1;
7688 
7689 	if (attr) {
7690 		err = nla_parse_nested_deprecated(tb, type->maxattr, attr,
7691 						  type->policy, NULL);
7692 		if (err < 0)
7693 			goto err2;
7694 	} else {
7695 		memset(tb, 0, sizeof(tb[0]) * (type->maxattr + 1));
7696 	}
7697 
7698 	if (type->select_ops) {
7699 		ops = type->select_ops(ctx, (const struct nlattr * const *)tb);
7700 		if (IS_ERR(ops)) {
7701 			err = PTR_ERR(ops);
7702 			goto err2;
7703 		}
7704 	} else {
7705 		ops = type->ops;
7706 	}
7707 
7708 	err = -ENOMEM;
7709 	obj = kzalloc(sizeof(*obj) + ops->size, GFP_KERNEL_ACCOUNT);
7710 	if (!obj)
7711 		goto err2;
7712 
7713 	err = ops->init(ctx, (const struct nlattr * const *)tb, obj);
7714 	if (err < 0)
7715 		goto err3;
7716 
7717 	obj->ops = ops;
7718 
7719 	kfree(tb);
7720 	return obj;
7721 err3:
7722 	kfree(obj);
7723 err2:
7724 	kfree(tb);
7725 err1:
7726 	return ERR_PTR(err);
7727 }
7728 
nft_object_dump(struct sk_buff * skb,unsigned int attr,struct nft_object * obj,bool reset)7729 static int nft_object_dump(struct sk_buff *skb, unsigned int attr,
7730 			   struct nft_object *obj, bool reset)
7731 {
7732 	struct nlattr *nest;
7733 
7734 	nest = nla_nest_start_noflag(skb, attr);
7735 	if (!nest)
7736 		goto nla_put_failure;
7737 	if (obj->ops->dump(skb, obj, reset) < 0)
7738 		goto nla_put_failure;
7739 	nla_nest_end(skb, nest);
7740 	return 0;
7741 
7742 nla_put_failure:
7743 	return -1;
7744 }
7745 
__nft_obj_type_get(u32 objtype,u8 family)7746 static const struct nft_object_type *__nft_obj_type_get(u32 objtype, u8 family)
7747 {
7748 	const struct nft_object_type *type;
7749 
7750 	list_for_each_entry_rcu(type, &nf_tables_objects, list) {
7751 		if (type->family != NFPROTO_UNSPEC &&
7752 		    type->family != family)
7753 			continue;
7754 
7755 		if (objtype == type->type)
7756 			return type;
7757 	}
7758 	return NULL;
7759 }
7760 
7761 static const struct nft_object_type *
nft_obj_type_get(struct net * net,u32 objtype,u8 family)7762 nft_obj_type_get(struct net *net, u32 objtype, u8 family)
7763 {
7764 	const struct nft_object_type *type;
7765 
7766 	rcu_read_lock();
7767 	type = __nft_obj_type_get(objtype, family);
7768 	if (type != NULL && try_module_get(type->owner)) {
7769 		rcu_read_unlock();
7770 		return type;
7771 	}
7772 	rcu_read_unlock();
7773 
7774 	lockdep_nfnl_nft_mutex_not_held();
7775 #ifdef CONFIG_MODULES
7776 	if (type == NULL) {
7777 		if (nft_request_module(net, "nft-obj-%u", objtype) == -EAGAIN)
7778 			return ERR_PTR(-EAGAIN);
7779 	}
7780 #endif
7781 	return ERR_PTR(-ENOENT);
7782 }
7783 
nf_tables_updobj(const struct nft_ctx * ctx,const struct nft_object_type * type,const struct nlattr * attr,struct nft_object * obj)7784 static int nf_tables_updobj(const struct nft_ctx *ctx,
7785 			    const struct nft_object_type *type,
7786 			    const struct nlattr *attr,
7787 			    struct nft_object *obj)
7788 {
7789 	struct nft_object *newobj;
7790 	struct nft_trans *trans;
7791 	int err = -ENOMEM;
7792 
7793 	if (!try_module_get(type->owner))
7794 		return -ENOENT;
7795 
7796 	trans = nft_trans_alloc(ctx, NFT_MSG_NEWOBJ,
7797 				sizeof(struct nft_trans_obj));
7798 	if (!trans)
7799 		goto err_trans;
7800 
7801 	newobj = nft_obj_init(ctx, type, attr);
7802 	if (IS_ERR(newobj)) {
7803 		err = PTR_ERR(newobj);
7804 		goto err_free_trans;
7805 	}
7806 
7807 	nft_trans_obj(trans) = obj;
7808 	nft_trans_obj_update(trans) = true;
7809 	nft_trans_obj_newobj(trans) = newobj;
7810 	nft_trans_commit_list_add_tail(ctx->net, trans);
7811 
7812 	return 0;
7813 
7814 err_free_trans:
7815 	kfree(trans);
7816 err_trans:
7817 	module_put(type->owner);
7818 	return err;
7819 }
7820 
nf_tables_newobj(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])7821 static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,
7822 			    const struct nlattr * const nla[])
7823 {
7824 	struct netlink_ext_ack *extack = info->extack;
7825 	u8 genmask = nft_genmask_next(info->net);
7826 	u8 family = info->nfmsg->nfgen_family;
7827 	const struct nft_object_type *type;
7828 	struct net *net = info->net;
7829 	struct nft_table *table;
7830 	struct nft_object *obj;
7831 	struct nft_ctx ctx;
7832 	u32 objtype;
7833 	int err;
7834 
7835 	if (!nla[NFTA_OBJ_TYPE] ||
7836 	    !nla[NFTA_OBJ_NAME] ||
7837 	    !nla[NFTA_OBJ_DATA])
7838 		return -EINVAL;
7839 
7840 	table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask,
7841 				 NETLINK_CB(skb).portid);
7842 	if (IS_ERR(table)) {
7843 		NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]);
7844 		return PTR_ERR(table);
7845 	}
7846 
7847 	objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
7848 	obj = nft_obj_lookup(net, table, nla[NFTA_OBJ_NAME], objtype, genmask);
7849 	if (IS_ERR(obj)) {
7850 		err = PTR_ERR(obj);
7851 		if (err != -ENOENT) {
7852 			NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]);
7853 			return err;
7854 		}
7855 	} else {
7856 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
7857 			NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]);
7858 			return -EEXIST;
7859 		}
7860 		if (info->nlh->nlmsg_flags & NLM_F_REPLACE)
7861 			return -EOPNOTSUPP;
7862 
7863 		type = __nft_obj_type_get(objtype, family);
7864 		if (WARN_ON_ONCE(!type))
7865 			return -ENOENT;
7866 
7867 		if (!obj->ops->update)
7868 			return 0;
7869 
7870 		nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
7871 
7872 		return nf_tables_updobj(&ctx, type, nla[NFTA_OBJ_DATA], obj);
7873 	}
7874 
7875 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
7876 
7877 	if (!nft_use_inc(&table->use))
7878 		return -EMFILE;
7879 
7880 	type = nft_obj_type_get(net, objtype, family);
7881 	if (IS_ERR(type)) {
7882 		err = PTR_ERR(type);
7883 		goto err_type;
7884 	}
7885 
7886 	obj = nft_obj_init(&ctx, type, nla[NFTA_OBJ_DATA]);
7887 	if (IS_ERR(obj)) {
7888 		err = PTR_ERR(obj);
7889 		goto err_init;
7890 	}
7891 	obj->key.table = table;
7892 	obj->handle = nf_tables_alloc_handle(table);
7893 
7894 	obj->key.name = nla_strdup(nla[NFTA_OBJ_NAME], GFP_KERNEL_ACCOUNT);
7895 	if (!obj->key.name) {
7896 		err = -ENOMEM;
7897 		goto err_strdup;
7898 	}
7899 
7900 	if (nla[NFTA_OBJ_USERDATA]) {
7901 		obj->udata = nla_memdup(nla[NFTA_OBJ_USERDATA], GFP_KERNEL_ACCOUNT);
7902 		if (obj->udata == NULL)
7903 			goto err_userdata;
7904 
7905 		obj->udlen = nla_len(nla[NFTA_OBJ_USERDATA]);
7906 	}
7907 
7908 	err = nft_trans_obj_add(&ctx, NFT_MSG_NEWOBJ, obj);
7909 	if (err < 0)
7910 		goto err_trans;
7911 
7912 	err = rhltable_insert(&nft_objname_ht, &obj->rhlhead,
7913 			      nft_objname_ht_params);
7914 	if (err < 0)
7915 		goto err_obj_ht;
7916 
7917 	list_add_tail_rcu(&obj->list, &table->objects);
7918 
7919 	return 0;
7920 err_obj_ht:
7921 	/* queued in transaction log */
7922 	INIT_LIST_HEAD(&obj->list);
7923 	return err;
7924 err_trans:
7925 	kfree(obj->udata);
7926 err_userdata:
7927 	kfree(obj->key.name);
7928 err_strdup:
7929 	if (obj->ops->destroy)
7930 		obj->ops->destroy(&ctx, obj);
7931 	kfree(obj);
7932 err_init:
7933 	module_put(type->owner);
7934 err_type:
7935 	nft_use_dec_restore(&table->use);
7936 
7937 	return err;
7938 }
7939 
nf_tables_fill_obj_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq,int event,u32 flags,int family,const struct nft_table * table,struct nft_object * obj,bool reset)7940 static int nf_tables_fill_obj_info(struct sk_buff *skb, struct net *net,
7941 				   u32 portid, u32 seq, int event, u32 flags,
7942 				   int family, const struct nft_table *table,
7943 				   struct nft_object *obj, bool reset)
7944 {
7945 	struct nlmsghdr *nlh;
7946 
7947 	event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
7948 	nlh = nfnl_msg_put(skb, portid, seq, event, flags, family,
7949 			   NFNETLINK_V0, nft_base_seq(net));
7950 	if (!nlh)
7951 		goto nla_put_failure;
7952 
7953 	if (nla_put_string(skb, NFTA_OBJ_TABLE, table->name) ||
7954 	    nla_put_string(skb, NFTA_OBJ_NAME, obj->key.name) ||
7955 	    nla_put_be64(skb, NFTA_OBJ_HANDLE, cpu_to_be64(obj->handle),
7956 			 NFTA_OBJ_PAD))
7957 		goto nla_put_failure;
7958 
7959 	if (event == NFT_MSG_DELOBJ) {
7960 		nlmsg_end(skb, nlh);
7961 		return 0;
7962 	}
7963 
7964 	if (nla_put_be32(skb, NFTA_OBJ_TYPE, htonl(obj->ops->type->type)) ||
7965 	    nla_put_be32(skb, NFTA_OBJ_USE, htonl(obj->use)) ||
7966 	    nft_object_dump(skb, NFTA_OBJ_DATA, obj, reset))
7967 		goto nla_put_failure;
7968 
7969 	if (obj->udata &&
7970 	    nla_put(skb, NFTA_OBJ_USERDATA, obj->udlen, obj->udata))
7971 		goto nla_put_failure;
7972 
7973 	nlmsg_end(skb, nlh);
7974 	return 0;
7975 
7976 nla_put_failure:
7977 	nlmsg_trim(skb, nlh);
7978 	return -1;
7979 }
7980 
audit_log_obj_reset(const struct nft_table * table,unsigned int base_seq,unsigned int nentries)7981 static void audit_log_obj_reset(const struct nft_table *table,
7982 				unsigned int base_seq, unsigned int nentries)
7983 {
7984 	char *buf = kasprintf(GFP_ATOMIC, "%s:%u", table->name, base_seq);
7985 
7986 	audit_log_nfcfg(buf, table->family, nentries,
7987 			AUDIT_NFT_OP_OBJ_RESET, GFP_ATOMIC);
7988 	kfree(buf);
7989 }
7990 
7991 struct nft_obj_dump_ctx {
7992 	unsigned int	s_idx;
7993 	char		*table;
7994 	u32		type;
7995 	bool		reset;
7996 };
7997 
nf_tables_dump_obj(struct sk_buff * skb,struct netlink_callback * cb)7998 static int nf_tables_dump_obj(struct sk_buff *skb, struct netlink_callback *cb)
7999 {
8000 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
8001 	struct nft_obj_dump_ctx *ctx = (void *)cb->ctx;
8002 	struct net *net = sock_net(skb->sk);
8003 	int family = nfmsg->nfgen_family;
8004 	struct nftables_pernet *nft_net;
8005 	const struct nft_table *table;
8006 	unsigned int entries = 0;
8007 	struct nft_object *obj;
8008 	unsigned int idx = 0;
8009 	int rc = 0;
8010 
8011 	rcu_read_lock();
8012 	nft_net = nft_pernet(net);
8013 	cb->seq = READ_ONCE(nft_net->base_seq);
8014 
8015 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
8016 		if (family != NFPROTO_UNSPEC && family != table->family)
8017 			continue;
8018 
8019 		entries = 0;
8020 		list_for_each_entry_rcu(obj, &table->objects, list) {
8021 			if (!nft_is_active(net, obj))
8022 				goto cont;
8023 			if (idx < ctx->s_idx)
8024 				goto cont;
8025 			if (ctx->table && strcmp(ctx->table, table->name))
8026 				goto cont;
8027 			if (ctx->type != NFT_OBJECT_UNSPEC &&
8028 			    obj->ops->type->type != ctx->type)
8029 				goto cont;
8030 
8031 			rc = nf_tables_fill_obj_info(skb, net,
8032 						     NETLINK_CB(cb->skb).portid,
8033 						     cb->nlh->nlmsg_seq,
8034 						     NFT_MSG_NEWOBJ,
8035 						     NLM_F_MULTI | NLM_F_APPEND,
8036 						     table->family, table,
8037 						     obj, ctx->reset);
8038 			if (rc < 0)
8039 				break;
8040 
8041 			entries++;
8042 			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
8043 cont:
8044 			idx++;
8045 		}
8046 		if (ctx->reset && entries)
8047 			audit_log_obj_reset(table, nft_net->base_seq, entries);
8048 		if (rc < 0)
8049 			break;
8050 	}
8051 	rcu_read_unlock();
8052 
8053 	ctx->s_idx = idx;
8054 	return skb->len;
8055 }
8056 
nf_tables_dumpreset_obj(struct sk_buff * skb,struct netlink_callback * cb)8057 static int nf_tables_dumpreset_obj(struct sk_buff *skb,
8058 				   struct netlink_callback *cb)
8059 {
8060 	struct nftables_pernet *nft_net = nft_pernet(sock_net(skb->sk));
8061 	int ret;
8062 
8063 	mutex_lock(&nft_net->commit_mutex);
8064 	ret = nf_tables_dump_obj(skb, cb);
8065 	mutex_unlock(&nft_net->commit_mutex);
8066 
8067 	return ret;
8068 }
8069 
nf_tables_dump_obj_start(struct netlink_callback * cb)8070 static int nf_tables_dump_obj_start(struct netlink_callback *cb)
8071 {
8072 	struct nft_obj_dump_ctx *ctx = (void *)cb->ctx;
8073 	const struct nlattr * const *nla = cb->data;
8074 
8075 	BUILD_BUG_ON(sizeof(*ctx) > sizeof(cb->ctx));
8076 
8077 	if (nla[NFTA_OBJ_TABLE]) {
8078 		ctx->table = nla_strdup(nla[NFTA_OBJ_TABLE], GFP_ATOMIC);
8079 		if (!ctx->table)
8080 			return -ENOMEM;
8081 	}
8082 
8083 	if (nla[NFTA_OBJ_TYPE])
8084 		ctx->type = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
8085 
8086 	return 0;
8087 }
8088 
nf_tables_dumpreset_obj_start(struct netlink_callback * cb)8089 static int nf_tables_dumpreset_obj_start(struct netlink_callback *cb)
8090 {
8091 	struct nft_obj_dump_ctx *ctx = (void *)cb->ctx;
8092 
8093 	ctx->reset = true;
8094 
8095 	return nf_tables_dump_obj_start(cb);
8096 }
8097 
nf_tables_dump_obj_done(struct netlink_callback * cb)8098 static int nf_tables_dump_obj_done(struct netlink_callback *cb)
8099 {
8100 	struct nft_obj_dump_ctx *ctx = (void *)cb->ctx;
8101 
8102 	kfree(ctx->table);
8103 
8104 	return 0;
8105 }
8106 
8107 /* called with rcu_read_lock held */
8108 static struct sk_buff *
nf_tables_getobj_single(u32 portid,const struct nfnl_info * info,const struct nlattr * const nla[],bool reset)8109 nf_tables_getobj_single(u32 portid, const struct nfnl_info *info,
8110 			const struct nlattr * const nla[], bool reset)
8111 {
8112 	struct netlink_ext_ack *extack = info->extack;
8113 	u8 genmask = nft_genmask_cur(info->net);
8114 	u8 family = info->nfmsg->nfgen_family;
8115 	const struct nft_table *table;
8116 	struct net *net = info->net;
8117 	struct nft_object *obj;
8118 	struct sk_buff *skb2;
8119 	u32 objtype;
8120 	int err;
8121 
8122 	if (!nla[NFTA_OBJ_NAME] ||
8123 	    !nla[NFTA_OBJ_TYPE])
8124 		return ERR_PTR(-EINVAL);
8125 
8126 	table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask, 0);
8127 	if (IS_ERR(table)) {
8128 		NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]);
8129 		return ERR_CAST(table);
8130 	}
8131 
8132 	objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
8133 	obj = nft_obj_lookup(net, table, nla[NFTA_OBJ_NAME], objtype, genmask);
8134 	if (IS_ERR(obj)) {
8135 		NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_NAME]);
8136 		return ERR_CAST(obj);
8137 	}
8138 
8139 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
8140 	if (!skb2)
8141 		return ERR_PTR(-ENOMEM);
8142 
8143 	err = nf_tables_fill_obj_info(skb2, net, portid,
8144 				      info->nlh->nlmsg_seq, NFT_MSG_NEWOBJ, 0,
8145 				      family, table, obj, reset);
8146 	if (err < 0) {
8147 		kfree_skb(skb2);
8148 		return ERR_PTR(err);
8149 	}
8150 
8151 	return skb2;
8152 }
8153 
nf_tables_getobj(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])8154 static int nf_tables_getobj(struct sk_buff *skb, const struct nfnl_info *info,
8155 			    const struct nlattr * const nla[])
8156 {
8157 	u32 portid = NETLINK_CB(skb).portid;
8158 	struct sk_buff *skb2;
8159 
8160 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
8161 		struct netlink_dump_control c = {
8162 			.start = nf_tables_dump_obj_start,
8163 			.dump = nf_tables_dump_obj,
8164 			.done = nf_tables_dump_obj_done,
8165 			.module = THIS_MODULE,
8166 			.data = (void *)nla,
8167 		};
8168 
8169 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
8170 	}
8171 
8172 	skb2 = nf_tables_getobj_single(portid, info, nla, false);
8173 	if (IS_ERR(skb2))
8174 		return PTR_ERR(skb2);
8175 
8176 	return nfnetlink_unicast(skb2, info->net, portid);
8177 }
8178 
nf_tables_getobj_reset(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])8179 static int nf_tables_getobj_reset(struct sk_buff *skb,
8180 				  const struct nfnl_info *info,
8181 				  const struct nlattr * const nla[])
8182 {
8183 	struct nftables_pernet *nft_net = nft_pernet(info->net);
8184 	u32 portid = NETLINK_CB(skb).portid;
8185 	struct net *net = info->net;
8186 	struct sk_buff *skb2;
8187 	char *buf;
8188 
8189 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
8190 		struct netlink_dump_control c = {
8191 			.start = nf_tables_dumpreset_obj_start,
8192 			.dump = nf_tables_dumpreset_obj,
8193 			.done = nf_tables_dump_obj_done,
8194 			.module = THIS_MODULE,
8195 			.data = (void *)nla,
8196 		};
8197 
8198 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
8199 	}
8200 
8201 	if (!try_module_get(THIS_MODULE))
8202 		return -EINVAL;
8203 	rcu_read_unlock();
8204 	mutex_lock(&nft_net->commit_mutex);
8205 	skb2 = nf_tables_getobj_single(portid, info, nla, true);
8206 	mutex_unlock(&nft_net->commit_mutex);
8207 	rcu_read_lock();
8208 	module_put(THIS_MODULE);
8209 
8210 	if (IS_ERR(skb2))
8211 		return PTR_ERR(skb2);
8212 
8213 	buf = kasprintf(GFP_ATOMIC, "%.*s:%u",
8214 			nla_len(nla[NFTA_OBJ_TABLE]),
8215 			(char *)nla_data(nla[NFTA_OBJ_TABLE]),
8216 			nft_net->base_seq);
8217 	audit_log_nfcfg(buf, info->nfmsg->nfgen_family, 1,
8218 			AUDIT_NFT_OP_OBJ_RESET, GFP_ATOMIC);
8219 	kfree(buf);
8220 
8221 	return nfnetlink_unicast(skb2, net, portid);
8222 }
8223 
nft_obj_destroy(const struct nft_ctx * ctx,struct nft_object * obj)8224 static void nft_obj_destroy(const struct nft_ctx *ctx, struct nft_object *obj)
8225 {
8226 	if (obj->ops->destroy)
8227 		obj->ops->destroy(ctx, obj);
8228 
8229 	module_put(obj->ops->type->owner);
8230 	kfree(obj->key.name);
8231 	kfree(obj->udata);
8232 	kfree(obj);
8233 }
8234 
nf_tables_delobj(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])8235 static int nf_tables_delobj(struct sk_buff *skb, const struct nfnl_info *info,
8236 			    const struct nlattr * const nla[])
8237 {
8238 	struct netlink_ext_ack *extack = info->extack;
8239 	u8 genmask = nft_genmask_next(info->net);
8240 	u8 family = info->nfmsg->nfgen_family;
8241 	struct net *net = info->net;
8242 	const struct nlattr *attr;
8243 	struct nft_table *table;
8244 	struct nft_object *obj;
8245 	struct nft_ctx ctx;
8246 	u32 objtype;
8247 
8248 	if (!nla[NFTA_OBJ_TYPE] ||
8249 	    (!nla[NFTA_OBJ_NAME] && !nla[NFTA_OBJ_HANDLE]))
8250 		return -EINVAL;
8251 
8252 	table = nft_table_lookup(net, nla[NFTA_OBJ_TABLE], family, genmask,
8253 				 NETLINK_CB(skb).portid);
8254 	if (IS_ERR(table)) {
8255 		NL_SET_BAD_ATTR(extack, nla[NFTA_OBJ_TABLE]);
8256 		return PTR_ERR(table);
8257 	}
8258 
8259 	objtype = ntohl(nla_get_be32(nla[NFTA_OBJ_TYPE]));
8260 	if (nla[NFTA_OBJ_HANDLE]) {
8261 		attr = nla[NFTA_OBJ_HANDLE];
8262 		obj = nft_obj_lookup_byhandle(table, attr, objtype, genmask);
8263 	} else {
8264 		attr = nla[NFTA_OBJ_NAME];
8265 		obj = nft_obj_lookup(net, table, attr, objtype, genmask);
8266 	}
8267 
8268 	if (IS_ERR(obj)) {
8269 		if (PTR_ERR(obj) == -ENOENT &&
8270 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYOBJ)
8271 			return 0;
8272 
8273 		NL_SET_BAD_ATTR(extack, attr);
8274 		return PTR_ERR(obj);
8275 	}
8276 	if (obj->use > 0) {
8277 		NL_SET_BAD_ATTR(extack, attr);
8278 		return -EBUSY;
8279 	}
8280 
8281 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
8282 
8283 	return nft_delobj(&ctx, obj);
8284 }
8285 
8286 static void
__nft_obj_notify(struct net * net,const struct nft_table * table,struct nft_object * obj,u32 portid,u32 seq,int event,u16 flags,int family,int report,gfp_t gfp)8287 __nft_obj_notify(struct net *net, const struct nft_table *table,
8288 		 struct nft_object *obj, u32 portid, u32 seq, int event,
8289 		 u16 flags, int family, int report, gfp_t gfp)
8290 {
8291 	struct nftables_pernet *nft_net = nft_pernet(net);
8292 	struct sk_buff *skb;
8293 	int err;
8294 
8295 	if (!report &&
8296 	    !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
8297 		return;
8298 
8299 	skb = nlmsg_new(NLMSG_GOODSIZE, gfp);
8300 	if (skb == NULL)
8301 		goto err;
8302 
8303 	err = nf_tables_fill_obj_info(skb, net, portid, seq, event,
8304 				      flags & (NLM_F_CREATE | NLM_F_EXCL),
8305 				      family, table, obj, false);
8306 	if (err < 0) {
8307 		kfree_skb(skb);
8308 		goto err;
8309 	}
8310 
8311 	nft_notify_enqueue(skb, report, &nft_net->notify_list);
8312 	return;
8313 err:
8314 	nfnetlink_set_err(net, portid, NFNLGRP_NFTABLES, -ENOBUFS);
8315 }
8316 
nft_obj_notify(struct net * net,const struct nft_table * table,struct nft_object * obj,u32 portid,u32 seq,int event,u16 flags,int family,int report,gfp_t gfp)8317 void nft_obj_notify(struct net *net, const struct nft_table *table,
8318 		    struct nft_object *obj, u32 portid, u32 seq, int event,
8319 		    u16 flags, int family, int report, gfp_t gfp)
8320 {
8321 	struct nftables_pernet *nft_net = nft_pernet(net);
8322 	char *buf = kasprintf(gfp, "%s:%u",
8323 			      table->name, nft_net->base_seq);
8324 
8325 	audit_log_nfcfg(buf,
8326 			family,
8327 			obj->handle,
8328 			event == NFT_MSG_NEWOBJ ?
8329 				 AUDIT_NFT_OP_OBJ_REGISTER :
8330 				 AUDIT_NFT_OP_OBJ_UNREGISTER,
8331 			gfp);
8332 	kfree(buf);
8333 
8334 	__nft_obj_notify(net, table, obj, portid, seq, event,
8335 			 flags, family, report, gfp);
8336 }
8337 EXPORT_SYMBOL_GPL(nft_obj_notify);
8338 
nf_tables_obj_notify(const struct nft_ctx * ctx,struct nft_object * obj,int event)8339 static void nf_tables_obj_notify(const struct nft_ctx *ctx,
8340 				 struct nft_object *obj, int event)
8341 {
8342 	__nft_obj_notify(ctx->net, ctx->table, obj, ctx->portid,
8343 			 ctx->seq, event, ctx->flags, ctx->family,
8344 			 ctx->report, GFP_KERNEL);
8345 }
8346 
8347 /*
8348  * Flow tables
8349  */
nft_register_flowtable_type(struct nf_flowtable_type * type)8350 void nft_register_flowtable_type(struct nf_flowtable_type *type)
8351 {
8352 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
8353 	list_add_tail_rcu(&type->list, &nf_tables_flowtables);
8354 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
8355 }
8356 EXPORT_SYMBOL_GPL(nft_register_flowtable_type);
8357 
nft_unregister_flowtable_type(struct nf_flowtable_type * type)8358 void nft_unregister_flowtable_type(struct nf_flowtable_type *type)
8359 {
8360 	nfnl_lock(NFNL_SUBSYS_NFTABLES);
8361 	list_del_rcu(&type->list);
8362 	nfnl_unlock(NFNL_SUBSYS_NFTABLES);
8363 }
8364 EXPORT_SYMBOL_GPL(nft_unregister_flowtable_type);
8365 
8366 static const struct nla_policy nft_flowtable_policy[NFTA_FLOWTABLE_MAX + 1] = {
8367 	[NFTA_FLOWTABLE_TABLE]		= { .type = NLA_STRING,
8368 					    .len = NFT_NAME_MAXLEN - 1 },
8369 	[NFTA_FLOWTABLE_NAME]		= { .type = NLA_STRING,
8370 					    .len = NFT_NAME_MAXLEN - 1 },
8371 	[NFTA_FLOWTABLE_HOOK]		= { .type = NLA_NESTED },
8372 	[NFTA_FLOWTABLE_HANDLE]		= { .type = NLA_U64 },
8373 	[NFTA_FLOWTABLE_FLAGS]		= { .type = NLA_U32 },
8374 };
8375 
nft_flowtable_lookup(const struct nft_table * table,const struct nlattr * nla,u8 genmask)8376 struct nft_flowtable *nft_flowtable_lookup(const struct nft_table *table,
8377 					   const struct nlattr *nla, u8 genmask)
8378 {
8379 	struct nft_flowtable *flowtable;
8380 
8381 	list_for_each_entry_rcu(flowtable, &table->flowtables, list) {
8382 		if (!nla_strcmp(nla, flowtable->name) &&
8383 		    nft_active_genmask(flowtable, genmask))
8384 			return flowtable;
8385 	}
8386 	return ERR_PTR(-ENOENT);
8387 }
8388 EXPORT_SYMBOL_GPL(nft_flowtable_lookup);
8389 
nf_tables_deactivate_flowtable(const struct nft_ctx * ctx,struct nft_flowtable * flowtable,enum nft_trans_phase phase)8390 void nf_tables_deactivate_flowtable(const struct nft_ctx *ctx,
8391 				    struct nft_flowtable *flowtable,
8392 				    enum nft_trans_phase phase)
8393 {
8394 	switch (phase) {
8395 	case NFT_TRANS_PREPARE_ERROR:
8396 	case NFT_TRANS_PREPARE:
8397 	case NFT_TRANS_ABORT:
8398 	case NFT_TRANS_RELEASE:
8399 		nft_use_dec(&flowtable->use);
8400 		fallthrough;
8401 	default:
8402 		return;
8403 	}
8404 }
8405 EXPORT_SYMBOL_GPL(nf_tables_deactivate_flowtable);
8406 
8407 static struct nft_flowtable *
nft_flowtable_lookup_byhandle(const struct nft_table * table,const struct nlattr * nla,u8 genmask)8408 nft_flowtable_lookup_byhandle(const struct nft_table *table,
8409 			      const struct nlattr *nla, u8 genmask)
8410 {
8411        struct nft_flowtable *flowtable;
8412 
8413        list_for_each_entry(flowtable, &table->flowtables, list) {
8414                if (be64_to_cpu(nla_get_be64(nla)) == flowtable->handle &&
8415                    nft_active_genmask(flowtable, genmask))
8416                        return flowtable;
8417        }
8418        return ERR_PTR(-ENOENT);
8419 }
8420 
8421 struct nft_flowtable_hook {
8422 	u32			num;
8423 	int			priority;
8424 	struct list_head	list;
8425 };
8426 
8427 static const struct nla_policy nft_flowtable_hook_policy[NFTA_FLOWTABLE_HOOK_MAX + 1] = {
8428 	[NFTA_FLOWTABLE_HOOK_NUM]	= { .type = NLA_U32 },
8429 	[NFTA_FLOWTABLE_HOOK_PRIORITY]	= { .type = NLA_U32 },
8430 	[NFTA_FLOWTABLE_HOOK_DEVS]	= { .type = NLA_NESTED },
8431 };
8432 
nft_flowtable_parse_hook(const struct nft_ctx * ctx,const struct nlattr * const nla[],struct nft_flowtable_hook * flowtable_hook,struct nft_flowtable * flowtable,struct netlink_ext_ack * extack,bool add)8433 static int nft_flowtable_parse_hook(const struct nft_ctx *ctx,
8434 				    const struct nlattr * const nla[],
8435 				    struct nft_flowtable_hook *flowtable_hook,
8436 				    struct nft_flowtable *flowtable,
8437 				    struct netlink_ext_ack *extack, bool add)
8438 {
8439 	struct nlattr *tb[NFTA_FLOWTABLE_HOOK_MAX + 1];
8440 	struct nft_hook *hook;
8441 	int hooknum, priority;
8442 	int err;
8443 
8444 	INIT_LIST_HEAD(&flowtable_hook->list);
8445 
8446 	err = nla_parse_nested_deprecated(tb, NFTA_FLOWTABLE_HOOK_MAX,
8447 					  nla[NFTA_FLOWTABLE_HOOK],
8448 					  nft_flowtable_hook_policy, NULL);
8449 	if (err < 0)
8450 		return err;
8451 
8452 	if (add) {
8453 		if (!tb[NFTA_FLOWTABLE_HOOK_NUM] ||
8454 		    !tb[NFTA_FLOWTABLE_HOOK_PRIORITY]) {
8455 			NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
8456 			return -ENOENT;
8457 		}
8458 
8459 		hooknum = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_NUM]));
8460 		if (hooknum != NF_NETDEV_INGRESS)
8461 			return -EOPNOTSUPP;
8462 
8463 		priority = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_PRIORITY]));
8464 
8465 		flowtable_hook->priority	= priority;
8466 		flowtable_hook->num		= hooknum;
8467 	} else {
8468 		if (tb[NFTA_FLOWTABLE_HOOK_NUM]) {
8469 			hooknum = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_NUM]));
8470 			if (hooknum != flowtable->hooknum)
8471 				return -EOPNOTSUPP;
8472 		}
8473 
8474 		if (tb[NFTA_FLOWTABLE_HOOK_PRIORITY]) {
8475 			priority = ntohl(nla_get_be32(tb[NFTA_FLOWTABLE_HOOK_PRIORITY]));
8476 			if (priority != flowtable->data.priority)
8477 				return -EOPNOTSUPP;
8478 		}
8479 
8480 		flowtable_hook->priority	= flowtable->data.priority;
8481 		flowtable_hook->num		= flowtable->hooknum;
8482 	}
8483 
8484 	if (tb[NFTA_FLOWTABLE_HOOK_DEVS]) {
8485 		err = nf_tables_parse_netdev_hooks(ctx->net,
8486 						   tb[NFTA_FLOWTABLE_HOOK_DEVS],
8487 						   &flowtable_hook->list,
8488 						   extack);
8489 		if (err < 0)
8490 			return err;
8491 	}
8492 
8493 	list_for_each_entry(hook, &flowtable_hook->list, list) {
8494 		hook->ops.pf		= NFPROTO_NETDEV;
8495 		hook->ops.hooknum	= flowtable_hook->num;
8496 		hook->ops.priority	= flowtable_hook->priority;
8497 		hook->ops.priv		= &flowtable->data;
8498 		hook->ops.hook		= flowtable->data.type->hook;
8499 	}
8500 
8501 	return err;
8502 }
8503 
8504 /* call under rcu_read_lock */
__nft_flowtable_type_get(u8 family)8505 static const struct nf_flowtable_type *__nft_flowtable_type_get(u8 family)
8506 {
8507 	const struct nf_flowtable_type *type;
8508 
8509 	list_for_each_entry_rcu(type, &nf_tables_flowtables, list) {
8510 		if (family == type->family)
8511 			return type;
8512 	}
8513 	return NULL;
8514 }
8515 
8516 static const struct nf_flowtable_type *
nft_flowtable_type_get(struct net * net,u8 family)8517 nft_flowtable_type_get(struct net *net, u8 family)
8518 {
8519 	const struct nf_flowtable_type *type;
8520 
8521 	rcu_read_lock();
8522 	type = __nft_flowtable_type_get(family);
8523 	if (type != NULL && try_module_get(type->owner)) {
8524 		rcu_read_unlock();
8525 		return type;
8526 	}
8527 	rcu_read_unlock();
8528 
8529 	lockdep_nfnl_nft_mutex_not_held();
8530 #ifdef CONFIG_MODULES
8531 	if (type == NULL) {
8532 		if (nft_request_module(net, "nf-flowtable-%u", family) == -EAGAIN)
8533 			return ERR_PTR(-EAGAIN);
8534 	}
8535 #endif
8536 	return ERR_PTR(-ENOENT);
8537 }
8538 
8539 /* Only called from error and netdev event paths. */
nft_unregister_flowtable_hook(struct net * net,struct nft_flowtable * flowtable,struct nft_hook * hook)8540 static void nft_unregister_flowtable_hook(struct net *net,
8541 					  struct nft_flowtable *flowtable,
8542 					  struct nft_hook *hook)
8543 {
8544 	nf_unregister_net_hook(net, &hook->ops);
8545 	flowtable->data.type->setup(&flowtable->data, hook->ops.dev,
8546 				    FLOW_BLOCK_UNBIND);
8547 }
8548 
__nft_unregister_flowtable_net_hooks(struct net * net,struct list_head * hook_list,bool release_netdev)8549 static void __nft_unregister_flowtable_net_hooks(struct net *net,
8550 						 struct list_head *hook_list,
8551 					         bool release_netdev)
8552 {
8553 	struct nft_hook *hook, *next;
8554 
8555 	list_for_each_entry_safe(hook, next, hook_list, list) {
8556 		nf_unregister_net_hook(net, &hook->ops);
8557 		if (release_netdev) {
8558 			list_del(&hook->list);
8559 			kfree_rcu(hook, rcu);
8560 		}
8561 	}
8562 }
8563 
nft_unregister_flowtable_net_hooks(struct net * net,struct list_head * hook_list)8564 static void nft_unregister_flowtable_net_hooks(struct net *net,
8565 					       struct list_head *hook_list)
8566 {
8567 	__nft_unregister_flowtable_net_hooks(net, hook_list, false);
8568 }
8569 
nft_register_flowtable_net_hooks(struct net * net,struct nft_table * table,struct list_head * hook_list,struct nft_flowtable * flowtable)8570 static int nft_register_flowtable_net_hooks(struct net *net,
8571 					    struct nft_table *table,
8572 					    struct list_head *hook_list,
8573 					    struct nft_flowtable *flowtable)
8574 {
8575 	struct nft_hook *hook, *hook2, *next;
8576 	struct nft_flowtable *ft;
8577 	int err, i = 0;
8578 
8579 	list_for_each_entry(hook, hook_list, list) {
8580 		list_for_each_entry(ft, &table->flowtables, list) {
8581 			if (!nft_is_active_next(net, ft))
8582 				continue;
8583 
8584 			list_for_each_entry(hook2, &ft->hook_list, list) {
8585 				if (hook->ops.dev == hook2->ops.dev &&
8586 				    hook->ops.pf == hook2->ops.pf) {
8587 					err = -EEXIST;
8588 					goto err_unregister_net_hooks;
8589 				}
8590 			}
8591 		}
8592 
8593 		err = flowtable->data.type->setup(&flowtable->data,
8594 						  hook->ops.dev,
8595 						  FLOW_BLOCK_BIND);
8596 		if (err < 0)
8597 			goto err_unregister_net_hooks;
8598 
8599 		err = nf_register_net_hook(net, &hook->ops);
8600 		if (err < 0) {
8601 			flowtable->data.type->setup(&flowtable->data,
8602 						    hook->ops.dev,
8603 						    FLOW_BLOCK_UNBIND);
8604 			goto err_unregister_net_hooks;
8605 		}
8606 
8607 		i++;
8608 	}
8609 
8610 	return 0;
8611 
8612 err_unregister_net_hooks:
8613 	list_for_each_entry_safe(hook, next, hook_list, list) {
8614 		if (i-- <= 0)
8615 			break;
8616 
8617 		nft_unregister_flowtable_hook(net, flowtable, hook);
8618 		list_del_rcu(&hook->list);
8619 		kfree_rcu(hook, rcu);
8620 	}
8621 
8622 	return err;
8623 }
8624 
nft_hooks_destroy(struct list_head * hook_list)8625 static void nft_hooks_destroy(struct list_head *hook_list)
8626 {
8627 	struct nft_hook *hook, *next;
8628 
8629 	list_for_each_entry_safe(hook, next, hook_list, list) {
8630 		list_del_rcu(&hook->list);
8631 		kfree_rcu(hook, rcu);
8632 	}
8633 }
8634 
nft_flowtable_update(struct nft_ctx * ctx,const struct nlmsghdr * nlh,struct nft_flowtable * flowtable,struct netlink_ext_ack * extack)8635 static int nft_flowtable_update(struct nft_ctx *ctx, const struct nlmsghdr *nlh,
8636 				struct nft_flowtable *flowtable,
8637 				struct netlink_ext_ack *extack)
8638 {
8639 	const struct nlattr * const *nla = ctx->nla;
8640 	struct nft_flowtable_hook flowtable_hook;
8641 	struct nft_hook *hook, *next;
8642 	struct nft_trans *trans;
8643 	bool unregister = false;
8644 	u32 flags;
8645 	int err;
8646 
8647 	err = nft_flowtable_parse_hook(ctx, nla, &flowtable_hook, flowtable,
8648 				       extack, false);
8649 	if (err < 0)
8650 		return err;
8651 
8652 	list_for_each_entry_safe(hook, next, &flowtable_hook.list, list) {
8653 		if (nft_hook_list_find(&flowtable->hook_list, hook)) {
8654 			list_del(&hook->list);
8655 			kfree(hook);
8656 		}
8657 	}
8658 
8659 	if (nla[NFTA_FLOWTABLE_FLAGS]) {
8660 		flags = ntohl(nla_get_be32(nla[NFTA_FLOWTABLE_FLAGS]));
8661 		if (flags & ~NFT_FLOWTABLE_MASK) {
8662 			err = -EOPNOTSUPP;
8663 			goto err_flowtable_update_hook;
8664 		}
8665 		if ((flowtable->data.flags & NFT_FLOWTABLE_HW_OFFLOAD) ^
8666 		    (flags & NFT_FLOWTABLE_HW_OFFLOAD)) {
8667 			err = -EOPNOTSUPP;
8668 			goto err_flowtable_update_hook;
8669 		}
8670 	} else {
8671 		flags = flowtable->data.flags;
8672 	}
8673 
8674 	err = nft_register_flowtable_net_hooks(ctx->net, ctx->table,
8675 					       &flowtable_hook.list, flowtable);
8676 	if (err < 0)
8677 		goto err_flowtable_update_hook;
8678 
8679 	trans = nft_trans_alloc(ctx, NFT_MSG_NEWFLOWTABLE,
8680 				sizeof(struct nft_trans_flowtable));
8681 	if (!trans) {
8682 		unregister = true;
8683 		err = -ENOMEM;
8684 		goto err_flowtable_update_hook;
8685 	}
8686 
8687 	nft_trans_flowtable_flags(trans) = flags;
8688 	nft_trans_flowtable(trans) = flowtable;
8689 	nft_trans_flowtable_update(trans) = true;
8690 	INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans));
8691 	list_splice(&flowtable_hook.list, &nft_trans_flowtable_hooks(trans));
8692 
8693 	nft_trans_commit_list_add_tail(ctx->net, trans);
8694 
8695 	return 0;
8696 
8697 err_flowtable_update_hook:
8698 	list_for_each_entry_safe(hook, next, &flowtable_hook.list, list) {
8699 		if (unregister)
8700 			nft_unregister_flowtable_hook(ctx->net, flowtable, hook);
8701 		list_del_rcu(&hook->list);
8702 		kfree_rcu(hook, rcu);
8703 	}
8704 
8705 	return err;
8706 
8707 }
8708 
nf_tables_newflowtable(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])8709 static int nf_tables_newflowtable(struct sk_buff *skb,
8710 				  const struct nfnl_info *info,
8711 				  const struct nlattr * const nla[])
8712 {
8713 	struct netlink_ext_ack *extack = info->extack;
8714 	struct nft_flowtable_hook flowtable_hook;
8715 	u8 genmask = nft_genmask_next(info->net);
8716 	u8 family = info->nfmsg->nfgen_family;
8717 	const struct nf_flowtable_type *type;
8718 	struct nft_flowtable *flowtable;
8719 	struct net *net = info->net;
8720 	struct nft_table *table;
8721 	struct nft_trans *trans;
8722 	struct nft_ctx ctx;
8723 	int err;
8724 
8725 	if (!nla[NFTA_FLOWTABLE_TABLE] ||
8726 	    !nla[NFTA_FLOWTABLE_NAME] ||
8727 	    !nla[NFTA_FLOWTABLE_HOOK])
8728 		return -EINVAL;
8729 
8730 	table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family,
8731 				 genmask, NETLINK_CB(skb).portid);
8732 	if (IS_ERR(table)) {
8733 		NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]);
8734 		return PTR_ERR(table);
8735 	}
8736 
8737 	flowtable = nft_flowtable_lookup(table, nla[NFTA_FLOWTABLE_NAME],
8738 					 genmask);
8739 	if (IS_ERR(flowtable)) {
8740 		err = PTR_ERR(flowtable);
8741 		if (err != -ENOENT) {
8742 			NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
8743 			return err;
8744 		}
8745 	} else {
8746 		if (info->nlh->nlmsg_flags & NLM_F_EXCL) {
8747 			NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
8748 			return -EEXIST;
8749 		}
8750 
8751 		nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
8752 
8753 		return nft_flowtable_update(&ctx, info->nlh, flowtable, extack);
8754 	}
8755 
8756 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
8757 
8758 	if (!nft_use_inc(&table->use))
8759 		return -EMFILE;
8760 
8761 	flowtable = kzalloc(sizeof(*flowtable), GFP_KERNEL_ACCOUNT);
8762 	if (!flowtable) {
8763 		err = -ENOMEM;
8764 		goto flowtable_alloc;
8765 	}
8766 
8767 	flowtable->table = table;
8768 	flowtable->handle = nf_tables_alloc_handle(table);
8769 	INIT_LIST_HEAD(&flowtable->hook_list);
8770 
8771 	flowtable->name = nla_strdup(nla[NFTA_FLOWTABLE_NAME], GFP_KERNEL_ACCOUNT);
8772 	if (!flowtable->name) {
8773 		err = -ENOMEM;
8774 		goto err1;
8775 	}
8776 
8777 	type = nft_flowtable_type_get(net, family);
8778 	if (IS_ERR(type)) {
8779 		err = PTR_ERR(type);
8780 		goto err2;
8781 	}
8782 
8783 	if (nla[NFTA_FLOWTABLE_FLAGS]) {
8784 		flowtable->data.flags =
8785 			ntohl(nla_get_be32(nla[NFTA_FLOWTABLE_FLAGS]));
8786 		if (flowtable->data.flags & ~NFT_FLOWTABLE_MASK) {
8787 			err = -EOPNOTSUPP;
8788 			goto err3;
8789 		}
8790 	}
8791 
8792 	write_pnet(&flowtable->data.net, net);
8793 	flowtable->data.type = type;
8794 	err = type->init(&flowtable->data);
8795 	if (err < 0)
8796 		goto err3;
8797 
8798 	err = nft_flowtable_parse_hook(&ctx, nla, &flowtable_hook, flowtable,
8799 				       extack, true);
8800 	if (err < 0)
8801 		goto err_flowtable_parse_hooks;
8802 
8803 	list_splice(&flowtable_hook.list, &flowtable->hook_list);
8804 	flowtable->data.priority = flowtable_hook.priority;
8805 	flowtable->hooknum = flowtable_hook.num;
8806 
8807 	trans = nft_trans_flowtable_add(&ctx, NFT_MSG_NEWFLOWTABLE, flowtable);
8808 	if (IS_ERR(trans)) {
8809 		err = PTR_ERR(trans);
8810 		goto err_flowtable_trans;
8811 	}
8812 
8813 	/* This must be LAST to ensure no packets are walking over this flowtable. */
8814 	err = nft_register_flowtable_net_hooks(ctx.net, table,
8815 					       &flowtable->hook_list,
8816 					       flowtable);
8817 	if (err < 0)
8818 		goto err_flowtable_hooks;
8819 
8820 	list_add_tail_rcu(&flowtable->list, &table->flowtables);
8821 
8822 	return 0;
8823 
8824 err_flowtable_hooks:
8825 	nft_trans_destroy(trans);
8826 err_flowtable_trans:
8827 	nft_hooks_destroy(&flowtable->hook_list);
8828 err_flowtable_parse_hooks:
8829 	flowtable->data.type->free(&flowtable->data);
8830 err3:
8831 	module_put(type->owner);
8832 err2:
8833 	kfree(flowtable->name);
8834 err1:
8835 	kfree(flowtable);
8836 flowtable_alloc:
8837 	nft_use_dec_restore(&table->use);
8838 
8839 	return err;
8840 }
8841 
nft_flowtable_hook_release(struct nft_flowtable_hook * flowtable_hook)8842 static void nft_flowtable_hook_release(struct nft_flowtable_hook *flowtable_hook)
8843 {
8844 	struct nft_hook *this, *next;
8845 
8846 	list_for_each_entry_safe(this, next, &flowtable_hook->list, list) {
8847 		list_del(&this->list);
8848 		kfree(this);
8849 	}
8850 }
8851 
nft_delflowtable_hook(struct nft_ctx * ctx,struct nft_flowtable * flowtable,struct netlink_ext_ack * extack)8852 static int nft_delflowtable_hook(struct nft_ctx *ctx,
8853 				 struct nft_flowtable *flowtable,
8854 				 struct netlink_ext_ack *extack)
8855 {
8856 	const struct nlattr * const *nla = ctx->nla;
8857 	struct nft_flowtable_hook flowtable_hook;
8858 	LIST_HEAD(flowtable_del_list);
8859 	struct nft_hook *this, *hook;
8860 	struct nft_trans *trans;
8861 	int err;
8862 
8863 	err = nft_flowtable_parse_hook(ctx, nla, &flowtable_hook, flowtable,
8864 				       extack, false);
8865 	if (err < 0)
8866 		return err;
8867 
8868 	list_for_each_entry(this, &flowtable_hook.list, list) {
8869 		hook = nft_hook_list_find(&flowtable->hook_list, this);
8870 		if (!hook) {
8871 			err = -ENOENT;
8872 			goto err_flowtable_del_hook;
8873 		}
8874 		list_move(&hook->list, &flowtable_del_list);
8875 	}
8876 
8877 	trans = nft_trans_alloc(ctx, NFT_MSG_DELFLOWTABLE,
8878 				sizeof(struct nft_trans_flowtable));
8879 	if (!trans) {
8880 		err = -ENOMEM;
8881 		goto err_flowtable_del_hook;
8882 	}
8883 
8884 	nft_trans_flowtable(trans) = flowtable;
8885 	nft_trans_flowtable_update(trans) = true;
8886 	INIT_LIST_HEAD(&nft_trans_flowtable_hooks(trans));
8887 	list_splice(&flowtable_del_list, &nft_trans_flowtable_hooks(trans));
8888 	nft_flowtable_hook_release(&flowtable_hook);
8889 
8890 	nft_trans_commit_list_add_tail(ctx->net, trans);
8891 
8892 	return 0;
8893 
8894 err_flowtable_del_hook:
8895 	list_splice(&flowtable_del_list, &flowtable->hook_list);
8896 	nft_flowtable_hook_release(&flowtable_hook);
8897 
8898 	return err;
8899 }
8900 
nf_tables_delflowtable(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])8901 static int nf_tables_delflowtable(struct sk_buff *skb,
8902 				  const struct nfnl_info *info,
8903 				  const struct nlattr * const nla[])
8904 {
8905 	struct netlink_ext_ack *extack = info->extack;
8906 	u8 genmask = nft_genmask_next(info->net);
8907 	u8 family = info->nfmsg->nfgen_family;
8908 	struct nft_flowtable *flowtable;
8909 	struct net *net = info->net;
8910 	const struct nlattr *attr;
8911 	struct nft_table *table;
8912 	struct nft_ctx ctx;
8913 
8914 	if (!nla[NFTA_FLOWTABLE_TABLE] ||
8915 	    (!nla[NFTA_FLOWTABLE_NAME] &&
8916 	     !nla[NFTA_FLOWTABLE_HANDLE]))
8917 		return -EINVAL;
8918 
8919 	table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family,
8920 				 genmask, NETLINK_CB(skb).portid);
8921 	if (IS_ERR(table)) {
8922 		NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]);
8923 		return PTR_ERR(table);
8924 	}
8925 
8926 	if (nla[NFTA_FLOWTABLE_HANDLE]) {
8927 		attr = nla[NFTA_FLOWTABLE_HANDLE];
8928 		flowtable = nft_flowtable_lookup_byhandle(table, attr, genmask);
8929 	} else {
8930 		attr = nla[NFTA_FLOWTABLE_NAME];
8931 		flowtable = nft_flowtable_lookup(table, attr, genmask);
8932 	}
8933 
8934 	if (IS_ERR(flowtable)) {
8935 		if (PTR_ERR(flowtable) == -ENOENT &&
8936 		    NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYFLOWTABLE)
8937 			return 0;
8938 
8939 		NL_SET_BAD_ATTR(extack, attr);
8940 		return PTR_ERR(flowtable);
8941 	}
8942 
8943 	nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
8944 
8945 	if (nla[NFTA_FLOWTABLE_HOOK])
8946 		return nft_delflowtable_hook(&ctx, flowtable, extack);
8947 
8948 	if (flowtable->use > 0) {
8949 		NL_SET_BAD_ATTR(extack, attr);
8950 		return -EBUSY;
8951 	}
8952 
8953 	return nft_delflowtable(&ctx, flowtable);
8954 }
8955 
nf_tables_fill_flowtable_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq,int event,u32 flags,int family,struct nft_flowtable * flowtable,struct list_head * hook_list)8956 static int nf_tables_fill_flowtable_info(struct sk_buff *skb, struct net *net,
8957 					 u32 portid, u32 seq, int event,
8958 					 u32 flags, int family,
8959 					 struct nft_flowtable *flowtable,
8960 					 struct list_head *hook_list)
8961 {
8962 	struct nlattr *nest, *nest_devs;
8963 	struct nft_hook *hook;
8964 	struct nlmsghdr *nlh;
8965 
8966 	event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, event);
8967 	nlh = nfnl_msg_put(skb, portid, seq, event, flags, family,
8968 			   NFNETLINK_V0, nft_base_seq(net));
8969 	if (!nlh)
8970 		goto nla_put_failure;
8971 
8972 	if (nla_put_string(skb, NFTA_FLOWTABLE_TABLE, flowtable->table->name) ||
8973 	    nla_put_string(skb, NFTA_FLOWTABLE_NAME, flowtable->name) ||
8974 	    nla_put_be64(skb, NFTA_FLOWTABLE_HANDLE, cpu_to_be64(flowtable->handle),
8975 			 NFTA_FLOWTABLE_PAD))
8976 		goto nla_put_failure;
8977 
8978 	if (event == NFT_MSG_DELFLOWTABLE && !hook_list) {
8979 		nlmsg_end(skb, nlh);
8980 		return 0;
8981 	}
8982 
8983 	if (nla_put_be32(skb, NFTA_FLOWTABLE_USE, htonl(flowtable->use)) ||
8984 	    nla_put_be32(skb, NFTA_FLOWTABLE_FLAGS, htonl(flowtable->data.flags)))
8985 		goto nla_put_failure;
8986 
8987 	nest = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK);
8988 	if (!nest)
8989 		goto nla_put_failure;
8990 	if (nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_NUM, htonl(flowtable->hooknum)) ||
8991 	    nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_PRIORITY, htonl(flowtable->data.priority)))
8992 		goto nla_put_failure;
8993 
8994 	nest_devs = nla_nest_start_noflag(skb, NFTA_FLOWTABLE_HOOK_DEVS);
8995 	if (!nest_devs)
8996 		goto nla_put_failure;
8997 
8998 	if (!hook_list)
8999 		hook_list = &flowtable->hook_list;
9000 
9001 	list_for_each_entry_rcu(hook, hook_list, list) {
9002 		if (nla_put_string(skb, NFTA_DEVICE_NAME, hook->ops.dev->name))
9003 			goto nla_put_failure;
9004 	}
9005 	nla_nest_end(skb, nest_devs);
9006 	nla_nest_end(skb, nest);
9007 
9008 	nlmsg_end(skb, nlh);
9009 	return 0;
9010 
9011 nla_put_failure:
9012 	nlmsg_trim(skb, nlh);
9013 	return -1;
9014 }
9015 
9016 struct nft_flowtable_filter {
9017 	char		*table;
9018 };
9019 
nf_tables_dump_flowtable(struct sk_buff * skb,struct netlink_callback * cb)9020 static int nf_tables_dump_flowtable(struct sk_buff *skb,
9021 				    struct netlink_callback *cb)
9022 {
9023 	const struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
9024 	struct nft_flowtable_filter *filter = cb->data;
9025 	unsigned int idx = 0, s_idx = cb->args[0];
9026 	struct net *net = sock_net(skb->sk);
9027 	int family = nfmsg->nfgen_family;
9028 	struct nft_flowtable *flowtable;
9029 	struct nftables_pernet *nft_net;
9030 	const struct nft_table *table;
9031 
9032 	rcu_read_lock();
9033 	nft_net = nft_pernet(net);
9034 	cb->seq = READ_ONCE(nft_net->base_seq);
9035 
9036 	list_for_each_entry_rcu(table, &nft_net->tables, list) {
9037 		if (family != NFPROTO_UNSPEC && family != table->family)
9038 			continue;
9039 
9040 		list_for_each_entry_rcu(flowtable, &table->flowtables, list) {
9041 			if (!nft_is_active(net, flowtable))
9042 				goto cont;
9043 			if (idx < s_idx)
9044 				goto cont;
9045 			if (idx > s_idx)
9046 				memset(&cb->args[1], 0,
9047 				       sizeof(cb->args) - sizeof(cb->args[0]));
9048 			if (filter && filter->table &&
9049 			    strcmp(filter->table, table->name))
9050 				goto cont;
9051 
9052 			if (nf_tables_fill_flowtable_info(skb, net, NETLINK_CB(cb->skb).portid,
9053 							  cb->nlh->nlmsg_seq,
9054 							  NFT_MSG_NEWFLOWTABLE,
9055 							  NLM_F_MULTI | NLM_F_APPEND,
9056 							  table->family,
9057 							  flowtable, NULL) < 0)
9058 				goto done;
9059 
9060 			nl_dump_check_consistent(cb, nlmsg_hdr(skb));
9061 cont:
9062 			idx++;
9063 		}
9064 	}
9065 done:
9066 	rcu_read_unlock();
9067 
9068 	cb->args[0] = idx;
9069 	return skb->len;
9070 }
9071 
nf_tables_dump_flowtable_start(struct netlink_callback * cb)9072 static int nf_tables_dump_flowtable_start(struct netlink_callback *cb)
9073 {
9074 	const struct nlattr * const *nla = cb->data;
9075 	struct nft_flowtable_filter *filter = NULL;
9076 
9077 	if (nla[NFTA_FLOWTABLE_TABLE]) {
9078 		filter = kzalloc(sizeof(*filter), GFP_ATOMIC);
9079 		if (!filter)
9080 			return -ENOMEM;
9081 
9082 		filter->table = nla_strdup(nla[NFTA_FLOWTABLE_TABLE],
9083 					   GFP_ATOMIC);
9084 		if (!filter->table) {
9085 			kfree(filter);
9086 			return -ENOMEM;
9087 		}
9088 	}
9089 
9090 	cb->data = filter;
9091 	return 0;
9092 }
9093 
nf_tables_dump_flowtable_done(struct netlink_callback * cb)9094 static int nf_tables_dump_flowtable_done(struct netlink_callback *cb)
9095 {
9096 	struct nft_flowtable_filter *filter = cb->data;
9097 
9098 	if (!filter)
9099 		return 0;
9100 
9101 	kfree(filter->table);
9102 	kfree(filter);
9103 
9104 	return 0;
9105 }
9106 
9107 /* called with rcu_read_lock held */
nf_tables_getflowtable(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])9108 static int nf_tables_getflowtable(struct sk_buff *skb,
9109 				  const struct nfnl_info *info,
9110 				  const struct nlattr * const nla[])
9111 {
9112 	struct netlink_ext_ack *extack = info->extack;
9113 	u8 genmask = nft_genmask_cur(info->net);
9114 	u8 family = info->nfmsg->nfgen_family;
9115 	struct nft_flowtable *flowtable;
9116 	const struct nft_table *table;
9117 	struct net *net = info->net;
9118 	struct sk_buff *skb2;
9119 	int err;
9120 
9121 	if (info->nlh->nlmsg_flags & NLM_F_DUMP) {
9122 		struct netlink_dump_control c = {
9123 			.start = nf_tables_dump_flowtable_start,
9124 			.dump = nf_tables_dump_flowtable,
9125 			.done = nf_tables_dump_flowtable_done,
9126 			.module = THIS_MODULE,
9127 			.data = (void *)nla,
9128 		};
9129 
9130 		return nft_netlink_dump_start_rcu(info->sk, skb, info->nlh, &c);
9131 	}
9132 
9133 	if (!nla[NFTA_FLOWTABLE_NAME])
9134 		return -EINVAL;
9135 
9136 	table = nft_table_lookup(net, nla[NFTA_FLOWTABLE_TABLE], family,
9137 				 genmask, 0);
9138 	if (IS_ERR(table)) {
9139 		NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_TABLE]);
9140 		return PTR_ERR(table);
9141 	}
9142 
9143 	flowtable = nft_flowtable_lookup(table, nla[NFTA_FLOWTABLE_NAME],
9144 					 genmask);
9145 	if (IS_ERR(flowtable)) {
9146 		NL_SET_BAD_ATTR(extack, nla[NFTA_FLOWTABLE_NAME]);
9147 		return PTR_ERR(flowtable);
9148 	}
9149 
9150 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
9151 	if (!skb2)
9152 		return -ENOMEM;
9153 
9154 	err = nf_tables_fill_flowtable_info(skb2, net, NETLINK_CB(skb).portid,
9155 					    info->nlh->nlmsg_seq,
9156 					    NFT_MSG_NEWFLOWTABLE, 0, family,
9157 					    flowtable, NULL);
9158 	if (err < 0)
9159 		goto err_fill_flowtable_info;
9160 
9161 	return nfnetlink_unicast(skb2, net, NETLINK_CB(skb).portid);
9162 
9163 err_fill_flowtable_info:
9164 	kfree_skb(skb2);
9165 	return err;
9166 }
9167 
nf_tables_flowtable_notify(struct nft_ctx * ctx,struct nft_flowtable * flowtable,struct list_head * hook_list,int event)9168 static void nf_tables_flowtable_notify(struct nft_ctx *ctx,
9169 				       struct nft_flowtable *flowtable,
9170 				       struct list_head *hook_list, int event)
9171 {
9172 	struct nftables_pernet *nft_net = nft_pernet(ctx->net);
9173 	struct sk_buff *skb;
9174 	u16 flags = 0;
9175 	int err;
9176 
9177 	if (!ctx->report &&
9178 	    !nfnetlink_has_listeners(ctx->net, NFNLGRP_NFTABLES))
9179 		return;
9180 
9181 	skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
9182 	if (skb == NULL)
9183 		goto err;
9184 
9185 	if (ctx->flags & (NLM_F_CREATE | NLM_F_EXCL))
9186 		flags |= ctx->flags & (NLM_F_CREATE | NLM_F_EXCL);
9187 
9188 	err = nf_tables_fill_flowtable_info(skb, ctx->net, ctx->portid,
9189 					    ctx->seq, event, flags,
9190 					    ctx->family, flowtable, hook_list);
9191 	if (err < 0) {
9192 		kfree_skb(skb);
9193 		goto err;
9194 	}
9195 
9196 	nft_notify_enqueue(skb, ctx->report, &nft_net->notify_list);
9197 	return;
9198 err:
9199 	nfnetlink_set_err(ctx->net, ctx->portid, NFNLGRP_NFTABLES, -ENOBUFS);
9200 }
9201 
nf_tables_flowtable_destroy(struct nft_flowtable * flowtable)9202 static void nf_tables_flowtable_destroy(struct nft_flowtable *flowtable)
9203 {
9204 	struct nft_hook *hook, *next;
9205 
9206 	flowtable->data.type->free(&flowtable->data);
9207 	list_for_each_entry_safe(hook, next, &flowtable->hook_list, list) {
9208 		flowtable->data.type->setup(&flowtable->data, hook->ops.dev,
9209 					    FLOW_BLOCK_UNBIND);
9210 		list_del_rcu(&hook->list);
9211 		kfree_rcu(hook, rcu);
9212 	}
9213 	kfree(flowtable->name);
9214 	module_put(flowtable->data.type->owner);
9215 	kfree(flowtable);
9216 }
9217 
nf_tables_fill_gen_info(struct sk_buff * skb,struct net * net,u32 portid,u32 seq)9218 static int nf_tables_fill_gen_info(struct sk_buff *skb, struct net *net,
9219 				   u32 portid, u32 seq)
9220 {
9221 	struct nftables_pernet *nft_net = nft_pernet(net);
9222 	struct nlmsghdr *nlh;
9223 	char buf[TASK_COMM_LEN];
9224 	int event = nfnl_msg_type(NFNL_SUBSYS_NFTABLES, NFT_MSG_NEWGEN);
9225 
9226 	nlh = nfnl_msg_put(skb, portid, seq, event, 0, AF_UNSPEC,
9227 			   NFNETLINK_V0, nft_base_seq(net));
9228 	if (!nlh)
9229 		goto nla_put_failure;
9230 
9231 	if (nla_put_be32(skb, NFTA_GEN_ID, htonl(nft_net->base_seq)) ||
9232 	    nla_put_be32(skb, NFTA_GEN_PROC_PID, htonl(task_pid_nr(current))) ||
9233 	    nla_put_string(skb, NFTA_GEN_PROC_NAME, get_task_comm(buf, current)))
9234 		goto nla_put_failure;
9235 
9236 	nlmsg_end(skb, nlh);
9237 	return 0;
9238 
9239 nla_put_failure:
9240 	nlmsg_trim(skb, nlh);
9241 	return -EMSGSIZE;
9242 }
9243 
nft_flowtable_event(unsigned long event,struct net_device * dev,struct nft_flowtable * flowtable)9244 static void nft_flowtable_event(unsigned long event, struct net_device *dev,
9245 				struct nft_flowtable *flowtable)
9246 {
9247 	struct nft_hook *hook;
9248 
9249 	list_for_each_entry(hook, &flowtable->hook_list, list) {
9250 		if (hook->ops.dev != dev)
9251 			continue;
9252 
9253 		/* flow_offload_netdev_event() cleans up entries for us. */
9254 		nft_unregister_flowtable_hook(dev_net(dev), flowtable, hook);
9255 		list_del_rcu(&hook->list);
9256 		kfree_rcu(hook, rcu);
9257 		break;
9258 	}
9259 }
9260 
nf_tables_flowtable_event(struct notifier_block * this,unsigned long event,void * ptr)9261 static int nf_tables_flowtable_event(struct notifier_block *this,
9262 				     unsigned long event, void *ptr)
9263 {
9264 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
9265 	struct nft_flowtable *flowtable;
9266 	struct nftables_pernet *nft_net;
9267 	struct nft_table *table;
9268 	struct net *net;
9269 
9270 	if (event != NETDEV_UNREGISTER)
9271 		return 0;
9272 
9273 	net = dev_net(dev);
9274 	nft_net = nft_pernet(net);
9275 	mutex_lock(&nft_net->commit_mutex);
9276 	list_for_each_entry(table, &nft_net->tables, list) {
9277 		list_for_each_entry(flowtable, &table->flowtables, list) {
9278 			nft_flowtable_event(event, dev, flowtable);
9279 		}
9280 	}
9281 	mutex_unlock(&nft_net->commit_mutex);
9282 
9283 	return NOTIFY_DONE;
9284 }
9285 
9286 static struct notifier_block nf_tables_flowtable_notifier = {
9287 	.notifier_call	= nf_tables_flowtable_event,
9288 };
9289 
nf_tables_gen_notify(struct net * net,struct sk_buff * skb,int event)9290 static void nf_tables_gen_notify(struct net *net, struct sk_buff *skb,
9291 				 int event)
9292 {
9293 	struct nlmsghdr *nlh = nlmsg_hdr(skb);
9294 	struct sk_buff *skb2;
9295 	int err;
9296 
9297 	if (!nlmsg_report(nlh) &&
9298 	    !nfnetlink_has_listeners(net, NFNLGRP_NFTABLES))
9299 		return;
9300 
9301 	skb2 = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
9302 	if (skb2 == NULL)
9303 		goto err;
9304 
9305 	err = nf_tables_fill_gen_info(skb2, net, NETLINK_CB(skb).portid,
9306 				      nlh->nlmsg_seq);
9307 	if (err < 0) {
9308 		kfree_skb(skb2);
9309 		goto err;
9310 	}
9311 
9312 	nfnetlink_send(skb2, net, NETLINK_CB(skb).portid, NFNLGRP_NFTABLES,
9313 		       nlmsg_report(nlh), GFP_KERNEL);
9314 	return;
9315 err:
9316 	nfnetlink_set_err(net, NETLINK_CB(skb).portid, NFNLGRP_NFTABLES,
9317 			  -ENOBUFS);
9318 }
9319 
nf_tables_getgen(struct sk_buff * skb,const struct nfnl_info * info,const struct nlattr * const nla[])9320 static int nf_tables_getgen(struct sk_buff *skb, const struct nfnl_info *info,
9321 			    const struct nlattr * const nla[])
9322 {
9323 	struct sk_buff *skb2;
9324 	int err;
9325 
9326 	skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_ATOMIC);
9327 	if (skb2 == NULL)
9328 		return -ENOMEM;
9329 
9330 	err = nf_tables_fill_gen_info(skb2, info->net, NETLINK_CB(skb).portid,
9331 				      info->nlh->nlmsg_seq);
9332 	if (err < 0)
9333 		goto err_fill_gen_info;
9334 
9335 	return nfnetlink_unicast(skb2, info->net, NETLINK_CB(skb).portid);
9336 
9337 err_fill_gen_info:
9338 	kfree_skb(skb2);
9339 	return err;
9340 }
9341 
9342 static const struct nfnl_callback nf_tables_cb[NFT_MSG_MAX] = {
9343 	[NFT_MSG_NEWTABLE] = {
9344 		.call		= nf_tables_newtable,
9345 		.type		= NFNL_CB_BATCH,
9346 		.attr_count	= NFTA_TABLE_MAX,
9347 		.policy		= nft_table_policy,
9348 	},
9349 	[NFT_MSG_GETTABLE] = {
9350 		.call		= nf_tables_gettable,
9351 		.type		= NFNL_CB_RCU,
9352 		.attr_count	= NFTA_TABLE_MAX,
9353 		.policy		= nft_table_policy,
9354 	},
9355 	[NFT_MSG_DELTABLE] = {
9356 		.call		= nf_tables_deltable,
9357 		.type		= NFNL_CB_BATCH,
9358 		.attr_count	= NFTA_TABLE_MAX,
9359 		.policy		= nft_table_policy,
9360 	},
9361 	[NFT_MSG_DESTROYTABLE] = {
9362 		.call		= nf_tables_deltable,
9363 		.type		= NFNL_CB_BATCH,
9364 		.attr_count	= NFTA_TABLE_MAX,
9365 		.policy		= nft_table_policy,
9366 	},
9367 	[NFT_MSG_NEWCHAIN] = {
9368 		.call		= nf_tables_newchain,
9369 		.type		= NFNL_CB_BATCH,
9370 		.attr_count	= NFTA_CHAIN_MAX,
9371 		.policy		= nft_chain_policy,
9372 	},
9373 	[NFT_MSG_GETCHAIN] = {
9374 		.call		= nf_tables_getchain,
9375 		.type		= NFNL_CB_RCU,
9376 		.attr_count	= NFTA_CHAIN_MAX,
9377 		.policy		= nft_chain_policy,
9378 	},
9379 	[NFT_MSG_DELCHAIN] = {
9380 		.call		= nf_tables_delchain,
9381 		.type		= NFNL_CB_BATCH,
9382 		.attr_count	= NFTA_CHAIN_MAX,
9383 		.policy		= nft_chain_policy,
9384 	},
9385 	[NFT_MSG_DESTROYCHAIN] = {
9386 		.call		= nf_tables_delchain,
9387 		.type		= NFNL_CB_BATCH,
9388 		.attr_count	= NFTA_CHAIN_MAX,
9389 		.policy		= nft_chain_policy,
9390 	},
9391 	[NFT_MSG_NEWRULE] = {
9392 		.call		= nf_tables_newrule,
9393 		.type		= NFNL_CB_BATCH,
9394 		.attr_count	= NFTA_RULE_MAX,
9395 		.policy		= nft_rule_policy,
9396 	},
9397 	[NFT_MSG_GETRULE] = {
9398 		.call		= nf_tables_getrule,
9399 		.type		= NFNL_CB_RCU,
9400 		.attr_count	= NFTA_RULE_MAX,
9401 		.policy		= nft_rule_policy,
9402 	},
9403 	[NFT_MSG_GETRULE_RESET] = {
9404 		.call		= nf_tables_getrule_reset,
9405 		.type		= NFNL_CB_RCU,
9406 		.attr_count	= NFTA_RULE_MAX,
9407 		.policy		= nft_rule_policy,
9408 	},
9409 	[NFT_MSG_DELRULE] = {
9410 		.call		= nf_tables_delrule,
9411 		.type		= NFNL_CB_BATCH,
9412 		.attr_count	= NFTA_RULE_MAX,
9413 		.policy		= nft_rule_policy,
9414 	},
9415 	[NFT_MSG_DESTROYRULE] = {
9416 		.call		= nf_tables_delrule,
9417 		.type		= NFNL_CB_BATCH,
9418 		.attr_count	= NFTA_RULE_MAX,
9419 		.policy		= nft_rule_policy,
9420 	},
9421 	[NFT_MSG_NEWSET] = {
9422 		.call		= nf_tables_newset,
9423 		.type		= NFNL_CB_BATCH,
9424 		.attr_count	= NFTA_SET_MAX,
9425 		.policy		= nft_set_policy,
9426 	},
9427 	[NFT_MSG_GETSET] = {
9428 		.call		= nf_tables_getset,
9429 		.type		= NFNL_CB_RCU,
9430 		.attr_count	= NFTA_SET_MAX,
9431 		.policy		= nft_set_policy,
9432 	},
9433 	[NFT_MSG_DELSET] = {
9434 		.call		= nf_tables_delset,
9435 		.type		= NFNL_CB_BATCH,
9436 		.attr_count	= NFTA_SET_MAX,
9437 		.policy		= nft_set_policy,
9438 	},
9439 	[NFT_MSG_DESTROYSET] = {
9440 		.call		= nf_tables_delset,
9441 		.type		= NFNL_CB_BATCH,
9442 		.attr_count	= NFTA_SET_MAX,
9443 		.policy		= nft_set_policy,
9444 	},
9445 	[NFT_MSG_NEWSETELEM] = {
9446 		.call		= nf_tables_newsetelem,
9447 		.type		= NFNL_CB_BATCH,
9448 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
9449 		.policy		= nft_set_elem_list_policy,
9450 	},
9451 	[NFT_MSG_GETSETELEM] = {
9452 		.call		= nf_tables_getsetelem,
9453 		.type		= NFNL_CB_RCU,
9454 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
9455 		.policy		= nft_set_elem_list_policy,
9456 	},
9457 	[NFT_MSG_GETSETELEM_RESET] = {
9458 		.call		= nf_tables_getsetelem_reset,
9459 		.type		= NFNL_CB_RCU,
9460 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
9461 		.policy		= nft_set_elem_list_policy,
9462 	},
9463 	[NFT_MSG_DELSETELEM] = {
9464 		.call		= nf_tables_delsetelem,
9465 		.type		= NFNL_CB_BATCH,
9466 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
9467 		.policy		= nft_set_elem_list_policy,
9468 	},
9469 	[NFT_MSG_DESTROYSETELEM] = {
9470 		.call		= nf_tables_delsetelem,
9471 		.type		= NFNL_CB_BATCH,
9472 		.attr_count	= NFTA_SET_ELEM_LIST_MAX,
9473 		.policy		= nft_set_elem_list_policy,
9474 	},
9475 	[NFT_MSG_GETGEN] = {
9476 		.call		= nf_tables_getgen,
9477 		.type		= NFNL_CB_RCU,
9478 	},
9479 	[NFT_MSG_NEWOBJ] = {
9480 		.call		= nf_tables_newobj,
9481 		.type		= NFNL_CB_BATCH,
9482 		.attr_count	= NFTA_OBJ_MAX,
9483 		.policy		= nft_obj_policy,
9484 	},
9485 	[NFT_MSG_GETOBJ] = {
9486 		.call		= nf_tables_getobj,
9487 		.type		= NFNL_CB_RCU,
9488 		.attr_count	= NFTA_OBJ_MAX,
9489 		.policy		= nft_obj_policy,
9490 	},
9491 	[NFT_MSG_DELOBJ] = {
9492 		.call		= nf_tables_delobj,
9493 		.type		= NFNL_CB_BATCH,
9494 		.attr_count	= NFTA_OBJ_MAX,
9495 		.policy		= nft_obj_policy,
9496 	},
9497 	[NFT_MSG_DESTROYOBJ] = {
9498 		.call		= nf_tables_delobj,
9499 		.type		= NFNL_CB_BATCH,
9500 		.attr_count	= NFTA_OBJ_MAX,
9501 		.policy		= nft_obj_policy,
9502 	},
9503 	[NFT_MSG_GETOBJ_RESET] = {
9504 		.call		= nf_tables_getobj_reset,
9505 		.type		= NFNL_CB_RCU,
9506 		.attr_count	= NFTA_OBJ_MAX,
9507 		.policy		= nft_obj_policy,
9508 	},
9509 	[NFT_MSG_NEWFLOWTABLE] = {
9510 		.call		= nf_tables_newflowtable,
9511 		.type		= NFNL_CB_BATCH,
9512 		.attr_count	= NFTA_FLOWTABLE_MAX,
9513 		.policy		= nft_flowtable_policy,
9514 	},
9515 	[NFT_MSG_GETFLOWTABLE] = {
9516 		.call		= nf_tables_getflowtable,
9517 		.type		= NFNL_CB_RCU,
9518 		.attr_count	= NFTA_FLOWTABLE_MAX,
9519 		.policy		= nft_flowtable_policy,
9520 	},
9521 	[NFT_MSG_DELFLOWTABLE] = {
9522 		.call		= nf_tables_delflowtable,
9523 		.type		= NFNL_CB_BATCH,
9524 		.attr_count	= NFTA_FLOWTABLE_MAX,
9525 		.policy		= nft_flowtable_policy,
9526 	},
9527 	[NFT_MSG_DESTROYFLOWTABLE] = {
9528 		.call		= nf_tables_delflowtable,
9529 		.type		= NFNL_CB_BATCH,
9530 		.attr_count	= NFTA_FLOWTABLE_MAX,
9531 		.policy		= nft_flowtable_policy,
9532 	},
9533 };
9534 
nf_tables_validate(struct net * net)9535 static int nf_tables_validate(struct net *net)
9536 {
9537 	struct nftables_pernet *nft_net = nft_pernet(net);
9538 	struct nft_table *table;
9539 
9540 	list_for_each_entry(table, &nft_net->tables, list) {
9541 		switch (table->validate_state) {
9542 		case NFT_VALIDATE_SKIP:
9543 			continue;
9544 		case NFT_VALIDATE_NEED:
9545 			nft_validate_state_update(table, NFT_VALIDATE_DO);
9546 			fallthrough;
9547 		case NFT_VALIDATE_DO:
9548 			if (nft_table_validate(net, table) < 0)
9549 				return -EAGAIN;
9550 
9551 			nft_validate_state_update(table, NFT_VALIDATE_SKIP);
9552 			break;
9553 		}
9554 	}
9555 
9556 	return 0;
9557 }
9558 
9559 /* a drop policy has to be deferred until all rules have been activated,
9560  * otherwise a large ruleset that contains a drop-policy base chain will
9561  * cause all packets to get dropped until the full transaction has been
9562  * processed.
9563  *
9564  * We defer the drop policy until the transaction has been finalized.
9565  */
nft_chain_commit_drop_policy(struct nft_trans_chain * trans)9566 static void nft_chain_commit_drop_policy(struct nft_trans_chain *trans)
9567 {
9568 	struct nft_base_chain *basechain;
9569 
9570 	if (trans->policy != NF_DROP)
9571 		return;
9572 
9573 	if (!nft_is_base_chain(trans->chain))
9574 		return;
9575 
9576 	basechain = nft_base_chain(trans->chain);
9577 	basechain->policy = NF_DROP;
9578 }
9579 
nft_chain_commit_update(struct nft_trans_chain * trans)9580 static void nft_chain_commit_update(struct nft_trans_chain *trans)
9581 {
9582 	struct nft_table *table = trans->nft_trans_binding.nft_trans.table;
9583 	struct nft_base_chain *basechain;
9584 
9585 	if (trans->name) {
9586 		rhltable_remove(&table->chains_ht,
9587 				&trans->chain->rhlhead,
9588 				nft_chain_ht_params);
9589 		swap(trans->chain->name, trans->name);
9590 		rhltable_insert_key(&table->chains_ht,
9591 				    trans->chain->name,
9592 				    &trans->chain->rhlhead,
9593 				    nft_chain_ht_params);
9594 	}
9595 
9596 	if (!nft_is_base_chain(trans->chain))
9597 		return;
9598 
9599 	nft_chain_stats_replace(trans);
9600 
9601 	basechain = nft_base_chain(trans->chain);
9602 
9603 	switch (trans->policy) {
9604 	case NF_DROP:
9605 	case NF_ACCEPT:
9606 		basechain->policy = trans->policy;
9607 		break;
9608 	}
9609 }
9610 
nft_obj_commit_update(const struct nft_ctx * ctx,struct nft_trans * trans)9611 static void nft_obj_commit_update(const struct nft_ctx *ctx,
9612 				  struct nft_trans *trans)
9613 {
9614 	struct nft_object *newobj;
9615 	struct nft_object *obj;
9616 
9617 	obj = nft_trans_obj(trans);
9618 	newobj = nft_trans_obj_newobj(trans);
9619 
9620 	if (WARN_ON_ONCE(!obj->ops->update))
9621 		return;
9622 
9623 	obj->ops->update(obj, newobj);
9624 	nft_obj_destroy(ctx, newobj);
9625 }
9626 
nft_commit_release(struct nft_trans * trans)9627 static void nft_commit_release(struct nft_trans *trans)
9628 {
9629 	struct nft_ctx ctx = {
9630 		.net = trans->net,
9631 	};
9632 
9633 	nft_ctx_update(&ctx, trans);
9634 
9635 	switch (trans->msg_type) {
9636 	case NFT_MSG_DELTABLE:
9637 	case NFT_MSG_DESTROYTABLE:
9638 		nf_tables_table_destroy(trans->table);
9639 		break;
9640 	case NFT_MSG_NEWCHAIN:
9641 		free_percpu(nft_trans_chain_stats(trans));
9642 		kfree(nft_trans_chain_name(trans));
9643 		break;
9644 	case NFT_MSG_DELCHAIN:
9645 	case NFT_MSG_DESTROYCHAIN:
9646 		if (nft_trans_chain_update(trans))
9647 			nft_hooks_destroy(&nft_trans_chain_hooks(trans));
9648 		else
9649 			nf_tables_chain_destroy(nft_trans_chain(trans));
9650 		break;
9651 	case NFT_MSG_DELRULE:
9652 	case NFT_MSG_DESTROYRULE:
9653 		nf_tables_rule_destroy(&ctx, nft_trans_rule(trans));
9654 		break;
9655 	case NFT_MSG_DELSET:
9656 	case NFT_MSG_DESTROYSET:
9657 		nft_set_destroy(&ctx, nft_trans_set(trans));
9658 		break;
9659 	case NFT_MSG_DELSETELEM:
9660 	case NFT_MSG_DESTROYSETELEM:
9661 		nf_tables_set_elem_destroy(&ctx,
9662 					   nft_trans_elem_set(trans),
9663 					   nft_trans_elem_priv(trans));
9664 		break;
9665 	case NFT_MSG_DELOBJ:
9666 	case NFT_MSG_DESTROYOBJ:
9667 		nft_obj_destroy(&ctx, nft_trans_obj(trans));
9668 		break;
9669 	case NFT_MSG_DELFLOWTABLE:
9670 	case NFT_MSG_DESTROYFLOWTABLE:
9671 		if (nft_trans_flowtable_update(trans))
9672 			nft_hooks_destroy(&nft_trans_flowtable_hooks(trans));
9673 		else
9674 			nf_tables_flowtable_destroy(nft_trans_flowtable(trans));
9675 		break;
9676 	}
9677 
9678 	if (trans->put_net)
9679 		put_net(trans->net);
9680 
9681 	kfree(trans);
9682 }
9683 
nf_tables_trans_destroy_work(struct work_struct * w)9684 static void nf_tables_trans_destroy_work(struct work_struct *w)
9685 {
9686 	struct nft_trans *trans, *next;
9687 	LIST_HEAD(head);
9688 
9689 	spin_lock(&nf_tables_destroy_list_lock);
9690 	list_splice_init(&nf_tables_destroy_list, &head);
9691 	spin_unlock(&nf_tables_destroy_list_lock);
9692 
9693 	if (list_empty(&head))
9694 		return;
9695 
9696 	synchronize_rcu();
9697 
9698 	list_for_each_entry_safe(trans, next, &head, list) {
9699 		nft_trans_list_del(trans);
9700 		nft_commit_release(trans);
9701 	}
9702 }
9703 
nf_tables_trans_destroy_flush_work(void)9704 void nf_tables_trans_destroy_flush_work(void)
9705 {
9706 	flush_work(&trans_destroy_work);
9707 }
9708 EXPORT_SYMBOL_GPL(nf_tables_trans_destroy_flush_work);
9709 
nft_expr_reduce(struct nft_regs_track * track,const struct nft_expr * expr)9710 static bool nft_expr_reduce(struct nft_regs_track *track,
9711 			    const struct nft_expr *expr)
9712 {
9713 	return false;
9714 }
9715 
nf_tables_commit_chain_prepare(struct net * net,struct nft_chain * chain)9716 static int nf_tables_commit_chain_prepare(struct net *net, struct nft_chain *chain)
9717 {
9718 	const struct nft_expr *expr, *last;
9719 	struct nft_regs_track track = {};
9720 	unsigned int size, data_size;
9721 	void *data, *data_boundary;
9722 	struct nft_rule_dp *prule;
9723 	struct nft_rule *rule;
9724 
9725 	/* already handled or inactive chain? */
9726 	if (chain->blob_next || !nft_is_active_next(net, chain))
9727 		return 0;
9728 
9729 	data_size = 0;
9730 	list_for_each_entry(rule, &chain->rules, list) {
9731 		if (nft_is_active_next(net, rule)) {
9732 			data_size += sizeof(*prule) + rule->dlen;
9733 			if (data_size > INT_MAX)
9734 				return -ENOMEM;
9735 		}
9736 	}
9737 
9738 	chain->blob_next = nf_tables_chain_alloc_rules(chain, data_size);
9739 	if (!chain->blob_next)
9740 		return -ENOMEM;
9741 
9742 	data = (void *)chain->blob_next->data;
9743 	data_boundary = data + data_size;
9744 	size = 0;
9745 
9746 	list_for_each_entry(rule, &chain->rules, list) {
9747 		if (!nft_is_active_next(net, rule))
9748 			continue;
9749 
9750 		prule = (struct nft_rule_dp *)data;
9751 		data += offsetof(struct nft_rule_dp, data);
9752 		if (WARN_ON_ONCE(data > data_boundary))
9753 			return -ENOMEM;
9754 
9755 		size = 0;
9756 		track.last = nft_expr_last(rule);
9757 		nft_rule_for_each_expr(expr, last, rule) {
9758 			track.cur = expr;
9759 
9760 			if (nft_expr_reduce(&track, expr)) {
9761 				expr = track.cur;
9762 				continue;
9763 			}
9764 
9765 			if (WARN_ON_ONCE(data + size + expr->ops->size > data_boundary))
9766 				return -ENOMEM;
9767 
9768 			memcpy(data + size, expr, expr->ops->size);
9769 			size += expr->ops->size;
9770 		}
9771 		if (WARN_ON_ONCE(size >= 1 << 12))
9772 			return -ENOMEM;
9773 
9774 		prule->handle = rule->handle;
9775 		prule->dlen = size;
9776 		prule->is_last = 0;
9777 
9778 		data += size;
9779 		size = 0;
9780 		chain->blob_next->size += (unsigned long)(data - (void *)prule);
9781 	}
9782 
9783 	if (WARN_ON_ONCE(data > data_boundary))
9784 		return -ENOMEM;
9785 
9786 	prule = (struct nft_rule_dp *)data;
9787 	nft_last_rule(chain, prule);
9788 
9789 	return 0;
9790 }
9791 
nf_tables_commit_chain_prepare_cancel(struct net * net)9792 static void nf_tables_commit_chain_prepare_cancel(struct net *net)
9793 {
9794 	struct nftables_pernet *nft_net = nft_pernet(net);
9795 	struct nft_trans *trans, *next;
9796 
9797 	list_for_each_entry_safe(trans, next, &nft_net->commit_list, list) {
9798 		if (trans->msg_type == NFT_MSG_NEWRULE ||
9799 		    trans->msg_type == NFT_MSG_DELRULE) {
9800 			struct nft_chain *chain = nft_trans_rule_chain(trans);
9801 
9802 			kvfree(chain->blob_next);
9803 			chain->blob_next = NULL;
9804 		}
9805 	}
9806 }
9807 
__nf_tables_commit_chain_free_rules(struct rcu_head * h)9808 static void __nf_tables_commit_chain_free_rules(struct rcu_head *h)
9809 {
9810 	struct nft_rule_dp_last *l = container_of(h, struct nft_rule_dp_last, h);
9811 
9812 	kvfree(l->blob);
9813 }
9814 
nf_tables_commit_chain_free_rules_old(struct nft_rule_blob * blob)9815 static void nf_tables_commit_chain_free_rules_old(struct nft_rule_blob *blob)
9816 {
9817 	struct nft_rule_dp_last *last;
9818 
9819 	/* last rule trailer is after end marker */
9820 	last = (void *)blob + sizeof(*blob) + blob->size;
9821 	last->blob = blob;
9822 
9823 	call_rcu(&last->h, __nf_tables_commit_chain_free_rules);
9824 }
9825 
nf_tables_commit_chain(struct net * net,struct nft_chain * chain)9826 static void nf_tables_commit_chain(struct net *net, struct nft_chain *chain)
9827 {
9828 	struct nft_rule_blob *g0, *g1;
9829 	bool next_genbit;
9830 
9831 	next_genbit = nft_gencursor_next(net);
9832 
9833 	g0 = rcu_dereference_protected(chain->blob_gen_0,
9834 				       lockdep_commit_lock_is_held(net));
9835 	g1 = rcu_dereference_protected(chain->blob_gen_1,
9836 				       lockdep_commit_lock_is_held(net));
9837 
9838 	/* No changes to this chain? */
9839 	if (chain->blob_next == NULL) {
9840 		/* chain had no change in last or next generation */
9841 		if (g0 == g1)
9842 			return;
9843 		/*
9844 		 * chain had no change in this generation; make sure next
9845 		 * one uses same rules as current generation.
9846 		 */
9847 		if (next_genbit) {
9848 			rcu_assign_pointer(chain->blob_gen_1, g0);
9849 			nf_tables_commit_chain_free_rules_old(g1);
9850 		} else {
9851 			rcu_assign_pointer(chain->blob_gen_0, g1);
9852 			nf_tables_commit_chain_free_rules_old(g0);
9853 		}
9854 
9855 		return;
9856 	}
9857 
9858 	if (next_genbit)
9859 		rcu_assign_pointer(chain->blob_gen_1, chain->blob_next);
9860 	else
9861 		rcu_assign_pointer(chain->blob_gen_0, chain->blob_next);
9862 
9863 	chain->blob_next = NULL;
9864 
9865 	if (g0 == g1)
9866 		return;
9867 
9868 	if (next_genbit)
9869 		nf_tables_commit_chain_free_rules_old(g1);
9870 	else
9871 		nf_tables_commit_chain_free_rules_old(g0);
9872 }
9873 
nft_obj_del(struct nft_object * obj)9874 static void nft_obj_del(struct nft_object *obj)
9875 {
9876 	rhltable_remove(&nft_objname_ht, &obj->rhlhead, nft_objname_ht_params);
9877 	list_del_rcu(&obj->list);
9878 }
9879 
nft_chain_del(struct nft_chain * chain)9880 void nft_chain_del(struct nft_chain *chain)
9881 {
9882 	struct nft_table *table = chain->table;
9883 
9884 	WARN_ON_ONCE(rhltable_remove(&table->chains_ht, &chain->rhlhead,
9885 				     nft_chain_ht_params));
9886 	list_del_rcu(&chain->list);
9887 }
9888 
nft_trans_gc_setelem_remove(struct nft_ctx * ctx,struct nft_trans_gc * trans)9889 static void nft_trans_gc_setelem_remove(struct nft_ctx *ctx,
9890 					struct nft_trans_gc *trans)
9891 {
9892 	struct nft_elem_priv **priv = trans->priv;
9893 	unsigned int i;
9894 
9895 	for (i = 0; i < trans->count; i++) {
9896 		nft_setelem_data_deactivate(ctx->net, trans->set, priv[i]);
9897 		nft_setelem_remove(ctx->net, trans->set, priv[i]);
9898 	}
9899 }
9900 
nft_trans_gc_destroy(struct nft_trans_gc * trans)9901 void nft_trans_gc_destroy(struct nft_trans_gc *trans)
9902 {
9903 	nft_set_put(trans->set);
9904 	put_net(trans->net);
9905 	kfree(trans);
9906 }
9907 
nft_trans_gc_trans_free(struct rcu_head * rcu)9908 static void nft_trans_gc_trans_free(struct rcu_head *rcu)
9909 {
9910 	struct nft_elem_priv *elem_priv;
9911 	struct nft_trans_gc *trans;
9912 	struct nft_ctx ctx = {};
9913 	unsigned int i;
9914 
9915 	trans = container_of(rcu, struct nft_trans_gc, rcu);
9916 	ctx.net	= read_pnet(&trans->set->net);
9917 
9918 	for (i = 0; i < trans->count; i++) {
9919 		elem_priv = trans->priv[i];
9920 		if (!nft_setelem_is_catchall(trans->set, elem_priv))
9921 			atomic_dec(&trans->set->nelems);
9922 
9923 		nf_tables_set_elem_destroy(&ctx, trans->set, elem_priv);
9924 	}
9925 
9926 	nft_trans_gc_destroy(trans);
9927 }
9928 
nft_trans_gc_work_done(struct nft_trans_gc * trans)9929 static bool nft_trans_gc_work_done(struct nft_trans_gc *trans)
9930 {
9931 	struct nftables_pernet *nft_net;
9932 	struct nft_ctx ctx = {};
9933 
9934 	nft_net = nft_pernet(trans->net);
9935 
9936 	mutex_lock(&nft_net->commit_mutex);
9937 
9938 	/* Check for race with transaction, otherwise this batch refers to
9939 	 * stale objects that might not be there anymore. Skip transaction if
9940 	 * set has been destroyed from control plane transaction in case gc
9941 	 * worker loses race.
9942 	 */
9943 	if (READ_ONCE(nft_net->gc_seq) != trans->seq || trans->set->dead) {
9944 		mutex_unlock(&nft_net->commit_mutex);
9945 		return false;
9946 	}
9947 
9948 	ctx.net = trans->net;
9949 	ctx.table = trans->set->table;
9950 
9951 	nft_trans_gc_setelem_remove(&ctx, trans);
9952 	mutex_unlock(&nft_net->commit_mutex);
9953 
9954 	return true;
9955 }
9956 
nft_trans_gc_work(struct work_struct * work)9957 static void nft_trans_gc_work(struct work_struct *work)
9958 {
9959 	struct nft_trans_gc *trans, *next;
9960 	LIST_HEAD(trans_gc_list);
9961 
9962 	spin_lock(&nf_tables_gc_list_lock);
9963 	list_splice_init(&nf_tables_gc_list, &trans_gc_list);
9964 	spin_unlock(&nf_tables_gc_list_lock);
9965 
9966 	list_for_each_entry_safe(trans, next, &trans_gc_list, list) {
9967 		list_del(&trans->list);
9968 		if (!nft_trans_gc_work_done(trans)) {
9969 			nft_trans_gc_destroy(trans);
9970 			continue;
9971 		}
9972 		call_rcu(&trans->rcu, nft_trans_gc_trans_free);
9973 	}
9974 }
9975 
nft_trans_gc_alloc(struct nft_set * set,unsigned int gc_seq,gfp_t gfp)9976 struct nft_trans_gc *nft_trans_gc_alloc(struct nft_set *set,
9977 					unsigned int gc_seq, gfp_t gfp)
9978 {
9979 	struct net *net = read_pnet(&set->net);
9980 	struct nft_trans_gc *trans;
9981 
9982 	trans = kzalloc(sizeof(*trans), gfp);
9983 	if (!trans)
9984 		return NULL;
9985 
9986 	trans->net = maybe_get_net(net);
9987 	if (!trans->net) {
9988 		kfree(trans);
9989 		return NULL;
9990 	}
9991 
9992 	refcount_inc(&set->refs);
9993 	trans->set = set;
9994 	trans->seq = gc_seq;
9995 
9996 	return trans;
9997 }
9998 
nft_trans_gc_elem_add(struct nft_trans_gc * trans,void * priv)9999 void nft_trans_gc_elem_add(struct nft_trans_gc *trans, void *priv)
10000 {
10001 	trans->priv[trans->count++] = priv;
10002 }
10003 
nft_trans_gc_queue_work(struct nft_trans_gc * trans)10004 static void nft_trans_gc_queue_work(struct nft_trans_gc *trans)
10005 {
10006 	spin_lock(&nf_tables_gc_list_lock);
10007 	list_add_tail(&trans->list, &nf_tables_gc_list);
10008 	spin_unlock(&nf_tables_gc_list_lock);
10009 
10010 	schedule_work(&trans_gc_work);
10011 }
10012 
nft_trans_gc_space(struct nft_trans_gc * trans)10013 static int nft_trans_gc_space(struct nft_trans_gc *trans)
10014 {
10015 	return NFT_TRANS_GC_BATCHCOUNT - trans->count;
10016 }
10017 
nft_trans_gc_queue_async(struct nft_trans_gc * gc,unsigned int gc_seq,gfp_t gfp)10018 struct nft_trans_gc *nft_trans_gc_queue_async(struct nft_trans_gc *gc,
10019 					      unsigned int gc_seq, gfp_t gfp)
10020 {
10021 	struct nft_set *set;
10022 
10023 	if (nft_trans_gc_space(gc))
10024 		return gc;
10025 
10026 	set = gc->set;
10027 	nft_trans_gc_queue_work(gc);
10028 
10029 	return nft_trans_gc_alloc(set, gc_seq, gfp);
10030 }
10031 
nft_trans_gc_queue_async_done(struct nft_trans_gc * trans)10032 void nft_trans_gc_queue_async_done(struct nft_trans_gc *trans)
10033 {
10034 	if (trans->count == 0) {
10035 		nft_trans_gc_destroy(trans);
10036 		return;
10037 	}
10038 
10039 	nft_trans_gc_queue_work(trans);
10040 }
10041 
nft_trans_gc_queue_sync(struct nft_trans_gc * gc,gfp_t gfp)10042 struct nft_trans_gc *nft_trans_gc_queue_sync(struct nft_trans_gc *gc, gfp_t gfp)
10043 {
10044 	struct nft_set *set;
10045 
10046 	if (WARN_ON_ONCE(!lockdep_commit_lock_is_held(gc->net)))
10047 		return NULL;
10048 
10049 	if (nft_trans_gc_space(gc))
10050 		return gc;
10051 
10052 	set = gc->set;
10053 	call_rcu(&gc->rcu, nft_trans_gc_trans_free);
10054 
10055 	return nft_trans_gc_alloc(set, 0, gfp);
10056 }
10057 
nft_trans_gc_queue_sync_done(struct nft_trans_gc * trans)10058 void nft_trans_gc_queue_sync_done(struct nft_trans_gc *trans)
10059 {
10060 	WARN_ON_ONCE(!lockdep_commit_lock_is_held(trans->net));
10061 
10062 	if (trans->count == 0) {
10063 		nft_trans_gc_destroy(trans);
10064 		return;
10065 	}
10066 
10067 	call_rcu(&trans->rcu, nft_trans_gc_trans_free);
10068 }
10069 
nft_trans_gc_catchall_async(struct nft_trans_gc * gc,unsigned int gc_seq)10070 struct nft_trans_gc *nft_trans_gc_catchall_async(struct nft_trans_gc *gc,
10071 						 unsigned int gc_seq)
10072 {
10073 	struct nft_set_elem_catchall *catchall;
10074 	const struct nft_set *set = gc->set;
10075 	struct nft_set_ext *ext;
10076 
10077 	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
10078 		ext = nft_set_elem_ext(set, catchall->elem);
10079 
10080 		if (!nft_set_elem_expired(ext))
10081 			continue;
10082 		if (nft_set_elem_is_dead(ext))
10083 			goto dead_elem;
10084 
10085 		nft_set_elem_dead(ext);
10086 dead_elem:
10087 		gc = nft_trans_gc_queue_async(gc, gc_seq, GFP_ATOMIC);
10088 		if (!gc)
10089 			return NULL;
10090 
10091 		nft_trans_gc_elem_add(gc, catchall->elem);
10092 	}
10093 
10094 	return gc;
10095 }
10096 
nft_trans_gc_catchall_sync(struct nft_trans_gc * gc)10097 struct nft_trans_gc *nft_trans_gc_catchall_sync(struct nft_trans_gc *gc)
10098 {
10099 	struct nft_set_elem_catchall *catchall, *next;
10100 	u64 tstamp = nft_net_tstamp(gc->net);
10101 	const struct nft_set *set = gc->set;
10102 	struct nft_elem_priv *elem_priv;
10103 	struct nft_set_ext *ext;
10104 
10105 	WARN_ON_ONCE(!lockdep_commit_lock_is_held(gc->net));
10106 
10107 	list_for_each_entry_safe(catchall, next, &set->catchall_list, list) {
10108 		ext = nft_set_elem_ext(set, catchall->elem);
10109 
10110 		if (!__nft_set_elem_expired(ext, tstamp))
10111 			continue;
10112 
10113 		gc = nft_trans_gc_queue_sync(gc, GFP_KERNEL);
10114 		if (!gc)
10115 			return NULL;
10116 
10117 		elem_priv = catchall->elem;
10118 		nft_setelem_data_deactivate(gc->net, gc->set, elem_priv);
10119 		nft_setelem_catchall_destroy(catchall);
10120 		nft_trans_gc_elem_add(gc, elem_priv);
10121 	}
10122 
10123 	return gc;
10124 }
10125 
nf_tables_module_autoload_cleanup(struct net * net)10126 static void nf_tables_module_autoload_cleanup(struct net *net)
10127 {
10128 	struct nftables_pernet *nft_net = nft_pernet(net);
10129 	struct nft_module_request *req, *next;
10130 
10131 	WARN_ON_ONCE(!list_empty(&nft_net->commit_list));
10132 	list_for_each_entry_safe(req, next, &nft_net->module_list, list) {
10133 		WARN_ON_ONCE(!req->done);
10134 		list_del(&req->list);
10135 		kfree(req);
10136 	}
10137 }
10138 
nf_tables_commit_release(struct net * net)10139 static void nf_tables_commit_release(struct net *net)
10140 {
10141 	struct nftables_pernet *nft_net = nft_pernet(net);
10142 	struct nft_trans *trans;
10143 
10144 	/* all side effects have to be made visible.
10145 	 * For example, if a chain named 'foo' has been deleted, a
10146 	 * new transaction must not find it anymore.
10147 	 *
10148 	 * Memory reclaim happens asynchronously from work queue
10149 	 * to prevent expensive synchronize_rcu() in commit phase.
10150 	 */
10151 	if (list_empty(&nft_net->commit_list)) {
10152 		nf_tables_module_autoload_cleanup(net);
10153 		mutex_unlock(&nft_net->commit_mutex);
10154 		return;
10155 	}
10156 
10157 	trans = list_last_entry(&nft_net->commit_list,
10158 				struct nft_trans, list);
10159 	get_net(trans->net);
10160 	WARN_ON_ONCE(trans->put_net);
10161 
10162 	trans->put_net = true;
10163 	spin_lock(&nf_tables_destroy_list_lock);
10164 	list_splice_tail_init(&nft_net->commit_list, &nf_tables_destroy_list);
10165 	spin_unlock(&nf_tables_destroy_list_lock);
10166 
10167 	nf_tables_module_autoload_cleanup(net);
10168 	schedule_work(&trans_destroy_work);
10169 
10170 	mutex_unlock(&nft_net->commit_mutex);
10171 }
10172 
nft_commit_notify(struct net * net,u32 portid)10173 static void nft_commit_notify(struct net *net, u32 portid)
10174 {
10175 	struct nftables_pernet *nft_net = nft_pernet(net);
10176 	struct sk_buff *batch_skb = NULL, *nskb, *skb;
10177 	unsigned char *data;
10178 	int len;
10179 
10180 	list_for_each_entry_safe(skb, nskb, &nft_net->notify_list, list) {
10181 		if (!batch_skb) {
10182 new_batch:
10183 			batch_skb = skb;
10184 			len = NLMSG_GOODSIZE - skb->len;
10185 			list_del(&skb->list);
10186 			continue;
10187 		}
10188 		len -= skb->len;
10189 		if (len > 0 && NFT_CB(skb).report == NFT_CB(batch_skb).report) {
10190 			data = skb_put(batch_skb, skb->len);
10191 			memcpy(data, skb->data, skb->len);
10192 			list_del(&skb->list);
10193 			kfree_skb(skb);
10194 			continue;
10195 		}
10196 		nfnetlink_send(batch_skb, net, portid, NFNLGRP_NFTABLES,
10197 			       NFT_CB(batch_skb).report, GFP_KERNEL);
10198 		goto new_batch;
10199 	}
10200 
10201 	if (batch_skb) {
10202 		nfnetlink_send(batch_skb, net, portid, NFNLGRP_NFTABLES,
10203 			       NFT_CB(batch_skb).report, GFP_KERNEL);
10204 	}
10205 
10206 	WARN_ON_ONCE(!list_empty(&nft_net->notify_list));
10207 }
10208 
nf_tables_commit_audit_alloc(struct list_head * adl,struct nft_table * table)10209 static int nf_tables_commit_audit_alloc(struct list_head *adl,
10210 					struct nft_table *table)
10211 {
10212 	struct nft_audit_data *adp;
10213 
10214 	list_for_each_entry(adp, adl, list) {
10215 		if (adp->table == table)
10216 			return 0;
10217 	}
10218 	adp = kzalloc(sizeof(*adp), GFP_KERNEL);
10219 	if (!adp)
10220 		return -ENOMEM;
10221 	adp->table = table;
10222 	list_add(&adp->list, adl);
10223 	return 0;
10224 }
10225 
nf_tables_commit_audit_free(struct list_head * adl)10226 static void nf_tables_commit_audit_free(struct list_head *adl)
10227 {
10228 	struct nft_audit_data *adp, *adn;
10229 
10230 	list_for_each_entry_safe(adp, adn, adl, list) {
10231 		list_del(&adp->list);
10232 		kfree(adp);
10233 	}
10234 }
10235 
nf_tables_commit_audit_collect(struct list_head * adl,struct nft_table * table,u32 op)10236 static void nf_tables_commit_audit_collect(struct list_head *adl,
10237 					   struct nft_table *table, u32 op)
10238 {
10239 	struct nft_audit_data *adp;
10240 
10241 	list_for_each_entry(adp, adl, list) {
10242 		if (adp->table == table)
10243 			goto found;
10244 	}
10245 	WARN_ONCE(1, "table=%s not expected in commit list", table->name);
10246 	return;
10247 found:
10248 	adp->entries++;
10249 	if (!adp->op || adp->op > op)
10250 		adp->op = op;
10251 }
10252 
10253 #define AUNFTABLENAMELEN (NFT_TABLE_MAXNAMELEN + 22)
10254 
nf_tables_commit_audit_log(struct list_head * adl,u32 generation)10255 static void nf_tables_commit_audit_log(struct list_head *adl, u32 generation)
10256 {
10257 	struct nft_audit_data *adp, *adn;
10258 	char aubuf[AUNFTABLENAMELEN];
10259 
10260 	list_for_each_entry_safe(adp, adn, adl, list) {
10261 		snprintf(aubuf, AUNFTABLENAMELEN, "%s:%u", adp->table->name,
10262 			 generation);
10263 		audit_log_nfcfg(aubuf, adp->table->family, adp->entries,
10264 				nft2audit_op[adp->op], GFP_KERNEL);
10265 		list_del(&adp->list);
10266 		kfree(adp);
10267 	}
10268 }
10269 
nft_set_commit_update(struct list_head * set_update_list)10270 static void nft_set_commit_update(struct list_head *set_update_list)
10271 {
10272 	struct nft_set *set, *next;
10273 
10274 	list_for_each_entry_safe(set, next, set_update_list, pending_update) {
10275 		list_del_init(&set->pending_update);
10276 
10277 		if (!set->ops->commit || set->dead)
10278 			continue;
10279 
10280 		set->ops->commit(set);
10281 	}
10282 }
10283 
nft_gc_seq_begin(struct nftables_pernet * nft_net)10284 static unsigned int nft_gc_seq_begin(struct nftables_pernet *nft_net)
10285 {
10286 	unsigned int gc_seq;
10287 
10288 	/* Bump gc counter, it becomes odd, this is the busy mark. */
10289 	gc_seq = READ_ONCE(nft_net->gc_seq);
10290 	WRITE_ONCE(nft_net->gc_seq, ++gc_seq);
10291 
10292 	return gc_seq;
10293 }
10294 
nft_gc_seq_end(struct nftables_pernet * nft_net,unsigned int gc_seq)10295 static void nft_gc_seq_end(struct nftables_pernet *nft_net, unsigned int gc_seq)
10296 {
10297 	WRITE_ONCE(nft_net->gc_seq, ++gc_seq);
10298 }
10299 
nf_tables_commit(struct net * net,struct sk_buff * skb)10300 static int nf_tables_commit(struct net *net, struct sk_buff *skb)
10301 {
10302 	struct nftables_pernet *nft_net = nft_pernet(net);
10303 	const struct nlmsghdr *nlh = nlmsg_hdr(skb);
10304 	struct nft_trans_binding *trans_binding;
10305 	struct nft_trans *trans, *next;
10306 	unsigned int base_seq, gc_seq;
10307 	LIST_HEAD(set_update_list);
10308 	struct nft_trans_elem *te;
10309 	struct nft_chain *chain;
10310 	struct nft_table *table;
10311 	struct nft_ctx ctx;
10312 	LIST_HEAD(adl);
10313 	int err;
10314 
10315 	if (list_empty(&nft_net->commit_list)) {
10316 		mutex_unlock(&nft_net->commit_mutex);
10317 		return 0;
10318 	}
10319 
10320 	nft_ctx_init(&ctx, net, skb, nlh, NFPROTO_UNSPEC, NULL, NULL, NULL);
10321 
10322 	list_for_each_entry(trans_binding, &nft_net->binding_list, binding_list) {
10323 		trans = &trans_binding->nft_trans;
10324 		switch (trans->msg_type) {
10325 		case NFT_MSG_NEWSET:
10326 			if (!nft_trans_set_update(trans) &&
10327 			    nft_set_is_anonymous(nft_trans_set(trans)) &&
10328 			    !nft_trans_set_bound(trans)) {
10329 				pr_warn_once("nftables ruleset with unbound set\n");
10330 				return -EINVAL;
10331 			}
10332 			break;
10333 		case NFT_MSG_NEWCHAIN:
10334 			if (!nft_trans_chain_update(trans) &&
10335 			    nft_chain_binding(nft_trans_chain(trans)) &&
10336 			    !nft_trans_chain_bound(trans)) {
10337 				pr_warn_once("nftables ruleset with unbound chain\n");
10338 				return -EINVAL;
10339 			}
10340 			break;
10341 		default:
10342 			WARN_ONCE(1, "Unhandled bind type %d", trans->msg_type);
10343 			break;
10344 		}
10345 	}
10346 
10347 	/* 0. Validate ruleset, otherwise roll back for error reporting. */
10348 	if (nf_tables_validate(net) < 0) {
10349 		nft_net->validate_state = NFT_VALIDATE_DO;
10350 		return -EAGAIN;
10351 	}
10352 
10353 	err = nft_flow_rule_offload_commit(net);
10354 	if (err < 0)
10355 		return err;
10356 
10357 	/* 1.  Allocate space for next generation rules_gen_X[] */
10358 	list_for_each_entry_safe(trans, next, &nft_net->commit_list, list) {
10359 		struct nft_table *table = trans->table;
10360 		int ret;
10361 
10362 		ret = nf_tables_commit_audit_alloc(&adl, table);
10363 		if (ret) {
10364 			nf_tables_commit_chain_prepare_cancel(net);
10365 			nf_tables_commit_audit_free(&adl);
10366 			return ret;
10367 		}
10368 		if (trans->msg_type == NFT_MSG_NEWRULE ||
10369 		    trans->msg_type == NFT_MSG_DELRULE) {
10370 			chain = nft_trans_rule_chain(trans);
10371 
10372 			ret = nf_tables_commit_chain_prepare(net, chain);
10373 			if (ret < 0) {
10374 				nf_tables_commit_chain_prepare_cancel(net);
10375 				nf_tables_commit_audit_free(&adl);
10376 				return ret;
10377 			}
10378 		}
10379 	}
10380 
10381 	/* step 2.  Make rules_gen_X visible to packet path */
10382 	list_for_each_entry(table, &nft_net->tables, list) {
10383 		list_for_each_entry(chain, &table->chains, list)
10384 			nf_tables_commit_chain(net, chain);
10385 	}
10386 
10387 	/*
10388 	 * Bump generation counter, invalidate any dump in progress.
10389 	 * Cannot fail after this point.
10390 	 */
10391 	base_seq = READ_ONCE(nft_net->base_seq);
10392 	while (++base_seq == 0)
10393 		;
10394 
10395 	WRITE_ONCE(nft_net->base_seq, base_seq);
10396 
10397 	gc_seq = nft_gc_seq_begin(nft_net);
10398 
10399 	/* step 3. Start new generation, rules_gen_X now in use. */
10400 	net->nft.gencursor = nft_gencursor_next(net);
10401 
10402 	list_for_each_entry_safe(trans, next, &nft_net->commit_list, list) {
10403 		struct nft_table *table = trans->table;
10404 
10405 		nft_ctx_update(&ctx, trans);
10406 
10407 		nf_tables_commit_audit_collect(&adl, table, trans->msg_type);
10408 		switch (trans->msg_type) {
10409 		case NFT_MSG_NEWTABLE:
10410 			if (nft_trans_table_update(trans)) {
10411 				if (!(table->flags & __NFT_TABLE_F_UPDATE)) {
10412 					nft_trans_destroy(trans);
10413 					break;
10414 				}
10415 				if (table->flags & NFT_TABLE_F_DORMANT)
10416 					nf_tables_table_disable(net, table);
10417 
10418 				table->flags &= ~__NFT_TABLE_F_UPDATE;
10419 			} else {
10420 				nft_clear(net, table);
10421 			}
10422 			nf_tables_table_notify(&ctx, NFT_MSG_NEWTABLE);
10423 			nft_trans_destroy(trans);
10424 			break;
10425 		case NFT_MSG_DELTABLE:
10426 		case NFT_MSG_DESTROYTABLE:
10427 			list_del_rcu(&table->list);
10428 			nf_tables_table_notify(&ctx, trans->msg_type);
10429 			break;
10430 		case NFT_MSG_NEWCHAIN:
10431 			if (nft_trans_chain_update(trans)) {
10432 				nft_chain_commit_update(nft_trans_container_chain(trans));
10433 				nf_tables_chain_notify(&ctx, NFT_MSG_NEWCHAIN,
10434 						       &nft_trans_chain_hooks(trans));
10435 				list_splice(&nft_trans_chain_hooks(trans),
10436 					    &nft_trans_basechain(trans)->hook_list);
10437 				/* trans destroyed after rcu grace period */
10438 			} else {
10439 				nft_chain_commit_drop_policy(nft_trans_container_chain(trans));
10440 				nft_clear(net, nft_trans_chain(trans));
10441 				nf_tables_chain_notify(&ctx, NFT_MSG_NEWCHAIN, NULL);
10442 				nft_trans_destroy(trans);
10443 			}
10444 			break;
10445 		case NFT_MSG_DELCHAIN:
10446 		case NFT_MSG_DESTROYCHAIN:
10447 			if (nft_trans_chain_update(trans)) {
10448 				nf_tables_chain_notify(&ctx, NFT_MSG_DELCHAIN,
10449 						       &nft_trans_chain_hooks(trans));
10450 				if (!(table->flags & NFT_TABLE_F_DORMANT)) {
10451 					nft_netdev_unregister_hooks(net,
10452 								    &nft_trans_chain_hooks(trans),
10453 								    true);
10454 				}
10455 			} else {
10456 				nft_chain_del(nft_trans_chain(trans));
10457 				nf_tables_chain_notify(&ctx, NFT_MSG_DELCHAIN,
10458 						       NULL);
10459 				nf_tables_unregister_hook(ctx.net, ctx.table,
10460 							  nft_trans_chain(trans));
10461 			}
10462 			break;
10463 		case NFT_MSG_NEWRULE:
10464 			nft_clear(net, nft_trans_rule(trans));
10465 			nf_tables_rule_notify(&ctx, nft_trans_rule(trans),
10466 					      NFT_MSG_NEWRULE);
10467 			if (nft_trans_rule_chain(trans)->flags & NFT_CHAIN_HW_OFFLOAD)
10468 				nft_flow_rule_destroy(nft_trans_flow_rule(trans));
10469 
10470 			nft_trans_destroy(trans);
10471 			break;
10472 		case NFT_MSG_DELRULE:
10473 		case NFT_MSG_DESTROYRULE:
10474 			list_del_rcu(&nft_trans_rule(trans)->list);
10475 			nf_tables_rule_notify(&ctx, nft_trans_rule(trans),
10476 					      trans->msg_type);
10477 			nft_rule_expr_deactivate(&ctx, nft_trans_rule(trans),
10478 						 NFT_TRANS_COMMIT);
10479 
10480 			if (nft_trans_rule_chain(trans)->flags & NFT_CHAIN_HW_OFFLOAD)
10481 				nft_flow_rule_destroy(nft_trans_flow_rule(trans));
10482 			break;
10483 		case NFT_MSG_NEWSET:
10484 			list_del(&nft_trans_container_set(trans)->list_trans_newset);
10485 			if (nft_trans_set_update(trans)) {
10486 				struct nft_set *set = nft_trans_set(trans);
10487 
10488 				WRITE_ONCE(set->timeout, nft_trans_set_timeout(trans));
10489 				WRITE_ONCE(set->gc_int, nft_trans_set_gc_int(trans));
10490 
10491 				if (nft_trans_set_size(trans))
10492 					WRITE_ONCE(set->size, nft_trans_set_size(trans));
10493 			} else {
10494 				nft_clear(net, nft_trans_set(trans));
10495 				/* This avoids hitting -EBUSY when deleting the table
10496 				 * from the transaction.
10497 				 */
10498 				if (nft_set_is_anonymous(nft_trans_set(trans)) &&
10499 				    !list_empty(&nft_trans_set(trans)->bindings))
10500 					nft_use_dec(&table->use);
10501 			}
10502 			nf_tables_set_notify(&ctx, nft_trans_set(trans),
10503 					     NFT_MSG_NEWSET, GFP_KERNEL);
10504 			nft_trans_destroy(trans);
10505 			break;
10506 		case NFT_MSG_DELSET:
10507 		case NFT_MSG_DESTROYSET:
10508 			nft_trans_set(trans)->dead = 1;
10509 			list_del_rcu(&nft_trans_set(trans)->list);
10510 			nf_tables_set_notify(&ctx, nft_trans_set(trans),
10511 					     trans->msg_type, GFP_KERNEL);
10512 			break;
10513 		case NFT_MSG_NEWSETELEM:
10514 			te = nft_trans_container_elem(trans);
10515 
10516 			if (te->update_flags) {
10517 				const struct nft_set_ext *ext =
10518 					nft_set_elem_ext(te->set, te->elem_priv);
10519 
10520 				if (te->update_flags & NFT_TRANS_UPD_TIMEOUT) {
10521 					WRITE_ONCE(nft_set_ext_timeout(ext)->timeout,
10522 						   te->timeout);
10523 				}
10524 				if (te->update_flags & NFT_TRANS_UPD_EXPIRATION) {
10525 					WRITE_ONCE(nft_set_ext_timeout(ext)->expiration,
10526 						   get_jiffies_64() + te->expiration);
10527 				}
10528 			} else {
10529 				nft_setelem_activate(net, te->set, te->elem_priv);
10530 			}
10531 
10532 			nf_tables_setelem_notify(&ctx, te->set,
10533 						 te->elem_priv,
10534 						 NFT_MSG_NEWSETELEM);
10535 			if (te->set->ops->commit &&
10536 			    list_empty(&te->set->pending_update)) {
10537 				list_add_tail(&te->set->pending_update,
10538 					      &set_update_list);
10539 			}
10540 			nft_trans_destroy(trans);
10541 			break;
10542 		case NFT_MSG_DELSETELEM:
10543 		case NFT_MSG_DESTROYSETELEM:
10544 			te = nft_trans_container_elem(trans);
10545 
10546 			nf_tables_setelem_notify(&ctx, te->set,
10547 						 te->elem_priv,
10548 						 trans->msg_type);
10549 			nft_setelem_remove(net, te->set, te->elem_priv);
10550 			if (!nft_setelem_is_catchall(te->set, te->elem_priv)) {
10551 				atomic_dec(&te->set->nelems);
10552 				te->set->ndeact--;
10553 			}
10554 			if (te->set->ops->commit &&
10555 			    list_empty(&te->set->pending_update)) {
10556 				list_add_tail(&te->set->pending_update,
10557 					      &set_update_list);
10558 			}
10559 			break;
10560 		case NFT_MSG_NEWOBJ:
10561 			if (nft_trans_obj_update(trans)) {
10562 				nft_obj_commit_update(&ctx, trans);
10563 				nf_tables_obj_notify(&ctx,
10564 						     nft_trans_obj(trans),
10565 						     NFT_MSG_NEWOBJ);
10566 			} else {
10567 				nft_clear(net, nft_trans_obj(trans));
10568 				nf_tables_obj_notify(&ctx,
10569 						     nft_trans_obj(trans),
10570 						     NFT_MSG_NEWOBJ);
10571 				nft_trans_destroy(trans);
10572 			}
10573 			break;
10574 		case NFT_MSG_DELOBJ:
10575 		case NFT_MSG_DESTROYOBJ:
10576 			nft_obj_del(nft_trans_obj(trans));
10577 			nf_tables_obj_notify(&ctx, nft_trans_obj(trans),
10578 					     trans->msg_type);
10579 			break;
10580 		case NFT_MSG_NEWFLOWTABLE:
10581 			if (nft_trans_flowtable_update(trans)) {
10582 				nft_trans_flowtable(trans)->data.flags =
10583 					nft_trans_flowtable_flags(trans);
10584 				nf_tables_flowtable_notify(&ctx,
10585 							   nft_trans_flowtable(trans),
10586 							   &nft_trans_flowtable_hooks(trans),
10587 							   NFT_MSG_NEWFLOWTABLE);
10588 				list_splice(&nft_trans_flowtable_hooks(trans),
10589 					    &nft_trans_flowtable(trans)->hook_list);
10590 			} else {
10591 				nft_clear(net, nft_trans_flowtable(trans));
10592 				nf_tables_flowtable_notify(&ctx,
10593 							   nft_trans_flowtable(trans),
10594 							   NULL,
10595 							   NFT_MSG_NEWFLOWTABLE);
10596 			}
10597 			nft_trans_destroy(trans);
10598 			break;
10599 		case NFT_MSG_DELFLOWTABLE:
10600 		case NFT_MSG_DESTROYFLOWTABLE:
10601 			if (nft_trans_flowtable_update(trans)) {
10602 				nf_tables_flowtable_notify(&ctx,
10603 							   nft_trans_flowtable(trans),
10604 							   &nft_trans_flowtable_hooks(trans),
10605 							   trans->msg_type);
10606 				nft_unregister_flowtable_net_hooks(net,
10607 								   &nft_trans_flowtable_hooks(trans));
10608 			} else {
10609 				list_del_rcu(&nft_trans_flowtable(trans)->list);
10610 				nf_tables_flowtable_notify(&ctx,
10611 							   nft_trans_flowtable(trans),
10612 							   NULL,
10613 							   trans->msg_type);
10614 				nft_unregister_flowtable_net_hooks(net,
10615 						&nft_trans_flowtable(trans)->hook_list);
10616 			}
10617 			break;
10618 		}
10619 	}
10620 
10621 	nft_set_commit_update(&set_update_list);
10622 
10623 	nft_commit_notify(net, NETLINK_CB(skb).portid);
10624 	nf_tables_gen_notify(net, skb, NFT_MSG_NEWGEN);
10625 	nf_tables_commit_audit_log(&adl, nft_net->base_seq);
10626 
10627 	nft_gc_seq_end(nft_net, gc_seq);
10628 	nft_net->validate_state = NFT_VALIDATE_SKIP;
10629 	nf_tables_commit_release(net);
10630 
10631 	return 0;
10632 }
10633 
nf_tables_module_autoload(struct net * net)10634 static void nf_tables_module_autoload(struct net *net)
10635 {
10636 	struct nftables_pernet *nft_net = nft_pernet(net);
10637 	struct nft_module_request *req, *next;
10638 	LIST_HEAD(module_list);
10639 
10640 	list_splice_init(&nft_net->module_list, &module_list);
10641 	mutex_unlock(&nft_net->commit_mutex);
10642 	list_for_each_entry_safe(req, next, &module_list, list) {
10643 		request_module("%s", req->module);
10644 		req->done = true;
10645 	}
10646 	mutex_lock(&nft_net->commit_mutex);
10647 	list_splice(&module_list, &nft_net->module_list);
10648 }
10649 
nf_tables_abort_release(struct nft_trans * trans)10650 static void nf_tables_abort_release(struct nft_trans *trans)
10651 {
10652 	struct nft_ctx ctx = { };
10653 
10654 	nft_ctx_update(&ctx, trans);
10655 
10656 	switch (trans->msg_type) {
10657 	case NFT_MSG_NEWTABLE:
10658 		nf_tables_table_destroy(trans->table);
10659 		break;
10660 	case NFT_MSG_NEWCHAIN:
10661 		if (nft_trans_chain_update(trans))
10662 			nft_hooks_destroy(&nft_trans_chain_hooks(trans));
10663 		else
10664 			nf_tables_chain_destroy(nft_trans_chain(trans));
10665 		break;
10666 	case NFT_MSG_NEWRULE:
10667 		nf_tables_rule_destroy(&ctx, nft_trans_rule(trans));
10668 		break;
10669 	case NFT_MSG_NEWSET:
10670 		nft_set_destroy(&ctx, nft_trans_set(trans));
10671 		break;
10672 	case NFT_MSG_NEWSETELEM:
10673 		nft_set_elem_destroy(nft_trans_elem_set(trans),
10674 				     nft_trans_elem_priv(trans), true);
10675 		break;
10676 	case NFT_MSG_NEWOBJ:
10677 		nft_obj_destroy(&ctx, nft_trans_obj(trans));
10678 		break;
10679 	case NFT_MSG_NEWFLOWTABLE:
10680 		if (nft_trans_flowtable_update(trans))
10681 			nft_hooks_destroy(&nft_trans_flowtable_hooks(trans));
10682 		else
10683 			nf_tables_flowtable_destroy(nft_trans_flowtable(trans));
10684 		break;
10685 	}
10686 	kfree(trans);
10687 }
10688 
nft_set_abort_update(struct list_head * set_update_list)10689 static void nft_set_abort_update(struct list_head *set_update_list)
10690 {
10691 	struct nft_set *set, *next;
10692 
10693 	list_for_each_entry_safe(set, next, set_update_list, pending_update) {
10694 		list_del_init(&set->pending_update);
10695 
10696 		if (!set->ops->abort)
10697 			continue;
10698 
10699 		set->ops->abort(set);
10700 	}
10701 }
10702 
__nf_tables_abort(struct net * net,enum nfnl_abort_action action)10703 static int __nf_tables_abort(struct net *net, enum nfnl_abort_action action)
10704 {
10705 	struct nftables_pernet *nft_net = nft_pernet(net);
10706 	struct nft_trans *trans, *next;
10707 	LIST_HEAD(set_update_list);
10708 	struct nft_trans_elem *te;
10709 	struct nft_ctx ctx = {
10710 		.net = net,
10711 	};
10712 	int err = 0;
10713 
10714 	if (action == NFNL_ABORT_VALIDATE &&
10715 	    nf_tables_validate(net) < 0)
10716 		err = -EAGAIN;
10717 
10718 	list_for_each_entry_safe_reverse(trans, next, &nft_net->commit_list,
10719 					 list) {
10720 		struct nft_table *table = trans->table;
10721 
10722 		nft_ctx_update(&ctx, trans);
10723 
10724 		switch (trans->msg_type) {
10725 		case NFT_MSG_NEWTABLE:
10726 			if (nft_trans_table_update(trans)) {
10727 				if (!(table->flags & __NFT_TABLE_F_UPDATE)) {
10728 					nft_trans_destroy(trans);
10729 					break;
10730 				}
10731 				if (table->flags & __NFT_TABLE_F_WAS_DORMANT) {
10732 					nf_tables_table_disable(net, table);
10733 					table->flags |= NFT_TABLE_F_DORMANT;
10734 				} else if (table->flags & __NFT_TABLE_F_WAS_AWAKEN) {
10735 					table->flags &= ~NFT_TABLE_F_DORMANT;
10736 				}
10737 				if (table->flags & __NFT_TABLE_F_WAS_ORPHAN) {
10738 					table->flags &= ~NFT_TABLE_F_OWNER;
10739 					table->nlpid = 0;
10740 				}
10741 				table->flags &= ~__NFT_TABLE_F_UPDATE;
10742 				nft_trans_destroy(trans);
10743 			} else {
10744 				list_del_rcu(&table->list);
10745 			}
10746 			break;
10747 		case NFT_MSG_DELTABLE:
10748 		case NFT_MSG_DESTROYTABLE:
10749 			nft_clear(trans->net, table);
10750 			nft_trans_destroy(trans);
10751 			break;
10752 		case NFT_MSG_NEWCHAIN:
10753 			if (nft_trans_chain_update(trans)) {
10754 				if (!(table->flags & NFT_TABLE_F_DORMANT)) {
10755 					nft_netdev_unregister_hooks(net,
10756 								    &nft_trans_chain_hooks(trans),
10757 								    true);
10758 				}
10759 				free_percpu(nft_trans_chain_stats(trans));
10760 				kfree(nft_trans_chain_name(trans));
10761 				nft_trans_destroy(trans);
10762 			} else {
10763 				if (nft_trans_chain_bound(trans)) {
10764 					nft_trans_destroy(trans);
10765 					break;
10766 				}
10767 				nft_use_dec_restore(&table->use);
10768 				nft_chain_del(nft_trans_chain(trans));
10769 				nf_tables_unregister_hook(trans->net, table,
10770 							  nft_trans_chain(trans));
10771 			}
10772 			break;
10773 		case NFT_MSG_DELCHAIN:
10774 		case NFT_MSG_DESTROYCHAIN:
10775 			if (nft_trans_chain_update(trans)) {
10776 				list_splice(&nft_trans_chain_hooks(trans),
10777 					    &nft_trans_basechain(trans)->hook_list);
10778 			} else {
10779 				nft_use_inc_restore(&table->use);
10780 				nft_clear(trans->net, nft_trans_chain(trans));
10781 			}
10782 			nft_trans_destroy(trans);
10783 			break;
10784 		case NFT_MSG_NEWRULE:
10785 			if (nft_trans_rule_bound(trans)) {
10786 				nft_trans_destroy(trans);
10787 				break;
10788 			}
10789 			nft_use_dec_restore(&nft_trans_rule_chain(trans)->use);
10790 			list_del_rcu(&nft_trans_rule(trans)->list);
10791 			nft_rule_expr_deactivate(&ctx,
10792 						 nft_trans_rule(trans),
10793 						 NFT_TRANS_ABORT);
10794 			if (nft_trans_rule_chain(trans)->flags & NFT_CHAIN_HW_OFFLOAD)
10795 				nft_flow_rule_destroy(nft_trans_flow_rule(trans));
10796 			break;
10797 		case NFT_MSG_DELRULE:
10798 		case NFT_MSG_DESTROYRULE:
10799 			nft_use_inc_restore(&nft_trans_rule_chain(trans)->use);
10800 			nft_clear(trans->net, nft_trans_rule(trans));
10801 			nft_rule_expr_activate(&ctx, nft_trans_rule(trans));
10802 			if (nft_trans_rule_chain(trans)->flags & NFT_CHAIN_HW_OFFLOAD)
10803 				nft_flow_rule_destroy(nft_trans_flow_rule(trans));
10804 
10805 			nft_trans_destroy(trans);
10806 			break;
10807 		case NFT_MSG_NEWSET:
10808 			list_del(&nft_trans_container_set(trans)->list_trans_newset);
10809 			if (nft_trans_set_update(trans)) {
10810 				nft_trans_destroy(trans);
10811 				break;
10812 			}
10813 			nft_use_dec_restore(&table->use);
10814 			if (nft_trans_set_bound(trans)) {
10815 				nft_trans_destroy(trans);
10816 				break;
10817 			}
10818 			nft_trans_set(trans)->dead = 1;
10819 			list_del_rcu(&nft_trans_set(trans)->list);
10820 			break;
10821 		case NFT_MSG_DELSET:
10822 		case NFT_MSG_DESTROYSET:
10823 			nft_use_inc_restore(&table->use);
10824 			nft_clear(trans->net, nft_trans_set(trans));
10825 			if (nft_trans_set(trans)->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
10826 				nft_map_activate(&ctx, nft_trans_set(trans));
10827 
10828 			nft_trans_destroy(trans);
10829 			break;
10830 		case NFT_MSG_NEWSETELEM:
10831 			if (nft_trans_elem_update_flags(trans) ||
10832 			    nft_trans_elem_set_bound(trans)) {
10833 				nft_trans_destroy(trans);
10834 				break;
10835 			}
10836 			te = nft_trans_container_elem(trans);
10837 			if (!te->set->ops->abort ||
10838 			    nft_setelem_is_catchall(te->set, te->elem_priv))
10839 				nft_setelem_remove(net, te->set, te->elem_priv);
10840 
10841 			if (!nft_setelem_is_catchall(te->set, te->elem_priv))
10842 				atomic_dec(&te->set->nelems);
10843 
10844 			if (te->set->ops->abort &&
10845 			    list_empty(&te->set->pending_update)) {
10846 				list_add_tail(&te->set->pending_update,
10847 					      &set_update_list);
10848 			}
10849 			break;
10850 		case NFT_MSG_DELSETELEM:
10851 		case NFT_MSG_DESTROYSETELEM:
10852 			te = nft_trans_container_elem(trans);
10853 
10854 			if (!nft_setelem_active_next(net, te->set, te->elem_priv)) {
10855 				nft_setelem_data_activate(net, te->set, te->elem_priv);
10856 				nft_setelem_activate(net, te->set, te->elem_priv);
10857 			}
10858 			if (!nft_setelem_is_catchall(te->set, te->elem_priv))
10859 				te->set->ndeact--;
10860 
10861 			if (te->set->ops->abort &&
10862 			    list_empty(&te->set->pending_update)) {
10863 				list_add_tail(&te->set->pending_update,
10864 					      &set_update_list);
10865 			}
10866 			nft_trans_destroy(trans);
10867 			break;
10868 		case NFT_MSG_NEWOBJ:
10869 			if (nft_trans_obj_update(trans)) {
10870 				nft_obj_destroy(&ctx, nft_trans_obj_newobj(trans));
10871 				nft_trans_destroy(trans);
10872 			} else {
10873 				nft_use_dec_restore(&table->use);
10874 				nft_obj_del(nft_trans_obj(trans));
10875 			}
10876 			break;
10877 		case NFT_MSG_DELOBJ:
10878 		case NFT_MSG_DESTROYOBJ:
10879 			nft_use_inc_restore(&table->use);
10880 			nft_clear(trans->net, nft_trans_obj(trans));
10881 			nft_trans_destroy(trans);
10882 			break;
10883 		case NFT_MSG_NEWFLOWTABLE:
10884 			if (nft_trans_flowtable_update(trans)) {
10885 				nft_unregister_flowtable_net_hooks(net,
10886 						&nft_trans_flowtable_hooks(trans));
10887 			} else {
10888 				nft_use_dec_restore(&table->use);
10889 				list_del_rcu(&nft_trans_flowtable(trans)->list);
10890 				nft_unregister_flowtable_net_hooks(net,
10891 						&nft_trans_flowtable(trans)->hook_list);
10892 			}
10893 			break;
10894 		case NFT_MSG_DELFLOWTABLE:
10895 		case NFT_MSG_DESTROYFLOWTABLE:
10896 			if (nft_trans_flowtable_update(trans)) {
10897 				list_splice(&nft_trans_flowtable_hooks(trans),
10898 					    &nft_trans_flowtable(trans)->hook_list);
10899 			} else {
10900 				nft_use_inc_restore(&table->use);
10901 				nft_clear(trans->net, nft_trans_flowtable(trans));
10902 			}
10903 			nft_trans_destroy(trans);
10904 			break;
10905 		}
10906 	}
10907 
10908 	WARN_ON_ONCE(!list_empty(&nft_net->commit_set_list));
10909 
10910 	nft_set_abort_update(&set_update_list);
10911 
10912 	synchronize_rcu();
10913 
10914 	list_for_each_entry_safe_reverse(trans, next,
10915 					 &nft_net->commit_list, list) {
10916 		nft_trans_list_del(trans);
10917 		nf_tables_abort_release(trans);
10918 	}
10919 
10920 	return err;
10921 }
10922 
nf_tables_abort(struct net * net,struct sk_buff * skb,enum nfnl_abort_action action)10923 static int nf_tables_abort(struct net *net, struct sk_buff *skb,
10924 			   enum nfnl_abort_action action)
10925 {
10926 	struct nftables_pernet *nft_net = nft_pernet(net);
10927 	unsigned int gc_seq;
10928 	int ret;
10929 
10930 	gc_seq = nft_gc_seq_begin(nft_net);
10931 	ret = __nf_tables_abort(net, action);
10932 	nft_gc_seq_end(nft_net, gc_seq);
10933 
10934 	WARN_ON_ONCE(!list_empty(&nft_net->commit_list));
10935 
10936 	/* module autoload needs to happen after GC sequence update because it
10937 	 * temporarily releases and grabs mutex again.
10938 	 */
10939 	if (action == NFNL_ABORT_AUTOLOAD)
10940 		nf_tables_module_autoload(net);
10941 	else
10942 		nf_tables_module_autoload_cleanup(net);
10943 
10944 	mutex_unlock(&nft_net->commit_mutex);
10945 
10946 	return ret;
10947 }
10948 
nf_tables_valid_genid(struct net * net,u32 genid)10949 static bool nf_tables_valid_genid(struct net *net, u32 genid)
10950 {
10951 	struct nftables_pernet *nft_net = nft_pernet(net);
10952 	bool genid_ok;
10953 
10954 	mutex_lock(&nft_net->commit_mutex);
10955 	nft_net->tstamp = get_jiffies_64();
10956 
10957 	genid_ok = genid == 0 || nft_net->base_seq == genid;
10958 	if (!genid_ok)
10959 		mutex_unlock(&nft_net->commit_mutex);
10960 
10961 	/* else, commit mutex has to be released by commit or abort function */
10962 	return genid_ok;
10963 }
10964 
10965 static const struct nfnetlink_subsystem nf_tables_subsys = {
10966 	.name		= "nf_tables",
10967 	.subsys_id	= NFNL_SUBSYS_NFTABLES,
10968 	.cb_count	= NFT_MSG_MAX,
10969 	.cb		= nf_tables_cb,
10970 	.commit		= nf_tables_commit,
10971 	.abort		= nf_tables_abort,
10972 	.valid_genid	= nf_tables_valid_genid,
10973 	.owner		= THIS_MODULE,
10974 };
10975 
nft_chain_validate_dependency(const struct nft_chain * chain,enum nft_chain_types type)10976 int nft_chain_validate_dependency(const struct nft_chain *chain,
10977 				  enum nft_chain_types type)
10978 {
10979 	const struct nft_base_chain *basechain;
10980 
10981 	if (nft_is_base_chain(chain)) {
10982 		basechain = nft_base_chain(chain);
10983 		if (basechain->type->type != type)
10984 			return -EOPNOTSUPP;
10985 	}
10986 	return 0;
10987 }
10988 EXPORT_SYMBOL_GPL(nft_chain_validate_dependency);
10989 
nft_chain_validate_hooks(const struct nft_chain * chain,unsigned int hook_flags)10990 int nft_chain_validate_hooks(const struct nft_chain *chain,
10991 			     unsigned int hook_flags)
10992 {
10993 	struct nft_base_chain *basechain;
10994 
10995 	if (nft_is_base_chain(chain)) {
10996 		basechain = nft_base_chain(chain);
10997 
10998 		if ((1 << basechain->ops.hooknum) & hook_flags)
10999 			return 0;
11000 
11001 		return -EOPNOTSUPP;
11002 	}
11003 
11004 	return 0;
11005 }
11006 EXPORT_SYMBOL_GPL(nft_chain_validate_hooks);
11007 
11008 /**
11009  *	nft_parse_u32_check - fetch u32 attribute and check for maximum value
11010  *
11011  *	@attr: netlink attribute to fetch value from
11012  *	@max: maximum value to be stored in dest
11013  *	@dest: pointer to the variable
11014  *
11015  *	Parse, check and store a given u32 netlink attribute into variable.
11016  *	This function returns -ERANGE if the value goes over maximum value.
11017  *	Otherwise a 0 is returned and the attribute value is stored in the
11018  *	destination variable.
11019  */
nft_parse_u32_check(const struct nlattr * attr,int max,u32 * dest)11020 int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest)
11021 {
11022 	u32 val;
11023 
11024 	val = ntohl(nla_get_be32(attr));
11025 	if (val > max)
11026 		return -ERANGE;
11027 
11028 	*dest = val;
11029 	return 0;
11030 }
11031 EXPORT_SYMBOL_GPL(nft_parse_u32_check);
11032 
nft_parse_register(const struct nlattr * attr,u32 * preg)11033 static int nft_parse_register(const struct nlattr *attr, u32 *preg)
11034 {
11035 	unsigned int reg;
11036 
11037 	reg = ntohl(nla_get_be32(attr));
11038 	switch (reg) {
11039 	case NFT_REG_VERDICT...NFT_REG_4:
11040 		*preg = reg * NFT_REG_SIZE / NFT_REG32_SIZE;
11041 		break;
11042 	case NFT_REG32_00...NFT_REG32_15:
11043 		*preg = reg + NFT_REG_SIZE / NFT_REG32_SIZE - NFT_REG32_00;
11044 		break;
11045 	default:
11046 		return -ERANGE;
11047 	}
11048 
11049 	return 0;
11050 }
11051 
11052 /**
11053  *	nft_dump_register - dump a register value to a netlink attribute
11054  *
11055  *	@skb: socket buffer
11056  *	@attr: attribute number
11057  *	@reg: register number
11058  *
11059  *	Construct a netlink attribute containing the register number. For
11060  *	compatibility reasons, register numbers being a multiple of 4 are
11061  *	translated to the corresponding 128 bit register numbers.
11062  */
nft_dump_register(struct sk_buff * skb,unsigned int attr,unsigned int reg)11063 int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg)
11064 {
11065 	if (reg % (NFT_REG_SIZE / NFT_REG32_SIZE) == 0)
11066 		reg = reg / (NFT_REG_SIZE / NFT_REG32_SIZE);
11067 	else
11068 		reg = reg - NFT_REG_SIZE / NFT_REG32_SIZE + NFT_REG32_00;
11069 
11070 	return nla_put_be32(skb, attr, htonl(reg));
11071 }
11072 EXPORT_SYMBOL_GPL(nft_dump_register);
11073 
nft_validate_register_load(enum nft_registers reg,unsigned int len)11074 static int nft_validate_register_load(enum nft_registers reg, unsigned int len)
11075 {
11076 	if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
11077 		return -EINVAL;
11078 	if (len == 0)
11079 		return -EINVAL;
11080 	if (reg * NFT_REG32_SIZE + len > sizeof_field(struct nft_regs, data))
11081 		return -ERANGE;
11082 
11083 	return 0;
11084 }
11085 
nft_parse_register_load(const struct nft_ctx * ctx,const struct nlattr * attr,u8 * sreg,u32 len)11086 int nft_parse_register_load(const struct nft_ctx *ctx,
11087 			    const struct nlattr *attr, u8 *sreg, u32 len)
11088 {
11089 	int err, invalid_reg;
11090 	u32 reg, next_register;
11091 
11092 	err = nft_parse_register(attr, &reg);
11093 	if (err < 0)
11094 		return err;
11095 
11096 	err = nft_validate_register_load(reg, len);
11097 	if (err < 0)
11098 		return err;
11099 
11100 	next_register = DIV_ROUND_UP(len, NFT_REG32_SIZE) + reg;
11101 
11102 	/* Can't happen: nft_validate_register_load() should have failed */
11103 	if (WARN_ON_ONCE(next_register > NFT_REG32_NUM))
11104 		return -EINVAL;
11105 
11106 	/* find first register that did not see an earlier store. */
11107 	invalid_reg = find_next_zero_bit(ctx->reg_inited, NFT_REG32_NUM, reg);
11108 
11109 	/* invalid register within the range that we're loading from? */
11110 	if (invalid_reg < next_register)
11111 		return -ENODATA;
11112 
11113 	*sreg = reg;
11114 	return 0;
11115 }
11116 EXPORT_SYMBOL_GPL(nft_parse_register_load);
11117 
nft_saw_register_store(const struct nft_ctx * __ctx,int reg,unsigned int len)11118 static void nft_saw_register_store(const struct nft_ctx *__ctx,
11119 				   int reg, unsigned int len)
11120 {
11121 	unsigned int registers = DIV_ROUND_UP(len, NFT_REG32_SIZE);
11122 	struct nft_ctx *ctx = (struct nft_ctx *)__ctx;
11123 
11124 	if (WARN_ON_ONCE(len == 0 || reg < 0))
11125 		return;
11126 
11127 	bitmap_set(ctx->reg_inited, reg, registers);
11128 }
11129 
nft_validate_register_store(const struct nft_ctx * ctx,enum nft_registers reg,const struct nft_data * data,enum nft_data_types type,unsigned int len)11130 static int nft_validate_register_store(const struct nft_ctx *ctx,
11131 				       enum nft_registers reg,
11132 				       const struct nft_data *data,
11133 				       enum nft_data_types type,
11134 				       unsigned int len)
11135 {
11136 	int err;
11137 
11138 	switch (reg) {
11139 	case NFT_REG_VERDICT:
11140 		if (type != NFT_DATA_VERDICT)
11141 			return -EINVAL;
11142 
11143 		if (data != NULL &&
11144 		    (data->verdict.code == NFT_GOTO ||
11145 		     data->verdict.code == NFT_JUMP)) {
11146 			err = nft_chain_validate(ctx, data->verdict.chain);
11147 			if (err < 0)
11148 				return err;
11149 		}
11150 
11151 		break;
11152 	default:
11153 		if (type != NFT_DATA_VALUE)
11154 			return -EINVAL;
11155 
11156 		if (reg < NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE)
11157 			return -EINVAL;
11158 		if (len == 0)
11159 			return -EINVAL;
11160 		if (reg * NFT_REG32_SIZE + len >
11161 		    sizeof_field(struct nft_regs, data))
11162 			return -ERANGE;
11163 
11164 		break;
11165 	}
11166 
11167 	nft_saw_register_store(ctx, reg, len);
11168 	return 0;
11169 }
11170 
nft_parse_register_store(const struct nft_ctx * ctx,const struct nlattr * attr,u8 * dreg,const struct nft_data * data,enum nft_data_types type,unsigned int len)11171 int nft_parse_register_store(const struct nft_ctx *ctx,
11172 			     const struct nlattr *attr, u8 *dreg,
11173 			     const struct nft_data *data,
11174 			     enum nft_data_types type, unsigned int len)
11175 {
11176 	int err;
11177 	u32 reg;
11178 
11179 	err = nft_parse_register(attr, &reg);
11180 	if (err < 0)
11181 		return err;
11182 
11183 	err = nft_validate_register_store(ctx, reg, data, type, len);
11184 	if (err < 0)
11185 		return err;
11186 
11187 	*dreg = reg;
11188 	return 0;
11189 }
11190 EXPORT_SYMBOL_GPL(nft_parse_register_store);
11191 
11192 static const struct nla_policy nft_verdict_policy[NFTA_VERDICT_MAX + 1] = {
11193 	[NFTA_VERDICT_CODE]	= { .type = NLA_U32 },
11194 	[NFTA_VERDICT_CHAIN]	= { .type = NLA_STRING,
11195 				    .len = NFT_CHAIN_MAXNAMELEN - 1 },
11196 	[NFTA_VERDICT_CHAIN_ID]	= { .type = NLA_U32 },
11197 };
11198 
nft_verdict_init(const struct nft_ctx * ctx,struct nft_data * data,struct nft_data_desc * desc,const struct nlattr * nla)11199 static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,
11200 			    struct nft_data_desc *desc, const struct nlattr *nla)
11201 {
11202 	u8 genmask = nft_genmask_next(ctx->net);
11203 	struct nlattr *tb[NFTA_VERDICT_MAX + 1];
11204 	struct nft_chain *chain;
11205 	int err;
11206 
11207 	err = nla_parse_nested_deprecated(tb, NFTA_VERDICT_MAX, nla,
11208 					  nft_verdict_policy, NULL);
11209 	if (err < 0)
11210 		return err;
11211 
11212 	if (!tb[NFTA_VERDICT_CODE])
11213 		return -EINVAL;
11214 
11215 	/* zero padding hole for memcmp */
11216 	memset(data, 0, sizeof(*data));
11217 	data->verdict.code = ntohl(nla_get_be32(tb[NFTA_VERDICT_CODE]));
11218 
11219 	switch (data->verdict.code) {
11220 	case NF_ACCEPT:
11221 	case NF_DROP:
11222 	case NF_QUEUE:
11223 		break;
11224 	case NFT_CONTINUE:
11225 	case NFT_BREAK:
11226 	case NFT_RETURN:
11227 		break;
11228 	case NFT_JUMP:
11229 	case NFT_GOTO:
11230 		if (tb[NFTA_VERDICT_CHAIN]) {
11231 			chain = nft_chain_lookup(ctx->net, ctx->table,
11232 						 tb[NFTA_VERDICT_CHAIN],
11233 						 genmask);
11234 		} else if (tb[NFTA_VERDICT_CHAIN_ID]) {
11235 			chain = nft_chain_lookup_byid(ctx->net, ctx->table,
11236 						      tb[NFTA_VERDICT_CHAIN_ID],
11237 						      genmask);
11238 			if (IS_ERR(chain))
11239 				return PTR_ERR(chain);
11240 		} else {
11241 			return -EINVAL;
11242 		}
11243 
11244 		if (IS_ERR(chain))
11245 			return PTR_ERR(chain);
11246 		if (nft_is_base_chain(chain))
11247 			return -EOPNOTSUPP;
11248 		if (nft_chain_is_bound(chain))
11249 			return -EINVAL;
11250 		if (desc->flags & NFT_DATA_DESC_SETELEM &&
11251 		    chain->flags & NFT_CHAIN_BINDING)
11252 			return -EINVAL;
11253 		if (!nft_use_inc(&chain->use))
11254 			return -EMFILE;
11255 
11256 		data->verdict.chain = chain;
11257 		break;
11258 	default:
11259 		return -EINVAL;
11260 	}
11261 
11262 	desc->len = sizeof(data->verdict);
11263 
11264 	return 0;
11265 }
11266 
nft_verdict_uninit(const struct nft_data * data)11267 static void nft_verdict_uninit(const struct nft_data *data)
11268 {
11269 	struct nft_chain *chain;
11270 
11271 	switch (data->verdict.code) {
11272 	case NFT_JUMP:
11273 	case NFT_GOTO:
11274 		chain = data->verdict.chain;
11275 		nft_use_dec(&chain->use);
11276 		break;
11277 	}
11278 }
11279 
nft_verdict_dump(struct sk_buff * skb,int type,const struct nft_verdict * v)11280 int nft_verdict_dump(struct sk_buff *skb, int type, const struct nft_verdict *v)
11281 {
11282 	struct nlattr *nest;
11283 
11284 	nest = nla_nest_start_noflag(skb, type);
11285 	if (!nest)
11286 		goto nla_put_failure;
11287 
11288 	if (nla_put_be32(skb, NFTA_VERDICT_CODE, htonl(v->code)))
11289 		goto nla_put_failure;
11290 
11291 	switch (v->code) {
11292 	case NFT_JUMP:
11293 	case NFT_GOTO:
11294 		if (nla_put_string(skb, NFTA_VERDICT_CHAIN,
11295 				   v->chain->name))
11296 			goto nla_put_failure;
11297 	}
11298 	nla_nest_end(skb, nest);
11299 	return 0;
11300 
11301 nla_put_failure:
11302 	return -1;
11303 }
11304 
nft_value_init(const struct nft_ctx * ctx,struct nft_data * data,struct nft_data_desc * desc,const struct nlattr * nla)11305 static int nft_value_init(const struct nft_ctx *ctx,
11306 			  struct nft_data *data, struct nft_data_desc *desc,
11307 			  const struct nlattr *nla)
11308 {
11309 	unsigned int len;
11310 
11311 	len = nla_len(nla);
11312 	if (len == 0)
11313 		return -EINVAL;
11314 	if (len > desc->size)
11315 		return -EOVERFLOW;
11316 	if (desc->len) {
11317 		if (len != desc->len)
11318 			return -EINVAL;
11319 	} else {
11320 		desc->len = len;
11321 	}
11322 
11323 	nla_memcpy(data->data, nla, len);
11324 
11325 	return 0;
11326 }
11327 
nft_value_dump(struct sk_buff * skb,const struct nft_data * data,unsigned int len)11328 static int nft_value_dump(struct sk_buff *skb, const struct nft_data *data,
11329 			  unsigned int len)
11330 {
11331 	return nla_put(skb, NFTA_DATA_VALUE, len, data->data);
11332 }
11333 
11334 static const struct nla_policy nft_data_policy[NFTA_DATA_MAX + 1] = {
11335 	[NFTA_DATA_VALUE]	= { .type = NLA_BINARY },
11336 	[NFTA_DATA_VERDICT]	= { .type = NLA_NESTED },
11337 };
11338 
11339 /**
11340  *	nft_data_init - parse nf_tables data netlink attributes
11341  *
11342  *	@ctx: context of the expression using the data
11343  *	@data: destination struct nft_data
11344  *	@desc: data description
11345  *	@nla: netlink attribute containing data
11346  *
11347  *	Parse the netlink data attributes and initialize a struct nft_data.
11348  *	The type and length of data are returned in the data description.
11349  *
11350  *	The caller can indicate that it only wants to accept data of type
11351  *	NFT_DATA_VALUE by passing NULL for the ctx argument.
11352  */
nft_data_init(const struct nft_ctx * ctx,struct nft_data * data,struct nft_data_desc * desc,const struct nlattr * nla)11353 int nft_data_init(const struct nft_ctx *ctx, struct nft_data *data,
11354 		  struct nft_data_desc *desc, const struct nlattr *nla)
11355 {
11356 	struct nlattr *tb[NFTA_DATA_MAX + 1];
11357 	int err;
11358 
11359 	if (WARN_ON_ONCE(!desc->size))
11360 		return -EINVAL;
11361 
11362 	err = nla_parse_nested_deprecated(tb, NFTA_DATA_MAX, nla,
11363 					  nft_data_policy, NULL);
11364 	if (err < 0)
11365 		return err;
11366 
11367 	if (tb[NFTA_DATA_VALUE]) {
11368 		if (desc->type != NFT_DATA_VALUE)
11369 			return -EINVAL;
11370 
11371 		err = nft_value_init(ctx, data, desc, tb[NFTA_DATA_VALUE]);
11372 	} else if (tb[NFTA_DATA_VERDICT] && ctx != NULL) {
11373 		if (desc->type != NFT_DATA_VERDICT)
11374 			return -EINVAL;
11375 
11376 		err = nft_verdict_init(ctx, data, desc, tb[NFTA_DATA_VERDICT]);
11377 	} else {
11378 		err = -EINVAL;
11379 	}
11380 
11381 	return err;
11382 }
11383 EXPORT_SYMBOL_GPL(nft_data_init);
11384 
11385 /**
11386  *	nft_data_release - release a nft_data item
11387  *
11388  *	@data: struct nft_data to release
11389  *	@type: type of data
11390  *
11391  *	Release a nft_data item. NFT_DATA_VALUE types can be silently discarded,
11392  *	all others need to be released by calling this function.
11393  */
nft_data_release(const struct nft_data * data,enum nft_data_types type)11394 void nft_data_release(const struct nft_data *data, enum nft_data_types type)
11395 {
11396 	if (type < NFT_DATA_VERDICT)
11397 		return;
11398 	switch (type) {
11399 	case NFT_DATA_VERDICT:
11400 		return nft_verdict_uninit(data);
11401 	default:
11402 		WARN_ON(1);
11403 	}
11404 }
11405 EXPORT_SYMBOL_GPL(nft_data_release);
11406 
nft_data_dump(struct sk_buff * skb,int attr,const struct nft_data * data,enum nft_data_types type,unsigned int len)11407 int nft_data_dump(struct sk_buff *skb, int attr, const struct nft_data *data,
11408 		  enum nft_data_types type, unsigned int len)
11409 {
11410 	struct nlattr *nest;
11411 	int err;
11412 
11413 	nest = nla_nest_start_noflag(skb, attr);
11414 	if (nest == NULL)
11415 		return -1;
11416 
11417 	switch (type) {
11418 	case NFT_DATA_VALUE:
11419 		err = nft_value_dump(skb, data, len);
11420 		break;
11421 	case NFT_DATA_VERDICT:
11422 		err = nft_verdict_dump(skb, NFTA_DATA_VERDICT, &data->verdict);
11423 		break;
11424 	default:
11425 		err = -EINVAL;
11426 		WARN_ON(1);
11427 	}
11428 
11429 	nla_nest_end(skb, nest);
11430 	return err;
11431 }
11432 EXPORT_SYMBOL_GPL(nft_data_dump);
11433 
__nft_release_basechain_now(struct nft_ctx * ctx)11434 static void __nft_release_basechain_now(struct nft_ctx *ctx)
11435 {
11436 	struct nft_rule *rule, *nr;
11437 
11438 	list_for_each_entry_safe(rule, nr, &ctx->chain->rules, list) {
11439 		list_del(&rule->list);
11440 		nf_tables_rule_release(ctx, rule);
11441 	}
11442 	nf_tables_chain_destroy(ctx->chain);
11443 }
11444 
nft_release_basechain_rcu(struct rcu_head * head)11445 static void nft_release_basechain_rcu(struct rcu_head *head)
11446 {
11447 	struct nft_chain *chain = container_of(head, struct nft_chain, rcu_head);
11448 	struct nft_ctx ctx = {
11449 		.family	= chain->table->family,
11450 		.chain	= chain,
11451 		.net	= read_pnet(&chain->table->net),
11452 	};
11453 
11454 	__nft_release_basechain_now(&ctx);
11455 	put_net(ctx.net);
11456 }
11457 
__nft_release_basechain(struct nft_ctx * ctx)11458 int __nft_release_basechain(struct nft_ctx *ctx)
11459 {
11460 	struct nft_rule *rule;
11461 
11462 	if (WARN_ON_ONCE(!nft_is_base_chain(ctx->chain)))
11463 		return 0;
11464 
11465 	nf_tables_unregister_hook(ctx->net, ctx->chain->table, ctx->chain);
11466 	list_for_each_entry(rule, &ctx->chain->rules, list)
11467 		nft_use_dec(&ctx->chain->use);
11468 
11469 	nft_chain_del(ctx->chain);
11470 	nft_use_dec(&ctx->table->use);
11471 
11472 	if (maybe_get_net(ctx->net))
11473 		call_rcu(&ctx->chain->rcu_head, nft_release_basechain_rcu);
11474 	else
11475 		__nft_release_basechain_now(ctx);
11476 
11477 	return 0;
11478 }
11479 EXPORT_SYMBOL_GPL(__nft_release_basechain);
11480 
__nft_release_hook(struct net * net,struct nft_table * table)11481 static void __nft_release_hook(struct net *net, struct nft_table *table)
11482 {
11483 	struct nft_flowtable *flowtable;
11484 	struct nft_chain *chain;
11485 
11486 	list_for_each_entry(chain, &table->chains, list)
11487 		__nf_tables_unregister_hook(net, table, chain, true);
11488 	list_for_each_entry(flowtable, &table->flowtables, list)
11489 		__nft_unregister_flowtable_net_hooks(net, &flowtable->hook_list,
11490 						     true);
11491 }
11492 
__nft_release_hooks(struct net * net)11493 static void __nft_release_hooks(struct net *net)
11494 {
11495 	struct nftables_pernet *nft_net = nft_pernet(net);
11496 	struct nft_table *table;
11497 
11498 	list_for_each_entry(table, &nft_net->tables, list) {
11499 		if (nft_table_has_owner(table))
11500 			continue;
11501 
11502 		__nft_release_hook(net, table);
11503 	}
11504 }
11505 
__nft_release_table(struct net * net,struct nft_table * table)11506 static void __nft_release_table(struct net *net, struct nft_table *table)
11507 {
11508 	struct nft_flowtable *flowtable, *nf;
11509 	struct nft_chain *chain, *nc;
11510 	struct nft_object *obj, *ne;
11511 	struct nft_rule *rule, *nr;
11512 	struct nft_set *set, *ns;
11513 	struct nft_ctx ctx = {
11514 		.net	= net,
11515 		.family	= NFPROTO_NETDEV,
11516 	};
11517 
11518 	ctx.family = table->family;
11519 	ctx.table = table;
11520 	list_for_each_entry(chain, &table->chains, list) {
11521 		if (nft_chain_binding(chain))
11522 			continue;
11523 
11524 		ctx.chain = chain;
11525 		list_for_each_entry_safe(rule, nr, &chain->rules, list) {
11526 			list_del(&rule->list);
11527 			nft_use_dec(&chain->use);
11528 			nf_tables_rule_release(&ctx, rule);
11529 		}
11530 	}
11531 	list_for_each_entry_safe(flowtable, nf, &table->flowtables, list) {
11532 		list_del(&flowtable->list);
11533 		nft_use_dec(&table->use);
11534 		nf_tables_flowtable_destroy(flowtable);
11535 	}
11536 	list_for_each_entry_safe(set, ns, &table->sets, list) {
11537 		list_del(&set->list);
11538 		nft_use_dec(&table->use);
11539 		if (set->flags & (NFT_SET_MAP | NFT_SET_OBJECT))
11540 			nft_map_deactivate(&ctx, set);
11541 
11542 		nft_set_destroy(&ctx, set);
11543 	}
11544 	list_for_each_entry_safe(obj, ne, &table->objects, list) {
11545 		nft_obj_del(obj);
11546 		nft_use_dec(&table->use);
11547 		nft_obj_destroy(&ctx, obj);
11548 	}
11549 	list_for_each_entry_safe(chain, nc, &table->chains, list) {
11550 		nft_chain_del(chain);
11551 		nft_use_dec(&table->use);
11552 		nf_tables_chain_destroy(chain);
11553 	}
11554 	nf_tables_table_destroy(table);
11555 }
11556 
__nft_release_tables(struct net * net)11557 static void __nft_release_tables(struct net *net)
11558 {
11559 	struct nftables_pernet *nft_net = nft_pernet(net);
11560 	struct nft_table *table, *nt;
11561 
11562 	list_for_each_entry_safe(table, nt, &nft_net->tables, list) {
11563 		if (nft_table_has_owner(table))
11564 			continue;
11565 
11566 		list_del(&table->list);
11567 
11568 		__nft_release_table(net, table);
11569 	}
11570 }
11571 
nft_rcv_nl_event(struct notifier_block * this,unsigned long event,void * ptr)11572 static int nft_rcv_nl_event(struct notifier_block *this, unsigned long event,
11573 			    void *ptr)
11574 {
11575 	struct nft_table *table, *to_delete[8];
11576 	struct nftables_pernet *nft_net;
11577 	struct netlink_notify *n = ptr;
11578 	struct net *net = n->net;
11579 	unsigned int deleted;
11580 	bool restart = false;
11581 	unsigned int gc_seq;
11582 
11583 	if (event != NETLINK_URELEASE || n->protocol != NETLINK_NETFILTER)
11584 		return NOTIFY_DONE;
11585 
11586 	nft_net = nft_pernet(net);
11587 	deleted = 0;
11588 	mutex_lock(&nft_net->commit_mutex);
11589 
11590 	gc_seq = nft_gc_seq_begin(nft_net);
11591 
11592 	nf_tables_trans_destroy_flush_work();
11593 again:
11594 	list_for_each_entry(table, &nft_net->tables, list) {
11595 		if (nft_table_has_owner(table) &&
11596 		    n->portid == table->nlpid) {
11597 			if (table->flags & NFT_TABLE_F_PERSIST) {
11598 				table->flags &= ~NFT_TABLE_F_OWNER;
11599 				continue;
11600 			}
11601 			__nft_release_hook(net, table);
11602 			list_del_rcu(&table->list);
11603 			to_delete[deleted++] = table;
11604 			if (deleted >= ARRAY_SIZE(to_delete))
11605 				break;
11606 		}
11607 	}
11608 	if (deleted) {
11609 		restart = deleted >= ARRAY_SIZE(to_delete);
11610 		synchronize_rcu();
11611 		while (deleted)
11612 			__nft_release_table(net, to_delete[--deleted]);
11613 
11614 		if (restart)
11615 			goto again;
11616 	}
11617 	nft_gc_seq_end(nft_net, gc_seq);
11618 
11619 	mutex_unlock(&nft_net->commit_mutex);
11620 
11621 	return NOTIFY_DONE;
11622 }
11623 
11624 static struct notifier_block nft_nl_notifier = {
11625 	.notifier_call  = nft_rcv_nl_event,
11626 };
11627 
nf_tables_init_net(struct net * net)11628 static int __net_init nf_tables_init_net(struct net *net)
11629 {
11630 	struct nftables_pernet *nft_net = nft_pernet(net);
11631 
11632 	INIT_LIST_HEAD(&nft_net->tables);
11633 	INIT_LIST_HEAD(&nft_net->commit_list);
11634 	INIT_LIST_HEAD(&nft_net->commit_set_list);
11635 	INIT_LIST_HEAD(&nft_net->binding_list);
11636 	INIT_LIST_HEAD(&nft_net->module_list);
11637 	INIT_LIST_HEAD(&nft_net->notify_list);
11638 	mutex_init(&nft_net->commit_mutex);
11639 	nft_net->base_seq = 1;
11640 	nft_net->gc_seq = 0;
11641 	nft_net->validate_state = NFT_VALIDATE_SKIP;
11642 
11643 	return 0;
11644 }
11645 
nf_tables_pre_exit_net(struct net * net)11646 static void __net_exit nf_tables_pre_exit_net(struct net *net)
11647 {
11648 	struct nftables_pernet *nft_net = nft_pernet(net);
11649 
11650 	mutex_lock(&nft_net->commit_mutex);
11651 	__nft_release_hooks(net);
11652 	mutex_unlock(&nft_net->commit_mutex);
11653 }
11654 
nf_tables_exit_net(struct net * net)11655 static void __net_exit nf_tables_exit_net(struct net *net)
11656 {
11657 	struct nftables_pernet *nft_net = nft_pernet(net);
11658 	unsigned int gc_seq;
11659 
11660 	mutex_lock(&nft_net->commit_mutex);
11661 
11662 	gc_seq = nft_gc_seq_begin(nft_net);
11663 
11664 	WARN_ON_ONCE(!list_empty(&nft_net->commit_list));
11665 	WARN_ON_ONCE(!list_empty(&nft_net->commit_set_list));
11666 
11667 	if (!list_empty(&nft_net->module_list))
11668 		nf_tables_module_autoload_cleanup(net);
11669 
11670 	__nft_release_tables(net);
11671 
11672 	nft_gc_seq_end(nft_net, gc_seq);
11673 
11674 	mutex_unlock(&nft_net->commit_mutex);
11675 	WARN_ON_ONCE(!list_empty(&nft_net->tables));
11676 	WARN_ON_ONCE(!list_empty(&nft_net->module_list));
11677 	WARN_ON_ONCE(!list_empty(&nft_net->notify_list));
11678 }
11679 
nf_tables_exit_batch(struct list_head * net_exit_list)11680 static void nf_tables_exit_batch(struct list_head *net_exit_list)
11681 {
11682 	flush_work(&trans_gc_work);
11683 }
11684 
11685 static struct pernet_operations nf_tables_net_ops = {
11686 	.init		= nf_tables_init_net,
11687 	.pre_exit	= nf_tables_pre_exit_net,
11688 	.exit		= nf_tables_exit_net,
11689 	.exit_batch	= nf_tables_exit_batch,
11690 	.id		= &nf_tables_net_id,
11691 	.size		= sizeof(struct nftables_pernet),
11692 };
11693 
nf_tables_module_init(void)11694 static int __init nf_tables_module_init(void)
11695 {
11696 	int err;
11697 
11698 	BUILD_BUG_ON(offsetof(struct nft_trans_table, nft_trans) != 0);
11699 	BUILD_BUG_ON(offsetof(struct nft_trans_chain, nft_trans_binding.nft_trans) != 0);
11700 	BUILD_BUG_ON(offsetof(struct nft_trans_rule, nft_trans) != 0);
11701 	BUILD_BUG_ON(offsetof(struct nft_trans_set, nft_trans_binding.nft_trans) != 0);
11702 	BUILD_BUG_ON(offsetof(struct nft_trans_elem, nft_trans) != 0);
11703 	BUILD_BUG_ON(offsetof(struct nft_trans_obj, nft_trans) != 0);
11704 	BUILD_BUG_ON(offsetof(struct nft_trans_flowtable, nft_trans) != 0);
11705 
11706 	err = register_pernet_subsys(&nf_tables_net_ops);
11707 	if (err < 0)
11708 		return err;
11709 
11710 	err = nft_chain_filter_init();
11711 	if (err < 0)
11712 		goto err_chain_filter;
11713 
11714 	err = nf_tables_core_module_init();
11715 	if (err < 0)
11716 		goto err_core_module;
11717 
11718 	err = register_netdevice_notifier(&nf_tables_flowtable_notifier);
11719 	if (err < 0)
11720 		goto err_netdev_notifier;
11721 
11722 	err = rhltable_init(&nft_objname_ht, &nft_objname_ht_params);
11723 	if (err < 0)
11724 		goto err_rht_objname;
11725 
11726 	err = nft_offload_init();
11727 	if (err < 0)
11728 		goto err_offload;
11729 
11730 	err = netlink_register_notifier(&nft_nl_notifier);
11731 	if (err < 0)
11732 		goto err_netlink_notifier;
11733 
11734 	/* must be last */
11735 	err = nfnetlink_subsys_register(&nf_tables_subsys);
11736 	if (err < 0)
11737 		goto err_nfnl_subsys;
11738 
11739 	nft_chain_route_init();
11740 
11741 	return err;
11742 
11743 err_nfnl_subsys:
11744 	netlink_unregister_notifier(&nft_nl_notifier);
11745 err_netlink_notifier:
11746 	nft_offload_exit();
11747 err_offload:
11748 	rhltable_destroy(&nft_objname_ht);
11749 err_rht_objname:
11750 	unregister_netdevice_notifier(&nf_tables_flowtable_notifier);
11751 err_netdev_notifier:
11752 	nf_tables_core_module_exit();
11753 err_core_module:
11754 	nft_chain_filter_fini();
11755 err_chain_filter:
11756 	unregister_pernet_subsys(&nf_tables_net_ops);
11757 	return err;
11758 }
11759 
nf_tables_module_exit(void)11760 static void __exit nf_tables_module_exit(void)
11761 {
11762 	nfnetlink_subsys_unregister(&nf_tables_subsys);
11763 	netlink_unregister_notifier(&nft_nl_notifier);
11764 	nft_offload_exit();
11765 	unregister_netdevice_notifier(&nf_tables_flowtable_notifier);
11766 	nft_chain_filter_fini();
11767 	nft_chain_route_fini();
11768 	nf_tables_trans_destroy_flush_work();
11769 	unregister_pernet_subsys(&nf_tables_net_ops);
11770 	cancel_work_sync(&trans_gc_work);
11771 	cancel_work_sync(&trans_destroy_work);
11772 	rcu_barrier();
11773 	rhltable_destroy(&nft_objname_ht);
11774 	nf_tables_core_module_exit();
11775 }
11776 
11777 module_init(nf_tables_module_init);
11778 module_exit(nf_tables_module_exit);
11779 
11780 MODULE_LICENSE("GPL");
11781 MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
11782 MODULE_DESCRIPTION("Framework for packet filtering and classification");
11783 MODULE_ALIAS_NFNL_SUBSYS(NFNL_SUBSYS_NFTABLES);
11784