Linux Audio

Check our new training course

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