1/*
2 *  ebtables
3 *
4 *  Author:
5 *  Bart De Schuymer		<bdschuym@pandora.be>
6 *
7 *  ebtables.c,v 2.0, July, 2002
8 *
9 *  This code is stongly inspired on the iptables code which is
10 *  Copyright (C) 1999 Paul `Rusty' Russell & Michael J. Neuling
11 *
12 *  This program is free software; you can redistribute it and/or
13 *  modify it under the terms of the GNU General Public License
14 *  as published by the Free Software Foundation; either version
15 *  2 of the License, or (at your option) any later version.
16 */
17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18#include <linux/kmod.h>
19#include <linux/module.h>
20#include <linux/vmalloc.h>
21#include <linux/netfilter/x_tables.h>
22#include <linux/netfilter_bridge/ebtables.h>
23#include <linux/spinlock.h>
24#include <linux/mutex.h>
25#include <linux/slab.h>
26#include <asm/uaccess.h>
27#include <linux/smp.h>
28#include <linux/cpumask.h>
29#include <linux/audit.h>
30#include <net/sock.h>
31/* needed for logical [in,out]-dev filtering */
32#include "../br_private.h"
33
34#define BUGPRINT(format, args...) printk("kernel msg: ebtables bug: please "\
35					 "report to author: "format, ## args)
36/* #define BUGPRINT(format, args...) */
37
38/*
39 * Each cpu has its own set of counters, so there is no need for write_lock in
40 * the softirq
41 * For reading or updating the counters, the user context needs to
42 * get a write_lock
43 */
44
45/* The size of each set of counters is altered to get cache alignment */
46#define SMP_ALIGN(x) (((x) + SMP_CACHE_BYTES-1) & ~(SMP_CACHE_BYTES-1))
47#define COUNTER_OFFSET(n) (SMP_ALIGN(n * sizeof(struct ebt_counter)))
48#define COUNTER_BASE(c, n, cpu) ((struct ebt_counter *)(((char *)c) + \
49   COUNTER_OFFSET(n) * cpu))
50
51
52
53static DEFINE_MUTEX(ebt_mutex);
54
55#ifdef CONFIG_COMPAT
56static void ebt_standard_compat_from_user(void *dst, const void *src)
57{
58	int v = *(compat_int_t *)src;
59
60	if (v >= 0)
61		v += xt_compat_calc_jump(NFPROTO_BRIDGE, v);
62	memcpy(dst, &v, sizeof(v));
63}
64
65static int ebt_standard_compat_to_user(void __user *dst, const void *src)
66{
67	compat_int_t cv = *(int *)src;
68
69	if (cv >= 0)
70		cv -= xt_compat_calc_jump(NFPROTO_BRIDGE, cv);
71	return copy_to_user(dst, &cv, sizeof(cv)) ? -EFAULT : 0;
72}
73#endif
74
75
76static struct xt_target ebt_standard_target = {
77	.name       = "standard",
78	.revision   = 0,
79	.family     = NFPROTO_BRIDGE,
80	.targetsize = sizeof(int),
81#ifdef CONFIG_COMPAT
82	.compatsize = sizeof(compat_int_t),
83	.compat_from_user = ebt_standard_compat_from_user,
84	.compat_to_user =  ebt_standard_compat_to_user,
85#endif
86};
87
88static inline int
89ebt_do_watcher(const struct ebt_entry_watcher *w, struct sk_buff *skb,
90	       struct xt_action_param *par)
91{
92	par->target   = w->u.watcher;
93	par->targinfo = w->data;
94	w->u.watcher->target(skb, par);
95	/* watchers don't give a verdict */
96	return 0;
97}
98
99static inline int
100ebt_do_match(struct ebt_entry_match *m, const struct sk_buff *skb,
101	     struct xt_action_param *par)
102{
103	par->match     = m->u.match;
104	par->matchinfo = m->data;
105	return m->u.match->match(skb, par) ? EBT_MATCH : EBT_NOMATCH;
106}
107
108static inline int
109ebt_dev_check(const char *entry, const struct net_device *device)
110{
111	int i = 0;
112	const char *devname;
113
114	if (*entry == '\0')
115		return 0;
116	if (!device)
117		return 1;
118	devname = device->name;
119	/* 1 is the wildcard token */
120	while (entry[i] != '\0' && entry[i] != 1 && entry[i] == devname[i])
121		i++;
122	return devname[i] != entry[i] && entry[i] != 1;
123}
124
125#define FWINV2(bool, invflg) ((bool) ^ !!(e->invflags & invflg))
126/* process standard matches */
127static inline int
128ebt_basic_match(const struct ebt_entry *e, const struct sk_buff *skb,
129                const struct net_device *in, const struct net_device *out)
130{
131	const struct ethhdr *h = eth_hdr(skb);
132	const struct net_bridge_port *p;
133	__be16 ethproto;
134	int verdict, i;
135
136	if (skb_vlan_tag_present(skb))
137		ethproto = htons(ETH_P_8021Q);
138	else
139		ethproto = h->h_proto;
140
141	if (e->bitmask & EBT_802_3) {
142		if (FWINV2(ntohs(ethproto) >= ETH_P_802_3_MIN, EBT_IPROTO))
143			return 1;
144	} else if (!(e->bitmask & EBT_NOPROTO) &&
145	   FWINV2(e->ethproto != ethproto, EBT_IPROTO))
146		return 1;
147
148	if (FWINV2(ebt_dev_check(e->in, in), EBT_IIN))
149		return 1;
150	if (FWINV2(ebt_dev_check(e->out, out), EBT_IOUT))
151		return 1;
152	/* rcu_read_lock()ed by nf_hook_slow */
153	if (in && (p = br_port_get_rcu(in)) != NULL &&
154	    FWINV2(ebt_dev_check(e->logical_in, p->br->dev), EBT_ILOGICALIN))
155		return 1;
156	if (out && (p = br_port_get_rcu(out)) != NULL &&
157	    FWINV2(ebt_dev_check(e->logical_out, p->br->dev), EBT_ILOGICALOUT))
158		return 1;
159
160	if (e->bitmask & EBT_SOURCEMAC) {
161		verdict = 0;
162		for (i = 0; i < 6; i++)
163			verdict |= (h->h_source[i] ^ e->sourcemac[i]) &
164			   e->sourcemsk[i];
165		if (FWINV2(verdict != 0, EBT_ISOURCE) )
166			return 1;
167	}
168	if (e->bitmask & EBT_DESTMAC) {
169		verdict = 0;
170		for (i = 0; i < 6; i++)
171			verdict |= (h->h_dest[i] ^ e->destmac[i]) &
172			   e->destmsk[i];
173		if (FWINV2(verdict != 0, EBT_IDEST) )
174			return 1;
175	}
176	return 0;
177}
178
179static inline __pure
180struct ebt_entry *ebt_next_entry(const struct ebt_entry *entry)
181{
182	return (void *)entry + entry->next_offset;
183}
184
185/* Do some firewalling */
186unsigned int ebt_do_table (unsigned int hook, struct sk_buff *skb,
187   const struct net_device *in, const struct net_device *out,
188   struct ebt_table *table)
189{
190	int i, nentries;
191	struct ebt_entry *point;
192	struct ebt_counter *counter_base, *cb_base;
193	const struct ebt_entry_target *t;
194	int verdict, sp = 0;
195	struct ebt_chainstack *cs;
196	struct ebt_entries *chaininfo;
197	const char *base;
198	const struct ebt_table_info *private;
199	struct xt_action_param acpar;
200
201	acpar.family  = NFPROTO_BRIDGE;
202	acpar.in      = in;
203	acpar.out     = out;
204	acpar.hotdrop = false;
205	acpar.hooknum = hook;
206
207	read_lock_bh(&table->lock);
208	private = table->private;
209	cb_base = COUNTER_BASE(private->counters, private->nentries,
210	   smp_processor_id());
211	if (private->chainstack)
212		cs = private->chainstack[smp_processor_id()];
213	else
214		cs = NULL;
215	chaininfo = private->hook_entry[hook];
216	nentries = private->hook_entry[hook]->nentries;
217	point = (struct ebt_entry *)(private->hook_entry[hook]->data);
218	counter_base = cb_base + private->hook_entry[hook]->counter_offset;
219	/* base for chain jumps */
220	base = private->entries;
221	i = 0;
222	while (i < nentries) {
223		if (ebt_basic_match(point, skb, in, out))
224			goto letscontinue;
225
226		if (EBT_MATCH_ITERATE(point, ebt_do_match, skb, &acpar) != 0)
227			goto letscontinue;
228		if (acpar.hotdrop) {
229			read_unlock_bh(&table->lock);
230			return NF_DROP;
231		}
232
233		/* increase counter */
234		(*(counter_base + i)).pcnt++;
235		(*(counter_base + i)).bcnt += skb->len;
236
237		/* these should only watch: not modify, nor tell us
238		   what to do with the packet */
239		EBT_WATCHER_ITERATE(point, ebt_do_watcher, skb, &acpar);
240
241		t = (struct ebt_entry_target *)
242		   (((char *)point) + point->target_offset);
243		/* standard target */
244		if (!t->u.target->target)
245			verdict = ((struct ebt_standard_target *)t)->verdict;
246		else {
247			acpar.target   = t->u.target;
248			acpar.targinfo = t->data;
249			verdict = t->u.target->target(skb, &acpar);
250		}
251		if (verdict == EBT_ACCEPT) {
252			read_unlock_bh(&table->lock);
253			return NF_ACCEPT;
254		}
255		if (verdict == EBT_DROP) {
256			read_unlock_bh(&table->lock);
257			return NF_DROP;
258		}
259		if (verdict == EBT_RETURN) {
260letsreturn:
261#ifdef CONFIG_NETFILTER_DEBUG
262			if (sp == 0) {
263				BUGPRINT("RETURN on base chain");
264				/* act like this is EBT_CONTINUE */
265				goto letscontinue;
266			}
267#endif
268			sp--;
269			/* put all the local variables right */
270			i = cs[sp].n;
271			chaininfo = cs[sp].chaininfo;
272			nentries = chaininfo->nentries;
273			point = cs[sp].e;
274			counter_base = cb_base +
275			   chaininfo->counter_offset;
276			continue;
277		}
278		if (verdict == EBT_CONTINUE)
279			goto letscontinue;
280#ifdef CONFIG_NETFILTER_DEBUG
281		if (verdict < 0) {
282			BUGPRINT("bogus standard verdict\n");
283			read_unlock_bh(&table->lock);
284			return NF_DROP;
285		}
286#endif
287		/* jump to a udc */
288		cs[sp].n = i + 1;
289		cs[sp].chaininfo = chaininfo;
290		cs[sp].e = ebt_next_entry(point);
291		i = 0;
292		chaininfo = (struct ebt_entries *) (base + verdict);
293#ifdef CONFIG_NETFILTER_DEBUG
294		if (chaininfo->distinguisher) {
295			BUGPRINT("jump to non-chain\n");
296			read_unlock_bh(&table->lock);
297			return NF_DROP;
298		}
299#endif
300		nentries = chaininfo->nentries;
301		point = (struct ebt_entry *)chaininfo->data;
302		counter_base = cb_base + chaininfo->counter_offset;
303		sp++;
304		continue;
305letscontinue:
306		point = ebt_next_entry(point);
307		i++;
308	}
309
310	/* I actually like this :) */
311	if (chaininfo->policy == EBT_RETURN)
312		goto letsreturn;
313	if (chaininfo->policy == EBT_ACCEPT) {
314		read_unlock_bh(&table->lock);
315		return NF_ACCEPT;
316	}
317	read_unlock_bh(&table->lock);
318	return NF_DROP;
319}
320
321/* If it succeeds, returns element and locks mutex */
322static inline void *
323find_inlist_lock_noload(struct list_head *head, const char *name, int *error,
324   struct mutex *mutex)
325{
326	struct {
327		struct list_head list;
328		char name[EBT_FUNCTION_MAXNAMELEN];
329	} *e;
330
331	mutex_lock(mutex);
332	list_for_each_entry(e, head, list) {
333		if (strcmp(e->name, name) == 0)
334			return e;
335	}
336	*error = -ENOENT;
337	mutex_unlock(mutex);
338	return NULL;
339}
340
341static void *
342find_inlist_lock(struct list_head *head, const char *name, const char *prefix,
343   int *error, struct mutex *mutex)
344{
345	return try_then_request_module(
346			find_inlist_lock_noload(head, name, error, mutex),
347			"%s%s", prefix, name);
348}
349
350static inline struct ebt_table *
351find_table_lock(struct net *net, const char *name, int *error,
352		struct mutex *mutex)
353{
354	return find_inlist_lock(&net->xt.tables[NFPROTO_BRIDGE], name,
355				"ebtable_", error, mutex);
356}
357
358static inline int
359ebt_check_match(struct ebt_entry_match *m, struct xt_mtchk_param *par,
360		unsigned int *cnt)
361{
362	const struct ebt_entry *e = par->entryinfo;
363	struct xt_match *match;
364	size_t left = ((char *)e + e->watchers_offset) - (char *)m;
365	int ret;
366
367	if (left < sizeof(struct ebt_entry_match) ||
368	    left - sizeof(struct ebt_entry_match) < m->match_size)
369		return -EINVAL;
370
371	match = xt_request_find_match(NFPROTO_BRIDGE, m->u.name, 0);
372	if (IS_ERR(match))
373		return PTR_ERR(match);
374	m->u.match = match;
375
376	par->match     = match;
377	par->matchinfo = m->data;
378	ret = xt_check_match(par, m->match_size,
379	      e->ethproto, e->invflags & EBT_IPROTO);
380	if (ret < 0) {
381		module_put(match->me);
382		return ret;
383	}
384
385	(*cnt)++;
386	return 0;
387}
388
389static inline int
390ebt_check_watcher(struct ebt_entry_watcher *w, struct xt_tgchk_param *par,
391		  unsigned int *cnt)
392{
393	const struct ebt_entry *e = par->entryinfo;
394	struct xt_target *watcher;
395	size_t left = ((char *)e + e->target_offset) - (char *)w;
396	int ret;
397
398	if (left < sizeof(struct ebt_entry_watcher) ||
399	   left - sizeof(struct ebt_entry_watcher) < w->watcher_size)
400		return -EINVAL;
401
402	watcher = xt_request_find_target(NFPROTO_BRIDGE, w->u.name, 0);
403	if (IS_ERR(watcher))
404		return PTR_ERR(watcher);
405	w->u.watcher = watcher;
406
407	par->target   = watcher;
408	par->targinfo = w->data;
409	ret = xt_check_target(par, w->watcher_size,
410	      e->ethproto, e->invflags & EBT_IPROTO);
411	if (ret < 0) {
412		module_put(watcher->me);
413		return ret;
414	}
415
416	(*cnt)++;
417	return 0;
418}
419
420static int ebt_verify_pointers(const struct ebt_replace *repl,
421			       struct ebt_table_info *newinfo)
422{
423	unsigned int limit = repl->entries_size;
424	unsigned int valid_hooks = repl->valid_hooks;
425	unsigned int offset = 0;
426	int i;
427
428	for (i = 0; i < NF_BR_NUMHOOKS; i++)
429		newinfo->hook_entry[i] = NULL;
430
431	newinfo->entries_size = repl->entries_size;
432	newinfo->nentries = repl->nentries;
433
434	while (offset < limit) {
435		size_t left = limit - offset;
436		struct ebt_entry *e = (void *)newinfo->entries + offset;
437
438		if (left < sizeof(unsigned int))
439			break;
440
441		for (i = 0; i < NF_BR_NUMHOOKS; i++) {
442			if ((valid_hooks & (1 << i)) == 0)
443				continue;
444			if ((char __user *)repl->hook_entry[i] ==
445			     repl->entries + offset)
446				break;
447		}
448
449		if (i != NF_BR_NUMHOOKS || !(e->bitmask & EBT_ENTRY_OR_ENTRIES)) {
450			if (e->bitmask != 0) {
451				/* we make userspace set this right,
452				   so there is no misunderstanding */
453				BUGPRINT("EBT_ENTRY_OR_ENTRIES shouldn't be set "
454					 "in distinguisher\n");
455				return -EINVAL;
456			}
457			if (i != NF_BR_NUMHOOKS)
458				newinfo->hook_entry[i] = (struct ebt_entries *)e;
459			if (left < sizeof(struct ebt_entries))
460				break;
461			offset += sizeof(struct ebt_entries);
462		} else {
463			if (left < sizeof(struct ebt_entry))
464				break;
465			if (left < e->next_offset)
466				break;
467			if (e->next_offset < sizeof(struct ebt_entry))
468				return -EINVAL;
469			offset += e->next_offset;
470		}
471	}
472	if (offset != limit) {
473		BUGPRINT("entries_size too small\n");
474		return -EINVAL;
475	}
476
477	/* check if all valid hooks have a chain */
478	for (i = 0; i < NF_BR_NUMHOOKS; i++) {
479		if (!newinfo->hook_entry[i] &&
480		   (valid_hooks & (1 << i))) {
481			BUGPRINT("Valid hook without chain\n");
482			return -EINVAL;
483		}
484	}
485	return 0;
486}
487
488/*
489 * this one is very careful, as it is the first function
490 * to parse the userspace data
491 */
492static inline int
493ebt_check_entry_size_and_hooks(const struct ebt_entry *e,
494   const struct ebt_table_info *newinfo,
495   unsigned int *n, unsigned int *cnt,
496   unsigned int *totalcnt, unsigned int *udc_cnt)
497{
498	int i;
499
500	for (i = 0; i < NF_BR_NUMHOOKS; i++) {
501		if ((void *)e == (void *)newinfo->hook_entry[i])
502			break;
503	}
504	/* beginning of a new chain
505	   if i == NF_BR_NUMHOOKS it must be a user defined chain */
506	if (i != NF_BR_NUMHOOKS || !e->bitmask) {
507		/* this checks if the previous chain has as many entries
508		   as it said it has */
509		if (*n != *cnt) {
510			BUGPRINT("nentries does not equal the nr of entries "
511				 "in the chain\n");
512			return -EINVAL;
513		}
514		if (((struct ebt_entries *)e)->policy != EBT_DROP &&
515		   ((struct ebt_entries *)e)->policy != EBT_ACCEPT) {
516			/* only RETURN from udc */
517			if (i != NF_BR_NUMHOOKS ||
518			   ((struct ebt_entries *)e)->policy != EBT_RETURN) {
519				BUGPRINT("bad policy\n");
520				return -EINVAL;
521			}
522		}
523		if (i == NF_BR_NUMHOOKS) /* it's a user defined chain */
524			(*udc_cnt)++;
525		if (((struct ebt_entries *)e)->counter_offset != *totalcnt) {
526			BUGPRINT("counter_offset != totalcnt");
527			return -EINVAL;
528		}
529		*n = ((struct ebt_entries *)e)->nentries;
530		*cnt = 0;
531		return 0;
532	}
533	/* a plain old entry, heh */
534	if (sizeof(struct ebt_entry) > e->watchers_offset ||
535	   e->watchers_offset > e->target_offset ||
536	   e->target_offset >= e->next_offset) {
537		BUGPRINT("entry offsets not in right order\n");
538		return -EINVAL;
539	}
540	/* this is not checked anywhere else */
541	if (e->next_offset - e->target_offset < sizeof(struct ebt_entry_target)) {
542		BUGPRINT("target size too small\n");
543		return -EINVAL;
544	}
545	(*cnt)++;
546	(*totalcnt)++;
547	return 0;
548}
549
550struct ebt_cl_stack
551{
552	struct ebt_chainstack cs;
553	int from;
554	unsigned int hookmask;
555};
556
557/*
558 * we need these positions to check that the jumps to a different part of the
559 * entries is a jump to the beginning of a new chain.
560 */
561static inline int
562ebt_get_udc_positions(struct ebt_entry *e, struct ebt_table_info *newinfo,
563   unsigned int *n, struct ebt_cl_stack *udc)
564{
565	int i;
566
567	/* we're only interested in chain starts */
568	if (e->bitmask)
569		return 0;
570	for (i = 0; i < NF_BR_NUMHOOKS; i++) {
571		if (newinfo->hook_entry[i] == (struct ebt_entries *)e)
572			break;
573	}
574	/* only care about udc */
575	if (i != NF_BR_NUMHOOKS)
576		return 0;
577
578	udc[*n].cs.chaininfo = (struct ebt_entries *)e;
579	/* these initialisations are depended on later in check_chainloops() */
580	udc[*n].cs.n = 0;
581	udc[*n].hookmask = 0;
582
583	(*n)++;
584	return 0;
585}
586
587static inline int
588ebt_cleanup_match(struct ebt_entry_match *m, struct net *net, unsigned int *i)
589{
590	struct xt_mtdtor_param par;
591
592	if (i && (*i)-- == 0)
593		return 1;
594
595	par.net       = net;
596	par.match     = m->u.match;
597	par.matchinfo = m->data;
598	par.family    = NFPROTO_BRIDGE;
599	if (par.match->destroy != NULL)
600		par.match->destroy(&par);
601	module_put(par.match->me);
602	return 0;
603}
604
605static inline int
606ebt_cleanup_watcher(struct ebt_entry_watcher *w, struct net *net, unsigned int *i)
607{
608	struct xt_tgdtor_param par;
609
610	if (i && (*i)-- == 0)
611		return 1;
612
613	par.net      = net;
614	par.target   = w->u.watcher;
615	par.targinfo = w->data;
616	par.family   = NFPROTO_BRIDGE;
617	if (par.target->destroy != NULL)
618		par.target->destroy(&par);
619	module_put(par.target->me);
620	return 0;
621}
622
623static inline int
624ebt_cleanup_entry(struct ebt_entry *e, struct net *net, unsigned int *cnt)
625{
626	struct xt_tgdtor_param par;
627	struct ebt_entry_target *t;
628
629	if (e->bitmask == 0)
630		return 0;
631	/* we're done */
632	if (cnt && (*cnt)-- == 0)
633		return 1;
634	EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, net, NULL);
635	EBT_MATCH_ITERATE(e, ebt_cleanup_match, net, NULL);
636	t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
637
638	par.net      = net;
639	par.target   = t->u.target;
640	par.targinfo = t->data;
641	par.family   = NFPROTO_BRIDGE;
642	if (par.target->destroy != NULL)
643		par.target->destroy(&par);
644	module_put(par.target->me);
645	return 0;
646}
647
648static inline int
649ebt_check_entry(struct ebt_entry *e, struct net *net,
650   const struct ebt_table_info *newinfo,
651   const char *name, unsigned int *cnt,
652   struct ebt_cl_stack *cl_s, unsigned int udc_cnt)
653{
654	struct ebt_entry_target *t;
655	struct xt_target *target;
656	unsigned int i, j, hook = 0, hookmask = 0;
657	size_t gap;
658	int ret;
659	struct xt_mtchk_param mtpar;
660	struct xt_tgchk_param tgpar;
661
662	/* don't mess with the struct ebt_entries */
663	if (e->bitmask == 0)
664		return 0;
665
666	if (e->bitmask & ~EBT_F_MASK) {
667		BUGPRINT("Unknown flag for bitmask\n");
668		return -EINVAL;
669	}
670	if (e->invflags & ~EBT_INV_MASK) {
671		BUGPRINT("Unknown flag for inv bitmask\n");
672		return -EINVAL;
673	}
674	if ( (e->bitmask & EBT_NOPROTO) && (e->bitmask & EBT_802_3) ) {
675		BUGPRINT("NOPROTO & 802_3 not allowed\n");
676		return -EINVAL;
677	}
678	/* what hook do we belong to? */
679	for (i = 0; i < NF_BR_NUMHOOKS; i++) {
680		if (!newinfo->hook_entry[i])
681			continue;
682		if ((char *)newinfo->hook_entry[i] < (char *)e)
683			hook = i;
684		else
685			break;
686	}
687	/* (1 << NF_BR_NUMHOOKS) tells the check functions the rule is on
688	   a base chain */
689	if (i < NF_BR_NUMHOOKS)
690		hookmask = (1 << hook) | (1 << NF_BR_NUMHOOKS);
691	else {
692		for (i = 0; i < udc_cnt; i++)
693			if ((char *)(cl_s[i].cs.chaininfo) > (char *)e)
694				break;
695		if (i == 0)
696			hookmask = (1 << hook) | (1 << NF_BR_NUMHOOKS);
697		else
698			hookmask = cl_s[i - 1].hookmask;
699	}
700	i = 0;
701
702	mtpar.net	= tgpar.net       = net;
703	mtpar.table     = tgpar.table     = name;
704	mtpar.entryinfo = tgpar.entryinfo = e;
705	mtpar.hook_mask = tgpar.hook_mask = hookmask;
706	mtpar.family    = tgpar.family    = NFPROTO_BRIDGE;
707	ret = EBT_MATCH_ITERATE(e, ebt_check_match, &mtpar, &i);
708	if (ret != 0)
709		goto cleanup_matches;
710	j = 0;
711	ret = EBT_WATCHER_ITERATE(e, ebt_check_watcher, &tgpar, &j);
712	if (ret != 0)
713		goto cleanup_watchers;
714	t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
715	gap = e->next_offset - e->target_offset;
716
717	target = xt_request_find_target(NFPROTO_BRIDGE, t->u.name, 0);
718	if (IS_ERR(target)) {
719		ret = PTR_ERR(target);
720		goto cleanup_watchers;
721	}
722
723	t->u.target = target;
724	if (t->u.target == &ebt_standard_target) {
725		if (gap < sizeof(struct ebt_standard_target)) {
726			BUGPRINT("Standard target size too big\n");
727			ret = -EFAULT;
728			goto cleanup_watchers;
729		}
730		if (((struct ebt_standard_target *)t)->verdict <
731		   -NUM_STANDARD_TARGETS) {
732			BUGPRINT("Invalid standard target\n");
733			ret = -EFAULT;
734			goto cleanup_watchers;
735		}
736	} else if (t->target_size > gap - sizeof(struct ebt_entry_target)) {
737		module_put(t->u.target->me);
738		ret = -EFAULT;
739		goto cleanup_watchers;
740	}
741
742	tgpar.target   = target;
743	tgpar.targinfo = t->data;
744	ret = xt_check_target(&tgpar, t->target_size,
745	      e->ethproto, e->invflags & EBT_IPROTO);
746	if (ret < 0) {
747		module_put(target->me);
748		goto cleanup_watchers;
749	}
750	(*cnt)++;
751	return 0;
752cleanup_watchers:
753	EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, net, &j);
754cleanup_matches:
755	EBT_MATCH_ITERATE(e, ebt_cleanup_match, net, &i);
756	return ret;
757}
758
759/*
760 * checks for loops and sets the hook mask for udc
761 * the hook mask for udc tells us from which base chains the udc can be
762 * accessed. This mask is a parameter to the check() functions of the extensions
763 */
764static int check_chainloops(const struct ebt_entries *chain, struct ebt_cl_stack *cl_s,
765   unsigned int udc_cnt, unsigned int hooknr, char *base)
766{
767	int i, chain_nr = -1, pos = 0, nentries = chain->nentries, verdict;
768	const struct ebt_entry *e = (struct ebt_entry *)chain->data;
769	const struct ebt_entry_target *t;
770
771	while (pos < nentries || chain_nr != -1) {
772		/* end of udc, go back one 'recursion' step */
773		if (pos == nentries) {
774			/* put back values of the time when this chain was called */
775			e = cl_s[chain_nr].cs.e;
776			if (cl_s[chain_nr].from != -1)
777				nentries =
778				cl_s[cl_s[chain_nr].from].cs.chaininfo->nentries;
779			else
780				nentries = chain->nentries;
781			pos = cl_s[chain_nr].cs.n;
782			/* make sure we won't see a loop that isn't one */
783			cl_s[chain_nr].cs.n = 0;
784			chain_nr = cl_s[chain_nr].from;
785			if (pos == nentries)
786				continue;
787		}
788		t = (struct ebt_entry_target *)
789		   (((char *)e) + e->target_offset);
790		if (strcmp(t->u.name, EBT_STANDARD_TARGET))
791			goto letscontinue;
792		if (e->target_offset + sizeof(struct ebt_standard_target) >
793		   e->next_offset) {
794			BUGPRINT("Standard target size too big\n");
795			return -1;
796		}
797		verdict = ((struct ebt_standard_target *)t)->verdict;
798		if (verdict >= 0) { /* jump to another chain */
799			struct ebt_entries *hlp2 =
800			   (struct ebt_entries *)(base + verdict);
801			for (i = 0; i < udc_cnt; i++)
802				if (hlp2 == cl_s[i].cs.chaininfo)
803					break;
804			/* bad destination or loop */
805			if (i == udc_cnt) {
806				BUGPRINT("bad destination\n");
807				return -1;
808			}
809			if (cl_s[i].cs.n) {
810				BUGPRINT("loop\n");
811				return -1;
812			}
813			if (cl_s[i].hookmask & (1 << hooknr))
814				goto letscontinue;
815			/* this can't be 0, so the loop test is correct */
816			cl_s[i].cs.n = pos + 1;
817			pos = 0;
818			cl_s[i].cs.e = ebt_next_entry(e);
819			e = (struct ebt_entry *)(hlp2->data);
820			nentries = hlp2->nentries;
821			cl_s[i].from = chain_nr;
822			chain_nr = i;
823			/* this udc is accessible from the base chain for hooknr */
824			cl_s[i].hookmask |= (1 << hooknr);
825			continue;
826		}
827letscontinue:
828		e = ebt_next_entry(e);
829		pos++;
830	}
831	return 0;
832}
833
834/* do the parsing of the table/chains/entries/matches/watchers/targets, heh */
835static int translate_table(struct net *net, const char *name,
836			   struct ebt_table_info *newinfo)
837{
838	unsigned int i, j, k, udc_cnt;
839	int ret;
840	struct ebt_cl_stack *cl_s = NULL; /* used in the checking for chain loops */
841
842	i = 0;
843	while (i < NF_BR_NUMHOOKS && !newinfo->hook_entry[i])
844		i++;
845	if (i == NF_BR_NUMHOOKS) {
846		BUGPRINT("No valid hooks specified\n");
847		return -EINVAL;
848	}
849	if (newinfo->hook_entry[i] != (struct ebt_entries *)newinfo->entries) {
850		BUGPRINT("Chains don't start at beginning\n");
851		return -EINVAL;
852	}
853	/* make sure chains are ordered after each other in same order
854	   as their corresponding hooks */
855	for (j = i + 1; j < NF_BR_NUMHOOKS; j++) {
856		if (!newinfo->hook_entry[j])
857			continue;
858		if (newinfo->hook_entry[j] <= newinfo->hook_entry[i]) {
859			BUGPRINT("Hook order must be followed\n");
860			return -EINVAL;
861		}
862		i = j;
863	}
864
865	/* do some early checkings and initialize some things */
866	i = 0; /* holds the expected nr. of entries for the chain */
867	j = 0; /* holds the up to now counted entries for the chain */
868	k = 0; /* holds the total nr. of entries, should equal
869		  newinfo->nentries afterwards */
870	udc_cnt = 0; /* will hold the nr. of user defined chains (udc) */
871	ret = EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
872	   ebt_check_entry_size_and_hooks, newinfo,
873	   &i, &j, &k, &udc_cnt);
874
875	if (ret != 0)
876		return ret;
877
878	if (i != j) {
879		BUGPRINT("nentries does not equal the nr of entries in the "
880			 "(last) chain\n");
881		return -EINVAL;
882	}
883	if (k != newinfo->nentries) {
884		BUGPRINT("Total nentries is wrong\n");
885		return -EINVAL;
886	}
887
888	/* get the location of the udc, put them in an array
889	   while we're at it, allocate the chainstack */
890	if (udc_cnt) {
891		/* this will get free'd in do_replace()/ebt_register_table()
892		   if an error occurs */
893		newinfo->chainstack =
894			vmalloc(nr_cpu_ids * sizeof(*(newinfo->chainstack)));
895		if (!newinfo->chainstack)
896			return -ENOMEM;
897		for_each_possible_cpu(i) {
898			newinfo->chainstack[i] =
899			  vmalloc(udc_cnt * sizeof(*(newinfo->chainstack[0])));
900			if (!newinfo->chainstack[i]) {
901				while (i)
902					vfree(newinfo->chainstack[--i]);
903				vfree(newinfo->chainstack);
904				newinfo->chainstack = NULL;
905				return -ENOMEM;
906			}
907		}
908
909		cl_s = vmalloc(udc_cnt * sizeof(*cl_s));
910		if (!cl_s)
911			return -ENOMEM;
912		i = 0; /* the i'th udc */
913		EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
914		   ebt_get_udc_positions, newinfo, &i, cl_s);
915		/* sanity check */
916		if (i != udc_cnt) {
917			BUGPRINT("i != udc_cnt\n");
918			vfree(cl_s);
919			return -EFAULT;
920		}
921	}
922
923	/* Check for loops */
924	for (i = 0; i < NF_BR_NUMHOOKS; i++)
925		if (newinfo->hook_entry[i])
926			if (check_chainloops(newinfo->hook_entry[i],
927			   cl_s, udc_cnt, i, newinfo->entries)) {
928				vfree(cl_s);
929				return -EINVAL;
930			}
931
932	/* we now know the following (along with E=mc²):
933	   - the nr of entries in each chain is right
934	   - the size of the allocated space is right
935	   - all valid hooks have a corresponding chain
936	   - there are no loops
937	   - wrong data can still be on the level of a single entry
938	   - could be there are jumps to places that are not the
939	     beginning of a chain. This can only occur in chains that
940	     are not accessible from any base chains, so we don't care. */
941
942	/* used to know what we need to clean up if something goes wrong */
943	i = 0;
944	ret = EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
945	   ebt_check_entry, net, newinfo, name, &i, cl_s, udc_cnt);
946	if (ret != 0) {
947		EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
948				  ebt_cleanup_entry, net, &i);
949	}
950	vfree(cl_s);
951	return ret;
952}
953
954/* called under write_lock */
955static void get_counters(const struct ebt_counter *oldcounters,
956   struct ebt_counter *counters, unsigned int nentries)
957{
958	int i, cpu;
959	struct ebt_counter *counter_base;
960
961	/* counters of cpu 0 */
962	memcpy(counters, oldcounters,
963	       sizeof(struct ebt_counter) * nentries);
964
965	/* add other counters to those of cpu 0 */
966	for_each_possible_cpu(cpu) {
967		if (cpu == 0)
968			continue;
969		counter_base = COUNTER_BASE(oldcounters, nentries, cpu);
970		for (i = 0; i < nentries; i++) {
971			counters[i].pcnt += counter_base[i].pcnt;
972			counters[i].bcnt += counter_base[i].bcnt;
973		}
974	}
975}
976
977static int do_replace_finish(struct net *net, struct ebt_replace *repl,
978			      struct ebt_table_info *newinfo)
979{
980	int ret, i;
981	struct ebt_counter *counterstmp = NULL;
982	/* used to be able to unlock earlier */
983	struct ebt_table_info *table;
984	struct ebt_table *t;
985
986	/* the user wants counters back
987	   the check on the size is done later, when we have the lock */
988	if (repl->num_counters) {
989		unsigned long size = repl->num_counters * sizeof(*counterstmp);
990		counterstmp = vmalloc(size);
991		if (!counterstmp)
992			return -ENOMEM;
993	}
994
995	newinfo->chainstack = NULL;
996	ret = ebt_verify_pointers(repl, newinfo);
997	if (ret != 0)
998		goto free_counterstmp;
999
1000	ret = translate_table(net, repl->name, newinfo);
1001
1002	if (ret != 0)
1003		goto free_counterstmp;
1004
1005	t = find_table_lock(net, repl->name, &ret, &ebt_mutex);
1006	if (!t) {
1007		ret = -ENOENT;
1008		goto free_iterate;
1009	}
1010
1011	/* the table doesn't like it */
1012	if (t->check && (ret = t->check(newinfo, repl->valid_hooks)))
1013		goto free_unlock;
1014
1015	if (repl->num_counters && repl->num_counters != t->private->nentries) {
1016		BUGPRINT("Wrong nr. of counters requested\n");
1017		ret = -EINVAL;
1018		goto free_unlock;
1019	}
1020
1021	/* we have the mutex lock, so no danger in reading this pointer */
1022	table = t->private;
1023	/* make sure the table can only be rmmod'ed if it contains no rules */
1024	if (!table->nentries && newinfo->nentries && !try_module_get(t->me)) {
1025		ret = -ENOENT;
1026		goto free_unlock;
1027	} else if (table->nentries && !newinfo->nentries)
1028		module_put(t->me);
1029	/* we need an atomic snapshot of the counters */
1030	write_lock_bh(&t->lock);
1031	if (repl->num_counters)
1032		get_counters(t->private->counters, counterstmp,
1033		   t->private->nentries);
1034
1035	t->private = newinfo;
1036	write_unlock_bh(&t->lock);
1037	mutex_unlock(&ebt_mutex);
1038	/* so, a user can change the chains while having messed up her counter
1039	   allocation. Only reason why this is done is because this way the lock
1040	   is held only once, while this doesn't bring the kernel into a
1041	   dangerous state. */
1042	if (repl->num_counters &&
1043	   copy_to_user(repl->counters, counterstmp,
1044	   repl->num_counters * sizeof(struct ebt_counter))) {
1045		/* Silent error, can't fail, new table is already in place */
1046		net_warn_ratelimited("ebtables: counters copy to user failed while replacing table\n");
1047	}
1048
1049	/* decrease module count and free resources */
1050	EBT_ENTRY_ITERATE(table->entries, table->entries_size,
1051			  ebt_cleanup_entry, net, NULL);
1052
1053	vfree(table->entries);
1054	if (table->chainstack) {
1055		for_each_possible_cpu(i)
1056			vfree(table->chainstack[i]);
1057		vfree(table->chainstack);
1058	}
1059	vfree(table);
1060
1061	vfree(counterstmp);
1062
1063#ifdef CONFIG_AUDIT
1064	if (audit_enabled) {
1065		struct audit_buffer *ab;
1066
1067		ab = audit_log_start(current->audit_context, GFP_KERNEL,
1068				     AUDIT_NETFILTER_CFG);
1069		if (ab) {
1070			audit_log_format(ab, "table=%s family=%u entries=%u",
1071					 repl->name, AF_BRIDGE, repl->nentries);
1072			audit_log_end(ab);
1073		}
1074	}
1075#endif
1076	return ret;
1077
1078free_unlock:
1079	mutex_unlock(&ebt_mutex);
1080free_iterate:
1081	EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
1082			  ebt_cleanup_entry, net, NULL);
1083free_counterstmp:
1084	vfree(counterstmp);
1085	/* can be initialized in translate_table() */
1086	if (newinfo->chainstack) {
1087		for_each_possible_cpu(i)
1088			vfree(newinfo->chainstack[i]);
1089		vfree(newinfo->chainstack);
1090	}
1091	return ret;
1092}
1093
1094/* replace the table */
1095static int do_replace(struct net *net, const void __user *user,
1096		      unsigned int len)
1097{
1098	int ret, countersize;
1099	struct ebt_table_info *newinfo;
1100	struct ebt_replace tmp;
1101
1102	if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
1103		return -EFAULT;
1104
1105	if (len != sizeof(tmp) + tmp.entries_size) {
1106		BUGPRINT("Wrong len argument\n");
1107		return -EINVAL;
1108	}
1109
1110	if (tmp.entries_size == 0) {
1111		BUGPRINT("Entries_size never zero\n");
1112		return -EINVAL;
1113	}
1114	/* overflow check */
1115	if (tmp.nentries >= ((INT_MAX - sizeof(struct ebt_table_info)) /
1116			NR_CPUS - SMP_CACHE_BYTES) / sizeof(struct ebt_counter))
1117		return -ENOMEM;
1118	if (tmp.num_counters >= INT_MAX / sizeof(struct ebt_counter))
1119		return -ENOMEM;
1120
1121	tmp.name[sizeof(tmp.name) - 1] = 0;
1122
1123	countersize = COUNTER_OFFSET(tmp.nentries) * nr_cpu_ids;
1124	newinfo = vmalloc(sizeof(*newinfo) + countersize);
1125	if (!newinfo)
1126		return -ENOMEM;
1127
1128	if (countersize)
1129		memset(newinfo->counters, 0, countersize);
1130
1131	newinfo->entries = vmalloc(tmp.entries_size);
1132	if (!newinfo->entries) {
1133		ret = -ENOMEM;
1134		goto free_newinfo;
1135	}
1136	if (copy_from_user(
1137	   newinfo->entries, tmp.entries, tmp.entries_size) != 0) {
1138		BUGPRINT("Couldn't copy entries from userspace\n");
1139		ret = -EFAULT;
1140		goto free_entries;
1141	}
1142
1143	ret = do_replace_finish(net, &tmp, newinfo);
1144	if (ret == 0)
1145		return ret;
1146free_entries:
1147	vfree(newinfo->entries);
1148free_newinfo:
1149	vfree(newinfo);
1150	return ret;
1151}
1152
1153struct ebt_table *
1154ebt_register_table(struct net *net, const struct ebt_table *input_table)
1155{
1156	struct ebt_table_info *newinfo;
1157	struct ebt_table *t, *table;
1158	struct ebt_replace_kernel *repl;
1159	int ret, i, countersize;
1160	void *p;
1161
1162	if (input_table == NULL || (repl = input_table->table) == NULL ||
1163	    repl->entries == NULL || repl->entries_size == 0 ||
1164	    repl->counters != NULL || input_table->private != NULL) {
1165		BUGPRINT("Bad table data for ebt_register_table!!!\n");
1166		return ERR_PTR(-EINVAL);
1167	}
1168
1169	/* Don't add one table to multiple lists. */
1170	table = kmemdup(input_table, sizeof(struct ebt_table), GFP_KERNEL);
1171	if (!table) {
1172		ret = -ENOMEM;
1173		goto out;
1174	}
1175
1176	countersize = COUNTER_OFFSET(repl->nentries) * nr_cpu_ids;
1177	newinfo = vmalloc(sizeof(*newinfo) + countersize);
1178	ret = -ENOMEM;
1179	if (!newinfo)
1180		goto free_table;
1181
1182	p = vmalloc(repl->entries_size);
1183	if (!p)
1184		goto free_newinfo;
1185
1186	memcpy(p, repl->entries, repl->entries_size);
1187	newinfo->entries = p;
1188
1189	newinfo->entries_size = repl->entries_size;
1190	newinfo->nentries = repl->nentries;
1191
1192	if (countersize)
1193		memset(newinfo->counters, 0, countersize);
1194
1195	/* fill in newinfo and parse the entries */
1196	newinfo->chainstack = NULL;
1197	for (i = 0; i < NF_BR_NUMHOOKS; i++) {
1198		if ((repl->valid_hooks & (1 << i)) == 0)
1199			newinfo->hook_entry[i] = NULL;
1200		else
1201			newinfo->hook_entry[i] = p +
1202				((char *)repl->hook_entry[i] - repl->entries);
1203	}
1204	ret = translate_table(net, repl->name, newinfo);
1205	if (ret != 0) {
1206		BUGPRINT("Translate_table failed\n");
1207		goto free_chainstack;
1208	}
1209
1210	if (table->check && table->check(newinfo, table->valid_hooks)) {
1211		BUGPRINT("The table doesn't like its own initial data, lol\n");
1212		ret = -EINVAL;
1213		goto free_chainstack;
1214	}
1215
1216	table->private = newinfo;
1217	rwlock_init(&table->lock);
1218	mutex_lock(&ebt_mutex);
1219	list_for_each_entry(t, &net->xt.tables[NFPROTO_BRIDGE], list) {
1220		if (strcmp(t->name, table->name) == 0) {
1221			ret = -EEXIST;
1222			BUGPRINT("Table name already exists\n");
1223			goto free_unlock;
1224		}
1225	}
1226
1227	/* Hold a reference count if the chains aren't empty */
1228	if (newinfo->nentries && !try_module_get(table->me)) {
1229		ret = -ENOENT;
1230		goto free_unlock;
1231	}
1232	list_add(&table->list, &net->xt.tables[NFPROTO_BRIDGE]);
1233	mutex_unlock(&ebt_mutex);
1234	return table;
1235free_unlock:
1236	mutex_unlock(&ebt_mutex);
1237free_chainstack:
1238	if (newinfo->chainstack) {
1239		for_each_possible_cpu(i)
1240			vfree(newinfo->chainstack[i]);
1241		vfree(newinfo->chainstack);
1242	}
1243	vfree(newinfo->entries);
1244free_newinfo:
1245	vfree(newinfo);
1246free_table:
1247	kfree(table);
1248out:
1249	return ERR_PTR(ret);
1250}
1251
1252void ebt_unregister_table(struct net *net, struct ebt_table *table)
1253{
1254	int i;
1255
1256	if (!table) {
1257		BUGPRINT("Request to unregister NULL table!!!\n");
1258		return;
1259	}
1260	mutex_lock(&ebt_mutex);
1261	list_del(&table->list);
1262	mutex_unlock(&ebt_mutex);
1263	EBT_ENTRY_ITERATE(table->private->entries, table->private->entries_size,
1264			  ebt_cleanup_entry, net, NULL);
1265	if (table->private->nentries)
1266		module_put(table->me);
1267	vfree(table->private->entries);
1268	if (table->private->chainstack) {
1269		for_each_possible_cpu(i)
1270			vfree(table->private->chainstack[i]);
1271		vfree(table->private->chainstack);
1272	}
1273	vfree(table->private);
1274	kfree(table);
1275}
1276
1277/* userspace just supplied us with counters */
1278static int do_update_counters(struct net *net, const char *name,
1279				struct ebt_counter __user *counters,
1280				unsigned int num_counters,
1281				const void __user *user, unsigned int len)
1282{
1283	int i, ret;
1284	struct ebt_counter *tmp;
1285	struct ebt_table *t;
1286
1287	if (num_counters == 0)
1288		return -EINVAL;
1289
1290	tmp = vmalloc(num_counters * sizeof(*tmp));
1291	if (!tmp)
1292		return -ENOMEM;
1293
1294	t = find_table_lock(net, name, &ret, &ebt_mutex);
1295	if (!t)
1296		goto free_tmp;
1297
1298	if (num_counters != t->private->nentries) {
1299		BUGPRINT("Wrong nr of counters\n");
1300		ret = -EINVAL;
1301		goto unlock_mutex;
1302	}
1303
1304	if (copy_from_user(tmp, counters, num_counters * sizeof(*counters))) {
1305		ret = -EFAULT;
1306		goto unlock_mutex;
1307	}
1308
1309	/* we want an atomic add of the counters */
1310	write_lock_bh(&t->lock);
1311
1312	/* we add to the counters of the first cpu */
1313	for (i = 0; i < num_counters; i++) {
1314		t->private->counters[i].pcnt += tmp[i].pcnt;
1315		t->private->counters[i].bcnt += tmp[i].bcnt;
1316	}
1317
1318	write_unlock_bh(&t->lock);
1319	ret = 0;
1320unlock_mutex:
1321	mutex_unlock(&ebt_mutex);
1322free_tmp:
1323	vfree(tmp);
1324	return ret;
1325}
1326
1327static int update_counters(struct net *net, const void __user *user,
1328			    unsigned int len)
1329{
1330	struct ebt_replace hlp;
1331
1332	if (copy_from_user(&hlp, user, sizeof(hlp)))
1333		return -EFAULT;
1334
1335	if (len != sizeof(hlp) + hlp.num_counters * sizeof(struct ebt_counter))
1336		return -EINVAL;
1337
1338	return do_update_counters(net, hlp.name, hlp.counters,
1339				hlp.num_counters, user, len);
1340}
1341
1342static inline int ebt_make_matchname(const struct ebt_entry_match *m,
1343    const char *base, char __user *ubase)
1344{
1345	char __user *hlp = ubase + ((char *)m - base);
1346	char name[EBT_FUNCTION_MAXNAMELEN] = {};
1347
1348	/* ebtables expects 32 bytes long names but xt_match names are 29 bytes
1349	   long. Copy 29 bytes and fill remaining bytes with zeroes. */
1350	strlcpy(name, m->u.match->name, sizeof(name));
1351	if (copy_to_user(hlp, name, EBT_FUNCTION_MAXNAMELEN))
1352		return -EFAULT;
1353	return 0;
1354}
1355
1356static inline int ebt_make_watchername(const struct ebt_entry_watcher *w,
1357    const char *base, char __user *ubase)
1358{
1359	char __user *hlp = ubase + ((char *)w - base);
1360	char name[EBT_FUNCTION_MAXNAMELEN] = {};
1361
1362	strlcpy(name, w->u.watcher->name, sizeof(name));
1363	if (copy_to_user(hlp , name, EBT_FUNCTION_MAXNAMELEN))
1364		return -EFAULT;
1365	return 0;
1366}
1367
1368static inline int
1369ebt_make_names(struct ebt_entry *e, const char *base, char __user *ubase)
1370{
1371	int ret;
1372	char __user *hlp;
1373	const struct ebt_entry_target *t;
1374	char name[EBT_FUNCTION_MAXNAMELEN] = {};
1375
1376	if (e->bitmask == 0)
1377		return 0;
1378
1379	hlp = ubase + (((char *)e + e->target_offset) - base);
1380	t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
1381
1382	ret = EBT_MATCH_ITERATE(e, ebt_make_matchname, base, ubase);
1383	if (ret != 0)
1384		return ret;
1385	ret = EBT_WATCHER_ITERATE(e, ebt_make_watchername, base, ubase);
1386	if (ret != 0)
1387		return ret;
1388	strlcpy(name, t->u.target->name, sizeof(name));
1389	if (copy_to_user(hlp, name, EBT_FUNCTION_MAXNAMELEN))
1390		return -EFAULT;
1391	return 0;
1392}
1393
1394static int copy_counters_to_user(struct ebt_table *t,
1395				  const struct ebt_counter *oldcounters,
1396				  void __user *user, unsigned int num_counters,
1397				  unsigned int nentries)
1398{
1399	struct ebt_counter *counterstmp;
1400	int ret = 0;
1401
1402	/* userspace might not need the counters */
1403	if (num_counters == 0)
1404		return 0;
1405
1406	if (num_counters != nentries) {
1407		BUGPRINT("Num_counters wrong\n");
1408		return -EINVAL;
1409	}
1410
1411	counterstmp = vmalloc(nentries * sizeof(*counterstmp));
1412	if (!counterstmp)
1413		return -ENOMEM;
1414
1415	write_lock_bh(&t->lock);
1416	get_counters(oldcounters, counterstmp, nentries);
1417	write_unlock_bh(&t->lock);
1418
1419	if (copy_to_user(user, counterstmp,
1420	   nentries * sizeof(struct ebt_counter)))
1421		ret = -EFAULT;
1422	vfree(counterstmp);
1423	return ret;
1424}
1425
1426/* called with ebt_mutex locked */
1427static int copy_everything_to_user(struct ebt_table *t, void __user *user,
1428    const int *len, int cmd)
1429{
1430	struct ebt_replace tmp;
1431	const struct ebt_counter *oldcounters;
1432	unsigned int entries_size, nentries;
1433	int ret;
1434	char *entries;
1435
1436	if (cmd == EBT_SO_GET_ENTRIES) {
1437		entries_size = t->private->entries_size;
1438		nentries = t->private->nentries;
1439		entries = t->private->entries;
1440		oldcounters = t->private->counters;
1441	} else {
1442		entries_size = t->table->entries_size;
1443		nentries = t->table->nentries;
1444		entries = t->table->entries;
1445		oldcounters = t->table->counters;
1446	}
1447
1448	if (copy_from_user(&tmp, user, sizeof(tmp)))
1449		return -EFAULT;
1450
1451	if (*len != sizeof(struct ebt_replace) + entries_size +
1452	   (tmp.num_counters ? nentries * sizeof(struct ebt_counter) : 0))
1453		return -EINVAL;
1454
1455	if (tmp.nentries != nentries) {
1456		BUGPRINT("Nentries wrong\n");
1457		return -EINVAL;
1458	}
1459
1460	if (tmp.entries_size != entries_size) {
1461		BUGPRINT("Wrong size\n");
1462		return -EINVAL;
1463	}
1464
1465	ret = copy_counters_to_user(t, oldcounters, tmp.counters,
1466					tmp.num_counters, nentries);
1467	if (ret)
1468		return ret;
1469
1470	if (copy_to_user(tmp.entries, entries, entries_size)) {
1471		BUGPRINT("Couldn't copy entries to userspace\n");
1472		return -EFAULT;
1473	}
1474	/* set the match/watcher/target names right */
1475	return EBT_ENTRY_ITERATE(entries, entries_size,
1476	   ebt_make_names, entries, tmp.entries);
1477}
1478
1479static int do_ebt_set_ctl(struct sock *sk,
1480	int cmd, void __user *user, unsigned int len)
1481{
1482	int ret;
1483	struct net *net = sock_net(sk);
1484
1485	if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1486		return -EPERM;
1487
1488	switch (cmd) {
1489	case EBT_SO_SET_ENTRIES:
1490		ret = do_replace(net, user, len);
1491		break;
1492	case EBT_SO_SET_COUNTERS:
1493		ret = update_counters(net, user, len);
1494		break;
1495	default:
1496		ret = -EINVAL;
1497	}
1498	return ret;
1499}
1500
1501static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
1502{
1503	int ret;
1504	struct ebt_replace tmp;
1505	struct ebt_table *t;
1506	struct net *net = sock_net(sk);
1507
1508	if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
1509		return -EPERM;
1510
1511	if (copy_from_user(&tmp, user, sizeof(tmp)))
1512		return -EFAULT;
1513
1514	t = find_table_lock(net, tmp.name, &ret, &ebt_mutex);
1515	if (!t)
1516		return ret;
1517
1518	switch (cmd) {
1519	case EBT_SO_GET_INFO:
1520	case EBT_SO_GET_INIT_INFO:
1521		if (*len != sizeof(struct ebt_replace)) {
1522			ret = -EINVAL;
1523			mutex_unlock(&ebt_mutex);
1524			break;
1525		}
1526		if (cmd == EBT_SO_GET_INFO) {
1527			tmp.nentries = t->private->nentries;
1528			tmp.entries_size = t->private->entries_size;
1529			tmp.valid_hooks = t->valid_hooks;
1530		} else {
1531			tmp.nentries = t->table->nentries;
1532			tmp.entries_size = t->table->entries_size;
1533			tmp.valid_hooks = t->table->valid_hooks;
1534		}
1535		mutex_unlock(&ebt_mutex);
1536		if (copy_to_user(user, &tmp, *len) != 0) {
1537			BUGPRINT("c2u Didn't work\n");
1538			ret = -EFAULT;
1539			break;
1540		}
1541		ret = 0;
1542		break;
1543
1544	case EBT_SO_GET_ENTRIES:
1545	case EBT_SO_GET_INIT_ENTRIES:
1546		ret = copy_everything_to_user(t, user, len, cmd);
1547		mutex_unlock(&ebt_mutex);
1548		break;
1549
1550	default:
1551		mutex_unlock(&ebt_mutex);
1552		ret = -EINVAL;
1553	}
1554
1555	return ret;
1556}
1557
1558#ifdef CONFIG_COMPAT
1559/* 32 bit-userspace compatibility definitions. */
1560struct compat_ebt_replace {
1561	char name[EBT_TABLE_MAXNAMELEN];
1562	compat_uint_t valid_hooks;
1563	compat_uint_t nentries;
1564	compat_uint_t entries_size;
1565	/* start of the chains */
1566	compat_uptr_t hook_entry[NF_BR_NUMHOOKS];
1567	/* nr of counters userspace expects back */
1568	compat_uint_t num_counters;
1569	/* where the kernel will put the old counters. */
1570	compat_uptr_t counters;
1571	compat_uptr_t entries;
1572};
1573
1574/* struct ebt_entry_match, _target and _watcher have same layout */
1575struct compat_ebt_entry_mwt {
1576	union {
1577		char name[EBT_FUNCTION_MAXNAMELEN];
1578		compat_uptr_t ptr;
1579	} u;
1580	compat_uint_t match_size;
1581	compat_uint_t data[0];
1582};
1583
1584/* account for possible padding between match_size and ->data */
1585static int ebt_compat_entry_padsize(void)
1586{
1587	BUILD_BUG_ON(XT_ALIGN(sizeof(struct ebt_entry_match)) <
1588			COMPAT_XT_ALIGN(sizeof(struct compat_ebt_entry_mwt)));
1589	return (int) XT_ALIGN(sizeof(struct ebt_entry_match)) -
1590			COMPAT_XT_ALIGN(sizeof(struct compat_ebt_entry_mwt));
1591}
1592
1593static int ebt_compat_match_offset(const struct xt_match *match,
1594				   unsigned int userlen)
1595{
1596	/*
1597	 * ebt_among needs special handling. The kernel .matchsize is
1598	 * set to -1 at registration time; at runtime an EBT_ALIGN()ed
1599	 * value is expected.
1600	 * Example: userspace sends 4500, ebt_among.c wants 4504.
1601	 */
1602	if (unlikely(match->matchsize == -1))
1603		return XT_ALIGN(userlen) - COMPAT_XT_ALIGN(userlen);
1604	return xt_compat_match_offset(match);
1605}
1606
1607static int compat_match_to_user(struct ebt_entry_match *m, void __user **dstptr,
1608				unsigned int *size)
1609{
1610	const struct xt_match *match = m->u.match;
1611	struct compat_ebt_entry_mwt __user *cm = *dstptr;
1612	int off = ebt_compat_match_offset(match, m->match_size);
1613	compat_uint_t msize = m->match_size - off;
1614
1615	BUG_ON(off >= m->match_size);
1616
1617	if (copy_to_user(cm->u.name, match->name,
1618	    strlen(match->name) + 1) || put_user(msize, &cm->match_size))
1619		return -EFAULT;
1620
1621	if (match->compat_to_user) {
1622		if (match->compat_to_user(cm->data, m->data))
1623			return -EFAULT;
1624	} else if (copy_to_user(cm->data, m->data, msize))
1625			return -EFAULT;
1626
1627	*size -= ebt_compat_entry_padsize() + off;
1628	*dstptr = cm->data;
1629	*dstptr += msize;
1630	return 0;
1631}
1632
1633static int compat_target_to_user(struct ebt_entry_target *t,
1634				 void __user **dstptr,
1635				 unsigned int *size)
1636{
1637	const struct xt_target *target = t->u.target;
1638	struct compat_ebt_entry_mwt __user *cm = *dstptr;
1639	int off = xt_compat_target_offset(target);
1640	compat_uint_t tsize = t->target_size - off;
1641
1642	BUG_ON(off >= t->target_size);
1643
1644	if (copy_to_user(cm->u.name, target->name,
1645	    strlen(target->name) + 1) || put_user(tsize, &cm->match_size))
1646		return -EFAULT;
1647
1648	if (target->compat_to_user) {
1649		if (target->compat_to_user(cm->data, t->data))
1650			return -EFAULT;
1651	} else if (copy_to_user(cm->data, t->data, tsize))
1652		return -EFAULT;
1653
1654	*size -= ebt_compat_entry_padsize() + off;
1655	*dstptr = cm->data;
1656	*dstptr += tsize;
1657	return 0;
1658}
1659
1660static int compat_watcher_to_user(struct ebt_entry_watcher *w,
1661				  void __user **dstptr,
1662				  unsigned int *size)
1663{
1664	return compat_target_to_user((struct ebt_entry_target *)w,
1665							dstptr, size);
1666}
1667
1668static int compat_copy_entry_to_user(struct ebt_entry *e, void __user **dstptr,
1669				unsigned int *size)
1670{
1671	struct ebt_entry_target *t;
1672	struct ebt_entry __user *ce;
1673	u32 watchers_offset, target_offset, next_offset;
1674	compat_uint_t origsize;
1675	int ret;
1676
1677	if (e->bitmask == 0) {
1678		if (*size < sizeof(struct ebt_entries))
1679			return -EINVAL;
1680		if (copy_to_user(*dstptr, e, sizeof(struct ebt_entries)))
1681			return -EFAULT;
1682
1683		*dstptr += sizeof(struct ebt_entries);
1684		*size -= sizeof(struct ebt_entries);
1685		return 0;
1686	}
1687
1688	if (*size < sizeof(*ce))
1689		return -EINVAL;
1690
1691	ce = (struct ebt_entry __user *)*dstptr;
1692	if (copy_to_user(ce, e, sizeof(*ce)))
1693		return -EFAULT;
1694
1695	origsize = *size;
1696	*dstptr += sizeof(*ce);
1697
1698	ret = EBT_MATCH_ITERATE(e, compat_match_to_user, dstptr, size);
1699	if (ret)
1700		return ret;
1701	watchers_offset = e->watchers_offset - (origsize - *size);
1702
1703	ret = EBT_WATCHER_ITERATE(e, compat_watcher_to_user, dstptr, size);
1704	if (ret)
1705		return ret;
1706	target_offset = e->target_offset - (origsize - *size);
1707
1708	t = (struct ebt_entry_target *) ((char *) e + e->target_offset);
1709
1710	ret = compat_target_to_user(t, dstptr, size);
1711	if (ret)
1712		return ret;
1713	next_offset = e->next_offset - (origsize - *size);
1714
1715	if (put_user(watchers_offset, &ce->watchers_offset) ||
1716	    put_user(target_offset, &ce->target_offset) ||
1717	    put_user(next_offset, &ce->next_offset))
1718		return -EFAULT;
1719
1720	*size -= sizeof(*ce);
1721	return 0;
1722}
1723
1724static int compat_calc_match(struct ebt_entry_match *m, int *off)
1725{
1726	*off += ebt_compat_match_offset(m->u.match, m->match_size);
1727	*off += ebt_compat_entry_padsize();
1728	return 0;
1729}
1730
1731static int compat_calc_watcher(struct ebt_entry_watcher *w, int *off)
1732{
1733	*off += xt_compat_target_offset(w->u.watcher);
1734	*off += ebt_compat_entry_padsize();
1735	return 0;
1736}
1737
1738static int compat_calc_entry(const struct ebt_entry *e,
1739			     const struct ebt_table_info *info,
1740			     const void *base,
1741			     struct compat_ebt_replace *newinfo)
1742{
1743	const struct ebt_entry_target *t;
1744	unsigned int entry_offset;
1745	int off, ret, i;
1746
1747	if (e->bitmask == 0)
1748		return 0;
1749
1750	off = 0;
1751	entry_offset = (void *)e - base;
1752
1753	EBT_MATCH_ITERATE(e, compat_calc_match, &off);
1754	EBT_WATCHER_ITERATE(e, compat_calc_watcher, &off);
1755
1756	t = (const struct ebt_entry_target *) ((char *) e + e->target_offset);
1757
1758	off += xt_compat_target_offset(t->u.target);
1759	off += ebt_compat_entry_padsize();
1760
1761	newinfo->entries_size -= off;
1762
1763	ret = xt_compat_add_offset(NFPROTO_BRIDGE, entry_offset, off);
1764	if (ret)
1765		return ret;
1766
1767	for (i = 0; i < NF_BR_NUMHOOKS; i++) {
1768		const void *hookptr = info->hook_entry[i];
1769		if (info->hook_entry[i] &&
1770		    (e < (struct ebt_entry *)(base - hookptr))) {
1771			newinfo->hook_entry[i] -= off;
1772			pr_debug("0x%08X -> 0x%08X\n",
1773					newinfo->hook_entry[i] + off,
1774					newinfo->hook_entry[i]);
1775		}
1776	}
1777
1778	return 0;
1779}
1780
1781
1782static int compat_table_info(const struct ebt_table_info *info,
1783			     struct compat_ebt_replace *newinfo)
1784{
1785	unsigned int size = info->entries_size;
1786	const void *entries = info->entries;
1787
1788	newinfo->entries_size = size;
1789
1790	xt_compat_init_offsets(NFPROTO_BRIDGE, info->nentries);
1791	return EBT_ENTRY_ITERATE(entries, size, compat_calc_entry, info,
1792							entries, newinfo);
1793}
1794
1795static int compat_copy_everything_to_user(struct ebt_table *t,
1796					  void __user *user, int *len, int cmd)
1797{
1798	struct compat_ebt_replace repl, tmp;
1799	struct ebt_counter *oldcounters;
1800	struct ebt_table_info tinfo;
1801	int ret;
1802	void __user *pos;
1803
1804	memset(&tinfo, 0, sizeof(tinfo));
1805
1806	if (cmd == EBT_SO_GET_ENTRIES) {
1807		tinfo.entries_size = t->private->entries_size;
1808		tinfo.nentries = t->private->nentries;
1809		tinfo.entries = t->private->entries;
1810		oldcounters = t->private->counters;
1811	} else {
1812		tinfo.entries_size = t->table->entries_size;
1813		tinfo.nentries = t->table->nentries;
1814		tinfo.entries = t->table->entries;
1815		oldcounters = t->table->counters;
1816	}
1817
1818	if (copy_from_user(&tmp, user, sizeof(tmp)))
1819		return -EFAULT;
1820
1821	if (tmp.nentries != tinfo.nentries ||
1822	   (tmp.num_counters && tmp.num_counters != tinfo.nentries))
1823		return -EINVAL;
1824
1825	memcpy(&repl, &tmp, sizeof(repl));
1826	if (cmd == EBT_SO_GET_ENTRIES)
1827		ret = compat_table_info(t->private, &repl);
1828	else
1829		ret = compat_table_info(&tinfo, &repl);
1830	if (ret)
1831		return ret;
1832
1833	if (*len != sizeof(tmp) + repl.entries_size +
1834	   (tmp.num_counters? tinfo.nentries * sizeof(struct ebt_counter): 0)) {
1835		pr_err("wrong size: *len %d, entries_size %u, replsz %d\n",
1836				*len, tinfo.entries_size, repl.entries_size);
1837		return -EINVAL;
1838	}
1839
1840	/* userspace might not need the counters */
1841	ret = copy_counters_to_user(t, oldcounters, compat_ptr(tmp.counters),
1842					tmp.num_counters, tinfo.nentries);
1843	if (ret)
1844		return ret;
1845
1846	pos = compat_ptr(tmp.entries);
1847	return EBT_ENTRY_ITERATE(tinfo.entries, tinfo.entries_size,
1848			compat_copy_entry_to_user, &pos, &tmp.entries_size);
1849}
1850
1851struct ebt_entries_buf_state {
1852	char *buf_kern_start;	/* kernel buffer to copy (translated) data to */
1853	u32 buf_kern_len;	/* total size of kernel buffer */
1854	u32 buf_kern_offset;	/* amount of data copied so far */
1855	u32 buf_user_offset;	/* read position in userspace buffer */
1856};
1857
1858static int ebt_buf_count(struct ebt_entries_buf_state *state, unsigned int sz)
1859{
1860	state->buf_kern_offset += sz;
1861	return state->buf_kern_offset >= sz ? 0 : -EINVAL;
1862}
1863
1864static int ebt_buf_add(struct ebt_entries_buf_state *state,
1865		       void *data, unsigned int sz)
1866{
1867	if (state->buf_kern_start == NULL)
1868		goto count_only;
1869
1870	BUG_ON(state->buf_kern_offset + sz > state->buf_kern_len);
1871
1872	memcpy(state->buf_kern_start + state->buf_kern_offset, data, sz);
1873
1874 count_only:
1875	state->buf_user_offset += sz;
1876	return ebt_buf_count(state, sz);
1877}
1878
1879static int ebt_buf_add_pad(struct ebt_entries_buf_state *state, unsigned int sz)
1880{
1881	char *b = state->buf_kern_start;
1882
1883	BUG_ON(b && state->buf_kern_offset > state->buf_kern_len);
1884
1885	if (b != NULL && sz > 0)
1886		memset(b + state->buf_kern_offset, 0, sz);
1887	/* do not adjust ->buf_user_offset here, we added kernel-side padding */
1888	return ebt_buf_count(state, sz);
1889}
1890
1891enum compat_mwt {
1892	EBT_COMPAT_MATCH,
1893	EBT_COMPAT_WATCHER,
1894	EBT_COMPAT_TARGET,
1895};
1896
1897static int compat_mtw_from_user(struct compat_ebt_entry_mwt *mwt,
1898				enum compat_mwt compat_mwt,
1899				struct ebt_entries_buf_state *state,
1900				const unsigned char *base)
1901{
1902	char name[EBT_FUNCTION_MAXNAMELEN];
1903	struct xt_match *match;
1904	struct xt_target *wt;
1905	void *dst = NULL;
1906	int off, pad = 0;
1907	unsigned int size_kern, match_size = mwt->match_size;
1908
1909	strlcpy(name, mwt->u.name, sizeof(name));
1910
1911	if (state->buf_kern_start)
1912		dst = state->buf_kern_start + state->buf_kern_offset;
1913
1914	switch (compat_mwt) {
1915	case EBT_COMPAT_MATCH:
1916		match = xt_request_find_match(NFPROTO_BRIDGE, name, 0);
1917		if (IS_ERR(match))
1918			return PTR_ERR(match);
1919
1920		off = ebt_compat_match_offset(match, match_size);
1921		if (dst) {
1922			if (match->compat_from_user)
1923				match->compat_from_user(dst, mwt->data);
1924			else
1925				memcpy(dst, mwt->data, match_size);
1926		}
1927
1928		size_kern = match->matchsize;
1929		if (unlikely(size_kern == -1))
1930			size_kern = match_size;
1931		module_put(match->me);
1932		break;
1933	case EBT_COMPAT_WATCHER: /* fallthrough */
1934	case EBT_COMPAT_TARGET:
1935		wt = xt_request_find_target(NFPROTO_BRIDGE, name, 0);
1936		if (IS_ERR(wt))
1937			return PTR_ERR(wt);
1938		off = xt_compat_target_offset(wt);
1939
1940		if (dst) {
1941			if (wt->compat_from_user)
1942				wt->compat_from_user(dst, mwt->data);
1943			else
1944				memcpy(dst, mwt->data, match_size);
1945		}
1946
1947		size_kern = wt->targetsize;
1948		module_put(wt->me);
1949		break;
1950
1951	default:
1952		return -EINVAL;
1953	}
1954
1955	state->buf_kern_offset += match_size + off;
1956	state->buf_user_offset += match_size;
1957	pad = XT_ALIGN(size_kern) - size_kern;
1958
1959	if (pad > 0 && dst) {
1960		BUG_ON(state->buf_kern_len <= pad);
1961		BUG_ON(state->buf_kern_offset - (match_size + off) + size_kern > state->buf_kern_len - pad);
1962		memset(dst + size_kern, 0, pad);
1963	}
1964	return off + match_size;
1965}
1966
1967/*
1968 * return size of all matches, watchers or target, including necessary
1969 * alignment and padding.
1970 */
1971static int ebt_size_mwt(struct compat_ebt_entry_mwt *match32,
1972			unsigned int size_left, enum compat_mwt type,
1973			struct ebt_entries_buf_state *state, const void *base)
1974{
1975	int growth = 0;
1976	char *buf;
1977
1978	if (size_left == 0)
1979		return 0;
1980
1981	buf = (char *) match32;
1982
1983	while (size_left >= sizeof(*match32)) {
1984		struct ebt_entry_match *match_kern;
1985		int ret;
1986
1987		match_kern = (struct ebt_entry_match *) state->buf_kern_start;
1988		if (match_kern) {
1989			char *tmp;
1990			tmp = state->buf_kern_start + state->buf_kern_offset;
1991			match_kern = (struct ebt_entry_match *) tmp;
1992		}
1993		ret = ebt_buf_add(state, buf, sizeof(*match32));
1994		if (ret < 0)
1995			return ret;
1996		size_left -= sizeof(*match32);
1997
1998		/* add padding before match->data (if any) */
1999		ret = ebt_buf_add_pad(state, ebt_compat_entry_padsize());
2000		if (ret < 0)
2001			return ret;
2002
2003		if (match32->match_size > size_left)
2004			return -EINVAL;
2005
2006		size_left -= match32->match_size;
2007
2008		ret = compat_mtw_from_user(match32, type, state, base);
2009		if (ret < 0)
2010			return ret;
2011
2012		BUG_ON(ret < match32->match_size);
2013		growth += ret - match32->match_size;
2014		growth += ebt_compat_entry_padsize();
2015
2016		buf += sizeof(*match32);
2017		buf += match32->match_size;
2018
2019		if (match_kern)
2020			match_kern->match_size = ret;
2021
2022		WARN_ON(type == EBT_COMPAT_TARGET && size_left);
2023		match32 = (struct compat_ebt_entry_mwt *) buf;
2024	}
2025
2026	return growth;
2027}
2028
2029/* called for all ebt_entry structures. */
2030static int size_entry_mwt(struct ebt_entry *entry, const unsigned char *base,
2031			  unsigned int *total,
2032			  struct ebt_entries_buf_state *state)
2033{
2034	unsigned int i, j, startoff, new_offset = 0;
2035	/* stores match/watchers/targets & offset of next struct ebt_entry: */
2036	unsigned int offsets[4];
2037	unsigned int *offsets_update = NULL;
2038	int ret;
2039	char *buf_start;
2040
2041	if (*total < sizeof(struct ebt_entries))
2042		return -EINVAL;
2043
2044	if (!entry->bitmask) {
2045		*total -= sizeof(struct ebt_entries);
2046		return ebt_buf_add(state, entry, sizeof(struct ebt_entries));
2047	}
2048	if (*total < sizeof(*entry) || entry->next_offset < sizeof(*entry))
2049		return -EINVAL;
2050
2051	startoff = state->buf_user_offset;
2052	/* pull in most part of ebt_entry, it does not need to be changed. */
2053	ret = ebt_buf_add(state, entry,
2054			offsetof(struct ebt_entry, watchers_offset));
2055	if (ret < 0)
2056		return ret;
2057
2058	offsets[0] = sizeof(struct ebt_entry); /* matches come first */
2059	memcpy(&offsets[1], &entry->watchers_offset,
2060			sizeof(offsets) - sizeof(offsets[0]));
2061
2062	if (state->buf_kern_start) {
2063		buf_start = state->buf_kern_start + state->buf_kern_offset;
2064		offsets_update = (unsigned int *) buf_start;
2065	}
2066	ret = ebt_buf_add(state, &offsets[1],
2067			sizeof(offsets) - sizeof(offsets[0]));
2068	if (ret < 0)
2069		return ret;
2070	buf_start = (char *) entry;
2071	/*
2072	 * 0: matches offset, always follows ebt_entry.
2073	 * 1: watchers offset, from ebt_entry structure
2074	 * 2: target offset, from ebt_entry structure
2075	 * 3: next ebt_entry offset, from ebt_entry structure
2076	 *
2077	 * offsets are relative to beginning of struct ebt_entry (i.e., 0).
2078	 */
2079	for (i = 0, j = 1 ; j < 4 ; j++, i++) {
2080		struct compat_ebt_entry_mwt *match32;
2081		unsigned int size;
2082		char *buf = buf_start;
2083
2084		buf = buf_start + offsets[i];
2085		if (offsets[i] > offsets[j])
2086			return -EINVAL;
2087
2088		match32 = (struct compat_ebt_entry_mwt *) buf;
2089		size = offsets[j] - offsets[i];
2090		ret = ebt_size_mwt(match32, size, i, state, base);
2091		if (ret < 0)
2092			return ret;
2093		new_offset += ret;
2094		if (offsets_update && new_offset) {
2095			pr_debug("change offset %d to %d\n",
2096				offsets_update[i], offsets[j] + new_offset);
2097			offsets_update[i] = offsets[j] + new_offset;
2098		}
2099	}
2100
2101	if (state->buf_kern_start == NULL) {
2102		unsigned int offset = buf_start - (char *) base;
2103
2104		ret = xt_compat_add_offset(NFPROTO_BRIDGE, offset, new_offset);
2105		if (ret < 0)
2106			return ret;
2107	}
2108
2109	startoff = state->buf_user_offset - startoff;
2110
2111	BUG_ON(*total < startoff);
2112	*total -= startoff;
2113	return 0;
2114}
2115
2116/*
2117 * repl->entries_size is the size of the ebt_entry blob in userspace.
2118 * It might need more memory when copied to a 64 bit kernel in case
2119 * userspace is 32-bit. So, first task: find out how much memory is needed.
2120 *
2121 * Called before validation is performed.
2122 */
2123static int compat_copy_entries(unsigned char *data, unsigned int size_user,
2124				struct ebt_entries_buf_state *state)
2125{
2126	unsigned int size_remaining = size_user;
2127	int ret;
2128
2129	ret = EBT_ENTRY_ITERATE(data, size_user, size_entry_mwt, data,
2130					&size_remaining, state);
2131	if (ret < 0)
2132		return ret;
2133
2134	WARN_ON(size_remaining);
2135	return state->buf_kern_offset;
2136}
2137
2138
2139static int compat_copy_ebt_replace_from_user(struct ebt_replace *repl,
2140					    void __user *user, unsigned int len)
2141{
2142	struct compat_ebt_replace tmp;
2143	int i;
2144
2145	if (len < sizeof(tmp))
2146		return -EINVAL;
2147
2148	if (copy_from_user(&tmp, user, sizeof(tmp)))
2149		return -EFAULT;
2150
2151	if (len != sizeof(tmp) + tmp.entries_size)
2152		return -EINVAL;
2153
2154	if (tmp.entries_size == 0)
2155		return -EINVAL;
2156
2157	if (tmp.nentries >= ((INT_MAX - sizeof(struct ebt_table_info)) /
2158			NR_CPUS - SMP_CACHE_BYTES) / sizeof(struct ebt_counter))
2159		return -ENOMEM;
2160	if (tmp.num_counters >= INT_MAX / sizeof(struct ebt_counter))
2161		return -ENOMEM;
2162
2163	memcpy(repl, &tmp, offsetof(struct ebt_replace, hook_entry));
2164
2165	/* starting with hook_entry, 32 vs. 64 bit structures are different */
2166	for (i = 0; i < NF_BR_NUMHOOKS; i++)
2167		repl->hook_entry[i] = compat_ptr(tmp.hook_entry[i]);
2168
2169	repl->num_counters = tmp.num_counters;
2170	repl->counters = compat_ptr(tmp.counters);
2171	repl->entries = compat_ptr(tmp.entries);
2172	return 0;
2173}
2174
2175static int compat_do_replace(struct net *net, void __user *user,
2176			     unsigned int len)
2177{
2178	int ret, i, countersize, size64;
2179	struct ebt_table_info *newinfo;
2180	struct ebt_replace tmp;
2181	struct ebt_entries_buf_state state;
2182	void *entries_tmp;
2183
2184	ret = compat_copy_ebt_replace_from_user(&tmp, user, len);
2185	if (ret) {
2186		/* try real handler in case userland supplied needed padding */
2187		if (ret == -EINVAL && do_replace(net, user, len) == 0)
2188			ret = 0;
2189		return ret;
2190	}
2191
2192	countersize = COUNTER_OFFSET(tmp.nentries) * nr_cpu_ids;
2193	newinfo = vmalloc(sizeof(*newinfo) + countersize);
2194	if (!newinfo)
2195		return -ENOMEM;
2196
2197	if (countersize)
2198		memset(newinfo->counters, 0, countersize);
2199
2200	memset(&state, 0, sizeof(state));
2201
2202	newinfo->entries = vmalloc(tmp.entries_size);
2203	if (!newinfo->entries) {
2204		ret = -ENOMEM;
2205		goto free_newinfo;
2206	}
2207	if (copy_from_user(
2208	   newinfo->entries, tmp.entries, tmp.entries_size) != 0) {
2209		ret = -EFAULT;
2210		goto free_entries;
2211	}
2212
2213	entries_tmp = newinfo->entries;
2214
2215	xt_compat_lock(NFPROTO_BRIDGE);
2216
2217	xt_compat_init_offsets(NFPROTO_BRIDGE, tmp.nentries);
2218	ret = compat_copy_entries(entries_tmp, tmp.entries_size, &state);
2219	if (ret < 0)
2220		goto out_unlock;
2221
2222	pr_debug("tmp.entries_size %d, kern off %d, user off %d delta %d\n",
2223		tmp.entries_size, state.buf_kern_offset, state.buf_user_offset,
2224		xt_compat_calc_jump(NFPROTO_BRIDGE, tmp.entries_size));
2225
2226	size64 = ret;
2227	newinfo->entries = vmalloc(size64);
2228	if (!newinfo->entries) {
2229		vfree(entries_tmp);
2230		ret = -ENOMEM;
2231		goto out_unlock;
2232	}
2233
2234	memset(&state, 0, sizeof(state));
2235	state.buf_kern_start = newinfo->entries;
2236	state.buf_kern_len = size64;
2237
2238	ret = compat_copy_entries(entries_tmp, tmp.entries_size, &state);
2239	BUG_ON(ret < 0);	/* parses same data again */
2240
2241	vfree(entries_tmp);
2242	tmp.entries_size = size64;
2243
2244	for (i = 0; i < NF_BR_NUMHOOKS; i++) {
2245		char __user *usrptr;
2246		if (tmp.hook_entry[i]) {
2247			unsigned int delta;
2248			usrptr = (char __user *) tmp.hook_entry[i];
2249			delta = usrptr - tmp.entries;
2250			usrptr += xt_compat_calc_jump(NFPROTO_BRIDGE, delta);
2251			tmp.hook_entry[i] = (struct ebt_entries __user *)usrptr;
2252		}
2253	}
2254
2255	xt_compat_flush_offsets(NFPROTO_BRIDGE);
2256	xt_compat_unlock(NFPROTO_BRIDGE);
2257
2258	ret = do_replace_finish(net, &tmp, newinfo);
2259	if (ret == 0)
2260		return ret;
2261free_entries:
2262	vfree(newinfo->entries);
2263free_newinfo:
2264	vfree(newinfo);
2265	return ret;
2266out_unlock:
2267	xt_compat_flush_offsets(NFPROTO_BRIDGE);
2268	xt_compat_unlock(NFPROTO_BRIDGE);
2269	goto free_entries;
2270}
2271
2272static int compat_update_counters(struct net *net, void __user *user,
2273				  unsigned int len)
2274{
2275	struct compat_ebt_replace hlp;
2276
2277	if (copy_from_user(&hlp, user, sizeof(hlp)))
2278		return -EFAULT;
2279
2280	/* try real handler in case userland supplied needed padding */
2281	if (len != sizeof(hlp) + hlp.num_counters * sizeof(struct ebt_counter))
2282		return update_counters(net, user, len);
2283
2284	return do_update_counters(net, hlp.name, compat_ptr(hlp.counters),
2285					hlp.num_counters, user, len);
2286}
2287
2288static int compat_do_ebt_set_ctl(struct sock *sk,
2289		int cmd, void __user *user, unsigned int len)
2290{
2291	int ret;
2292	struct net *net = sock_net(sk);
2293
2294	if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
2295		return -EPERM;
2296
2297	switch (cmd) {
2298	case EBT_SO_SET_ENTRIES:
2299		ret = compat_do_replace(net, user, len);
2300		break;
2301	case EBT_SO_SET_COUNTERS:
2302		ret = compat_update_counters(net, user, len);
2303		break;
2304	default:
2305		ret = -EINVAL;
2306  }
2307	return ret;
2308}
2309
2310static int compat_do_ebt_get_ctl(struct sock *sk, int cmd,
2311		void __user *user, int *len)
2312{
2313	int ret;
2314	struct compat_ebt_replace tmp;
2315	struct ebt_table *t;
2316	struct net *net = sock_net(sk);
2317
2318	if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
2319		return -EPERM;
2320
2321	/* try real handler in case userland supplied needed padding */
2322	if ((cmd == EBT_SO_GET_INFO ||
2323	     cmd == EBT_SO_GET_INIT_INFO) && *len != sizeof(tmp))
2324			return do_ebt_get_ctl(sk, cmd, user, len);
2325
2326	if (copy_from_user(&tmp, user, sizeof(tmp)))
2327		return -EFAULT;
2328
2329	t = find_table_lock(net, tmp.name, &ret, &ebt_mutex);
2330	if (!t)
2331		return ret;
2332
2333	xt_compat_lock(NFPROTO_BRIDGE);
2334	switch (cmd) {
2335	case EBT_SO_GET_INFO:
2336		tmp.nentries = t->private->nentries;
2337		ret = compat_table_info(t->private, &tmp);
2338		if (ret)
2339			goto out;
2340		tmp.valid_hooks = t->valid_hooks;
2341
2342		if (copy_to_user(user, &tmp, *len) != 0) {
2343			ret = -EFAULT;
2344			break;
2345		}
2346		ret = 0;
2347		break;
2348	case EBT_SO_GET_INIT_INFO:
2349		tmp.nentries = t->table->nentries;
2350		tmp.entries_size = t->table->entries_size;
2351		tmp.valid_hooks = t->table->valid_hooks;
2352
2353		if (copy_to_user(user, &tmp, *len) != 0) {
2354			ret = -EFAULT;
2355			break;
2356		}
2357		ret = 0;
2358		break;
2359	case EBT_SO_GET_ENTRIES:
2360	case EBT_SO_GET_INIT_ENTRIES:
2361		/*
2362		 * try real handler first in case of userland-side padding.
2363		 * in case we are dealing with an 'ordinary' 32 bit binary
2364		 * without 64bit compatibility padding, this will fail right
2365		 * after copy_from_user when the *len argument is validated.
2366		 *
2367		 * the compat_ variant needs to do one pass over the kernel
2368		 * data set to adjust for size differences before it the check.
2369		 */
2370		if (copy_everything_to_user(t, user, len, cmd) == 0)
2371			ret = 0;
2372		else
2373			ret = compat_copy_everything_to_user(t, user, len, cmd);
2374		break;
2375	default:
2376		ret = -EINVAL;
2377	}
2378 out:
2379	xt_compat_flush_offsets(NFPROTO_BRIDGE);
2380	xt_compat_unlock(NFPROTO_BRIDGE);
2381	mutex_unlock(&ebt_mutex);
2382	return ret;
2383}
2384#endif
2385
2386static struct nf_sockopt_ops ebt_sockopts = {
2387	.pf		= PF_INET,
2388	.set_optmin	= EBT_BASE_CTL,
2389	.set_optmax	= EBT_SO_SET_MAX + 1,
2390	.set		= do_ebt_set_ctl,
2391#ifdef CONFIG_COMPAT
2392	.compat_set	= compat_do_ebt_set_ctl,
2393#endif
2394	.get_optmin	= EBT_BASE_CTL,
2395	.get_optmax	= EBT_SO_GET_MAX + 1,
2396	.get		= do_ebt_get_ctl,
2397#ifdef CONFIG_COMPAT
2398	.compat_get	= compat_do_ebt_get_ctl,
2399#endif
2400	.owner		= THIS_MODULE,
2401};
2402
2403static int __init ebtables_init(void)
2404{
2405	int ret;
2406
2407	ret = xt_register_target(&ebt_standard_target);
2408	if (ret < 0)
2409		return ret;
2410	ret = nf_register_sockopt(&ebt_sockopts);
2411	if (ret < 0) {
2412		xt_unregister_target(&ebt_standard_target);
2413		return ret;
2414	}
2415
2416	printk(KERN_INFO "Ebtables v2.0 registered\n");
2417	return 0;
2418}
2419
2420static void __exit ebtables_fini(void)
2421{
2422	nf_unregister_sockopt(&ebt_sockopts);
2423	xt_unregister_target(&ebt_standard_target);
2424	printk(KERN_INFO "Ebtables v2.0 unregistered\n");
2425}
2426
2427EXPORT_SYMBOL(ebt_register_table);
2428EXPORT_SYMBOL(ebt_unregister_table);
2429EXPORT_SYMBOL(ebt_do_table);
2430module_init(ebtables_init);
2431module_exit(ebtables_fini);
2432MODULE_LICENSE("GPL");
2433