]> bbs.cooldavid.org Git - net-next-2.6.git/blob - net/bridge/netfilter/ebtables.c
46030dc908450233d38747f05a2f4977c6e0fd30
[net-next-2.6.git] / net / bridge / netfilter / ebtables.c
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
18
19 #include <linux/kmod.h>
20 #include <linux/module.h>
21 #include <linux/vmalloc.h>
22 #include <linux/netfilter/x_tables.h>
23 #include <linux/netfilter_bridge/ebtables.h>
24 #include <linux/spinlock.h>
25 #include <linux/mutex.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
52 static DEFINE_MUTEX(ebt_mutex);
53
54 static struct xt_target ebt_standard_target = {
55         .name       = "standard",
56         .revision   = 0,
57         .family     = NFPROTO_BRIDGE,
58         .targetsize = sizeof(int),
59 };
60
61 static inline int
62 ebt_do_watcher(const struct ebt_entry_watcher *w, struct sk_buff *skb,
63                struct xt_target_param *par)
64 {
65         par->target   = w->u.watcher;
66         par->targinfo = w->data;
67         w->u.watcher->target(skb, par);
68         /* watchers don't give a verdict */
69         return 0;
70 }
71
72 static inline int ebt_do_match (struct ebt_entry_match *m,
73    const struct sk_buff *skb, struct xt_match_param *par)
74 {
75         par->match     = m->u.match;
76         par->matchinfo = m->data;
77         return m->u.match->match(skb, par) ? EBT_MATCH : EBT_NOMATCH;
78 }
79
80 static inline int
81 ebt_dev_check(const char *entry, const struct net_device *device)
82 {
83         int i = 0;
84         const char *devname;
85
86         if (*entry == '\0')
87                 return 0;
88         if (!device)
89                 return 1;
90         devname = device->name;
91         /* 1 is the wildcard token */
92         while (entry[i] != '\0' && entry[i] != 1 && entry[i] == devname[i])
93                 i++;
94         return (devname[i] != entry[i] && entry[i] != 1);
95 }
96
97 #define FWINV2(bool,invflg) ((bool) ^ !!(e->invflags & invflg))
98 /* process standard matches */
99 static inline int
100 ebt_basic_match(const struct ebt_entry *e, const struct ethhdr *h,
101                 const struct net_device *in, const struct net_device *out)
102 {
103         int verdict, i;
104
105         if (e->bitmask & EBT_802_3) {
106                 if (FWINV2(ntohs(h->h_proto) >= 1536, EBT_IPROTO))
107                         return 1;
108         } else if (!(e->bitmask & EBT_NOPROTO) &&
109            FWINV2(e->ethproto != h->h_proto, EBT_IPROTO))
110                 return 1;
111
112         if (FWINV2(ebt_dev_check(e->in, in), EBT_IIN))
113                 return 1;
114         if (FWINV2(ebt_dev_check(e->out, out), EBT_IOUT))
115                 return 1;
116         if ((!in || !in->br_port) ? 0 : FWINV2(ebt_dev_check(
117            e->logical_in, in->br_port->br->dev), EBT_ILOGICALIN))
118                 return 1;
119         if ((!out || !out->br_port) ? 0 : FWINV2(ebt_dev_check(
120            e->logical_out, out->br_port->br->dev), EBT_ILOGICALOUT))
121                 return 1;
122
123         if (e->bitmask & EBT_SOURCEMAC) {
124                 verdict = 0;
125                 for (i = 0; i < 6; i++)
126                         verdict |= (h->h_source[i] ^ e->sourcemac[i]) &
127                            e->sourcemsk[i];
128                 if (FWINV2(verdict != 0, EBT_ISOURCE) )
129                         return 1;
130         }
131         if (e->bitmask & EBT_DESTMAC) {
132                 verdict = 0;
133                 for (i = 0; i < 6; i++)
134                         verdict |= (h->h_dest[i] ^ e->destmac[i]) &
135                            e->destmsk[i];
136                 if (FWINV2(verdict != 0, EBT_IDEST) )
137                         return 1;
138         }
139         return 0;
140 }
141
142 static inline __pure
143 struct ebt_entry *ebt_next_entry(const struct ebt_entry *entry)
144 {
145         return (void *)entry + entry->next_offset;
146 }
147
148 /* Do some firewalling */
149 unsigned int ebt_do_table (unsigned int hook, struct sk_buff *skb,
150    const struct net_device *in, const struct net_device *out,
151    struct ebt_table *table)
152 {
153         int i, nentries;
154         struct ebt_entry *point;
155         struct ebt_counter *counter_base, *cb_base;
156         const struct ebt_entry_target *t;
157         int verdict, sp = 0;
158         struct ebt_chainstack *cs;
159         struct ebt_entries *chaininfo;
160         const char *base;
161         const struct ebt_table_info *private;
162         bool hotdrop = false;
163         struct xt_match_param mtpar;
164         struct xt_target_param tgpar;
165
166         mtpar.family  = tgpar.family = NFPROTO_BRIDGE;
167         mtpar.in      = tgpar.in  = in;
168         mtpar.out     = tgpar.out = out;
169         mtpar.hotdrop = &hotdrop;
170         mtpar.hooknum = tgpar.hooknum = hook;
171
172         read_lock_bh(&table->lock);
173         private = table->private;
174         cb_base = COUNTER_BASE(private->counters, private->nentries,
175            smp_processor_id());
176         if (private->chainstack)
177                 cs = private->chainstack[smp_processor_id()];
178         else
179                 cs = NULL;
180         chaininfo = private->hook_entry[hook];
181         nentries = private->hook_entry[hook]->nentries;
182         point = (struct ebt_entry *)(private->hook_entry[hook]->data);
183         counter_base = cb_base + private->hook_entry[hook]->counter_offset;
184         /* base for chain jumps */
185         base = private->entries;
186         i = 0;
187         while (i < nentries) {
188                 if (ebt_basic_match(point, eth_hdr(skb), in, out))
189                         goto letscontinue;
190
191                 if (EBT_MATCH_ITERATE(point, ebt_do_match, skb, &mtpar) != 0)
192                         goto letscontinue;
193                 if (hotdrop) {
194                         read_unlock_bh(&table->lock);
195                         return NF_DROP;
196                 }
197
198                 /* increase counter */
199                 (*(counter_base + i)).pcnt++;
200                 (*(counter_base + i)).bcnt += skb->len;
201
202                 /* these should only watch: not modify, nor tell us
203                    what to do with the packet */
204                 EBT_WATCHER_ITERATE(point, ebt_do_watcher, skb, &tgpar);
205
206                 t = (struct ebt_entry_target *)
207                    (((char *)point) + point->target_offset);
208                 /* standard target */
209                 if (!t->u.target->target)
210                         verdict = ((struct ebt_standard_target *)t)->verdict;
211                 else {
212                         tgpar.target   = t->u.target;
213                         tgpar.targinfo = t->data;
214                         verdict = t->u.target->target(skb, &tgpar);
215                 }
216                 if (verdict == EBT_ACCEPT) {
217                         read_unlock_bh(&table->lock);
218                         return NF_ACCEPT;
219                 }
220                 if (verdict == EBT_DROP) {
221                         read_unlock_bh(&table->lock);
222                         return NF_DROP;
223                 }
224                 if (verdict == EBT_RETURN) {
225 letsreturn:
226 #ifdef CONFIG_NETFILTER_DEBUG
227                         if (sp == 0) {
228                                 BUGPRINT("RETURN on base chain");
229                                 /* act like this is EBT_CONTINUE */
230                                 goto letscontinue;
231                         }
232 #endif
233                         sp--;
234                         /* put all the local variables right */
235                         i = cs[sp].n;
236                         chaininfo = cs[sp].chaininfo;
237                         nentries = chaininfo->nentries;
238                         point = cs[sp].e;
239                         counter_base = cb_base +
240                            chaininfo->counter_offset;
241                         continue;
242                 }
243                 if (verdict == EBT_CONTINUE)
244                         goto letscontinue;
245 #ifdef CONFIG_NETFILTER_DEBUG
246                 if (verdict < 0) {
247                         BUGPRINT("bogus standard verdict\n");
248                         read_unlock_bh(&table->lock);
249                         return NF_DROP;
250                 }
251 #endif
252                 /* jump to a udc */
253                 cs[sp].n = i + 1;
254                 cs[sp].chaininfo = chaininfo;
255                 cs[sp].e = ebt_next_entry(point);
256                 i = 0;
257                 chaininfo = (struct ebt_entries *) (base + verdict);
258 #ifdef CONFIG_NETFILTER_DEBUG
259                 if (chaininfo->distinguisher) {
260                         BUGPRINT("jump to non-chain\n");
261                         read_unlock_bh(&table->lock);
262                         return NF_DROP;
263                 }
264 #endif
265                 nentries = chaininfo->nentries;
266                 point = (struct ebt_entry *)chaininfo->data;
267                 counter_base = cb_base + chaininfo->counter_offset;
268                 sp++;
269                 continue;
270 letscontinue:
271                 point = ebt_next_entry(point);
272                 i++;
273         }
274
275         /* I actually like this :) */
276         if (chaininfo->policy == EBT_RETURN)
277                 goto letsreturn;
278         if (chaininfo->policy == EBT_ACCEPT) {
279                 read_unlock_bh(&table->lock);
280                 return NF_ACCEPT;
281         }
282         read_unlock_bh(&table->lock);
283         return NF_DROP;
284 }
285
286 /* If it succeeds, returns element and locks mutex */
287 static inline void *
288 find_inlist_lock_noload(struct list_head *head, const char *name, int *error,
289    struct mutex *mutex)
290 {
291         struct {
292                 struct list_head list;
293                 char name[EBT_FUNCTION_MAXNAMELEN];
294         } *e;
295
296         *error = mutex_lock_interruptible(mutex);
297         if (*error != 0)
298                 return NULL;
299
300         list_for_each_entry(e, head, list) {
301                 if (strcmp(e->name, name) == 0)
302                         return e;
303         }
304         *error = -ENOENT;
305         mutex_unlock(mutex);
306         return NULL;
307 }
308
309 static void *
310 find_inlist_lock(struct list_head *head, const char *name, const char *prefix,
311    int *error, struct mutex *mutex)
312 {
313         return try_then_request_module(
314                         find_inlist_lock_noload(head, name, error, mutex),
315                         "%s%s", prefix, name);
316 }
317
318 static inline struct ebt_table *
319 find_table_lock(struct net *net, const char *name, int *error,
320                 struct mutex *mutex)
321 {
322         return find_inlist_lock(&net->xt.tables[NFPROTO_BRIDGE], name,
323                                 "ebtable_", error, mutex);
324 }
325
326 static inline int
327 ebt_check_match(struct ebt_entry_match *m, struct xt_mtchk_param *par,
328                 unsigned int *cnt)
329 {
330         const struct ebt_entry *e = par->entryinfo;
331         struct xt_match *match;
332         size_t left = ((char *)e + e->watchers_offset) - (char *)m;
333         int ret;
334
335         if (left < sizeof(struct ebt_entry_match) ||
336             left - sizeof(struct ebt_entry_match) < m->match_size)
337                 return -EINVAL;
338
339         match = try_then_request_module(xt_find_match(NFPROTO_BRIDGE,
340                 m->u.name, 0), "ebt_%s", m->u.name);
341         if (IS_ERR(match))
342                 return PTR_ERR(match);
343         if (match == NULL)
344                 return -ENOENT;
345         m->u.match = match;
346
347         par->match     = match;
348         par->matchinfo = m->data;
349         ret = xt_check_match(par, m->match_size,
350               e->ethproto, e->invflags & EBT_IPROTO);
351         if (ret < 0) {
352                 module_put(match->me);
353                 return ret;
354         }
355
356         (*cnt)++;
357         return 0;
358 }
359
360 static inline int
361 ebt_check_watcher(struct ebt_entry_watcher *w, struct xt_tgchk_param *par,
362                   unsigned int *cnt)
363 {
364         const struct ebt_entry *e = par->entryinfo;
365         struct xt_target *watcher;
366         size_t left = ((char *)e + e->target_offset) - (char *)w;
367         int ret;
368
369         if (left < sizeof(struct ebt_entry_watcher) ||
370            left - sizeof(struct ebt_entry_watcher) < w->watcher_size)
371                 return -EINVAL;
372
373         watcher = try_then_request_module(
374                   xt_find_target(NFPROTO_BRIDGE, w->u.name, 0),
375                   "ebt_%s", w->u.name);
376         if (IS_ERR(watcher))
377                 return PTR_ERR(watcher);
378         if (watcher == NULL)
379                 return -ENOENT;
380         w->u.watcher = watcher;
381
382         par->target   = watcher;
383         par->targinfo = w->data;
384         ret = xt_check_target(par, w->watcher_size,
385               e->ethproto, e->invflags & EBT_IPROTO);
386         if (ret < 0) {
387                 module_put(watcher->me);
388                 return ret;
389         }
390
391         (*cnt)++;
392         return 0;
393 }
394
395 static int ebt_verify_pointers(const struct ebt_replace *repl,
396                                struct ebt_table_info *newinfo)
397 {
398         unsigned int limit = repl->entries_size;
399         unsigned int valid_hooks = repl->valid_hooks;
400         unsigned int offset = 0;
401         int i;
402
403         for (i = 0; i < NF_BR_NUMHOOKS; i++)
404                 newinfo->hook_entry[i] = NULL;
405
406         newinfo->entries_size = repl->entries_size;
407         newinfo->nentries = repl->nentries;
408
409         while (offset < limit) {
410                 size_t left = limit - offset;
411                 struct ebt_entry *e = (void *)newinfo->entries + offset;
412
413                 if (left < sizeof(unsigned int))
414                         break;
415
416                 for (i = 0; i < NF_BR_NUMHOOKS; i++) {
417                         if ((valid_hooks & (1 << i)) == 0)
418                                 continue;
419                         if ((char __user *)repl->hook_entry[i] ==
420                              repl->entries + offset)
421                                 break;
422                 }
423
424                 if (i != NF_BR_NUMHOOKS || !(e->bitmask & EBT_ENTRY_OR_ENTRIES)) {
425                         if (e->bitmask != 0) {
426                                 /* we make userspace set this right,
427                                    so there is no misunderstanding */
428                                 BUGPRINT("EBT_ENTRY_OR_ENTRIES shouldn't be set "
429                                          "in distinguisher\n");
430                                 return -EINVAL;
431                         }
432                         if (i != NF_BR_NUMHOOKS)
433                                 newinfo->hook_entry[i] = (struct ebt_entries *)e;
434                         if (left < sizeof(struct ebt_entries))
435                                 break;
436                         offset += sizeof(struct ebt_entries);
437                 } else {
438                         if (left < sizeof(struct ebt_entry))
439                                 break;
440                         if (left < e->next_offset)
441                                 break;
442                         if (e->next_offset < sizeof(struct ebt_entry))
443                                 return -EINVAL;
444                         offset += e->next_offset;
445                 }
446         }
447         if (offset != limit) {
448                 BUGPRINT("entries_size too small\n");
449                 return -EINVAL;
450         }
451
452         /* check if all valid hooks have a chain */
453         for (i = 0; i < NF_BR_NUMHOOKS; i++) {
454                 if (!newinfo->hook_entry[i] &&
455                    (valid_hooks & (1 << i))) {
456                         BUGPRINT("Valid hook without chain\n");
457                         return -EINVAL;
458                 }
459         }
460         return 0;
461 }
462
463 /*
464  * this one is very careful, as it is the first function
465  * to parse the userspace data
466  */
467 static inline int
468 ebt_check_entry_size_and_hooks(const struct ebt_entry *e,
469    const struct ebt_table_info *newinfo,
470    unsigned int *n, unsigned int *cnt,
471    unsigned int *totalcnt, unsigned int *udc_cnt)
472 {
473         int i;
474
475         for (i = 0; i < NF_BR_NUMHOOKS; i++) {
476                 if ((void *)e == (void *)newinfo->hook_entry[i])
477                         break;
478         }
479         /* beginning of a new chain
480            if i == NF_BR_NUMHOOKS it must be a user defined chain */
481         if (i != NF_BR_NUMHOOKS || !e->bitmask) {
482                 /* this checks if the previous chain has as many entries
483                    as it said it has */
484                 if (*n != *cnt) {
485                         BUGPRINT("nentries does not equal the nr of entries "
486                                  "in the chain\n");
487                         return -EINVAL;
488                 }
489                 if (((struct ebt_entries *)e)->policy != EBT_DROP &&
490                    ((struct ebt_entries *)e)->policy != EBT_ACCEPT) {
491                         /* only RETURN from udc */
492                         if (i != NF_BR_NUMHOOKS ||
493                            ((struct ebt_entries *)e)->policy != EBT_RETURN) {
494                                 BUGPRINT("bad policy\n");
495                                 return -EINVAL;
496                         }
497                 }
498                 if (i == NF_BR_NUMHOOKS) /* it's a user defined chain */
499                         (*udc_cnt)++;
500                 if (((struct ebt_entries *)e)->counter_offset != *totalcnt) {
501                         BUGPRINT("counter_offset != totalcnt");
502                         return -EINVAL;
503                 }
504                 *n = ((struct ebt_entries *)e)->nentries;
505                 *cnt = 0;
506                 return 0;
507         }
508         /* a plain old entry, heh */
509         if (sizeof(struct ebt_entry) > e->watchers_offset ||
510            e->watchers_offset > e->target_offset ||
511            e->target_offset >= e->next_offset) {
512                 BUGPRINT("entry offsets not in right order\n");
513                 return -EINVAL;
514         }
515         /* this is not checked anywhere else */
516         if (e->next_offset - e->target_offset < sizeof(struct ebt_entry_target)) {
517                 BUGPRINT("target size too small\n");
518                 return -EINVAL;
519         }
520         (*cnt)++;
521         (*totalcnt)++;
522         return 0;
523 }
524
525 struct ebt_cl_stack
526 {
527         struct ebt_chainstack cs;
528         int from;
529         unsigned int hookmask;
530 };
531
532 /*
533  * we need these positions to check that the jumps to a different part of the
534  * entries is a jump to the beginning of a new chain.
535  */
536 static inline int
537 ebt_get_udc_positions(struct ebt_entry *e, struct ebt_table_info *newinfo,
538    unsigned int *n, struct ebt_cl_stack *udc)
539 {
540         int i;
541
542         /* we're only interested in chain starts */
543         if (e->bitmask)
544                 return 0;
545         for (i = 0; i < NF_BR_NUMHOOKS; i++) {
546                 if (newinfo->hook_entry[i] == (struct ebt_entries *)e)
547                         break;
548         }
549         /* only care about udc */
550         if (i != NF_BR_NUMHOOKS)
551                 return 0;
552
553         udc[*n].cs.chaininfo = (struct ebt_entries *)e;
554         /* these initialisations are depended on later in check_chainloops() */
555         udc[*n].cs.n = 0;
556         udc[*n].hookmask = 0;
557
558         (*n)++;
559         return 0;
560 }
561
562 static inline int
563 ebt_cleanup_match(struct ebt_entry_match *m, struct net *net, unsigned int *i)
564 {
565         struct xt_mtdtor_param par;
566
567         if (i && (*i)-- == 0)
568                 return 1;
569
570         par.net       = net;
571         par.match     = m->u.match;
572         par.matchinfo = m->data;
573         par.family    = NFPROTO_BRIDGE;
574         if (par.match->destroy != NULL)
575                 par.match->destroy(&par);
576         module_put(par.match->me);
577         return 0;
578 }
579
580 static inline int
581 ebt_cleanup_watcher(struct ebt_entry_watcher *w, struct net *net, unsigned int *i)
582 {
583         struct xt_tgdtor_param par;
584
585         if (i && (*i)-- == 0)
586                 return 1;
587
588         par.net      = net;
589         par.target   = w->u.watcher;
590         par.targinfo = w->data;
591         par.family   = NFPROTO_BRIDGE;
592         if (par.target->destroy != NULL)
593                 par.target->destroy(&par);
594         module_put(par.target->me);
595         return 0;
596 }
597
598 static inline int
599 ebt_cleanup_entry(struct ebt_entry *e, struct net *net, unsigned int *cnt)
600 {
601         struct xt_tgdtor_param par;
602         struct ebt_entry_target *t;
603
604         if (e->bitmask == 0)
605                 return 0;
606         /* we're done */
607         if (cnt && (*cnt)-- == 0)
608                 return 1;
609         EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, net, NULL);
610         EBT_MATCH_ITERATE(e, ebt_cleanup_match, net, NULL);
611         t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
612
613         par.net      = net;
614         par.target   = t->u.target;
615         par.targinfo = t->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
623 static inline int
624 ebt_check_entry(struct ebt_entry *e, struct net *net,
625    const struct ebt_table_info *newinfo,
626    const char *name, unsigned int *cnt,
627    struct ebt_cl_stack *cl_s, unsigned int udc_cnt)
628 {
629         struct ebt_entry_target *t;
630         struct xt_target *target;
631         unsigned int i, j, hook = 0, hookmask = 0;
632         size_t gap;
633         int ret;
634         struct xt_mtchk_param mtpar;
635         struct xt_tgchk_param tgpar;
636
637         /* don't mess with the struct ebt_entries */
638         if (e->bitmask == 0)
639                 return 0;
640
641         if (e->bitmask & ~EBT_F_MASK) {
642                 BUGPRINT("Unknown flag for bitmask\n");
643                 return -EINVAL;
644         }
645         if (e->invflags & ~EBT_INV_MASK) {
646                 BUGPRINT("Unknown flag for inv bitmask\n");
647                 return -EINVAL;
648         }
649         if ( (e->bitmask & EBT_NOPROTO) && (e->bitmask & EBT_802_3) ) {
650                 BUGPRINT("NOPROTO & 802_3 not allowed\n");
651                 return -EINVAL;
652         }
653         /* what hook do we belong to? */
654         for (i = 0; i < NF_BR_NUMHOOKS; i++) {
655                 if (!newinfo->hook_entry[i])
656                         continue;
657                 if ((char *)newinfo->hook_entry[i] < (char *)e)
658                         hook = i;
659                 else
660                         break;
661         }
662         /* (1 << NF_BR_NUMHOOKS) tells the check functions the rule is on
663            a base chain */
664         if (i < NF_BR_NUMHOOKS)
665                 hookmask = (1 << hook) | (1 << NF_BR_NUMHOOKS);
666         else {
667                 for (i = 0; i < udc_cnt; i++)
668                         if ((char *)(cl_s[i].cs.chaininfo) > (char *)e)
669                                 break;
670                 if (i == 0)
671                         hookmask = (1 << hook) | (1 << NF_BR_NUMHOOKS);
672                 else
673                         hookmask = cl_s[i - 1].hookmask;
674         }
675         i = 0;
676
677         mtpar.net       = tgpar.net       = net;
678         mtpar.table     = tgpar.table     = name;
679         mtpar.entryinfo = tgpar.entryinfo = e;
680         mtpar.hook_mask = tgpar.hook_mask = hookmask;
681         mtpar.family    = tgpar.family    = NFPROTO_BRIDGE;
682         ret = EBT_MATCH_ITERATE(e, ebt_check_match, &mtpar, &i);
683         if (ret != 0)
684                 goto cleanup_matches;
685         j = 0;
686         ret = EBT_WATCHER_ITERATE(e, ebt_check_watcher, &tgpar, &j);
687         if (ret != 0)
688                 goto cleanup_watchers;
689         t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
690         gap = e->next_offset - e->target_offset;
691
692         target = try_then_request_module(
693                  xt_find_target(NFPROTO_BRIDGE, t->u.name, 0),
694                  "ebt_%s", t->u.name);
695         if (IS_ERR(target)) {
696                 ret = PTR_ERR(target);
697                 goto cleanup_watchers;
698         } else if (target == NULL) {
699                 ret = -ENOENT;
700                 goto cleanup_watchers;
701         }
702
703         t->u.target = target;
704         if (t->u.target == &ebt_standard_target) {
705                 if (gap < sizeof(struct ebt_standard_target)) {
706                         BUGPRINT("Standard target size too big\n");
707                         ret = -EFAULT;
708                         goto cleanup_watchers;
709                 }
710                 if (((struct ebt_standard_target *)t)->verdict <
711                    -NUM_STANDARD_TARGETS) {
712                         BUGPRINT("Invalid standard target\n");
713                         ret = -EFAULT;
714                         goto cleanup_watchers;
715                 }
716         } else if (t->target_size > gap - sizeof(struct ebt_entry_target)) {
717                 module_put(t->u.target->me);
718                 ret = -EFAULT;
719                 goto cleanup_watchers;
720         }
721
722         tgpar.target   = target;
723         tgpar.targinfo = t->data;
724         ret = xt_check_target(&tgpar, t->target_size,
725               e->ethproto, e->invflags & EBT_IPROTO);
726         if (ret < 0) {
727                 module_put(target->me);
728                 goto cleanup_watchers;
729         }
730         (*cnt)++;
731         return 0;
732 cleanup_watchers:
733         EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, net, &j);
734 cleanup_matches:
735         EBT_MATCH_ITERATE(e, ebt_cleanup_match, net, &i);
736         return ret;
737 }
738
739 /*
740  * checks for loops and sets the hook mask for udc
741  * the hook mask for udc tells us from which base chains the udc can be
742  * accessed. This mask is a parameter to the check() functions of the extensions
743  */
744 static int check_chainloops(const struct ebt_entries *chain, struct ebt_cl_stack *cl_s,
745    unsigned int udc_cnt, unsigned int hooknr, char *base)
746 {
747         int i, chain_nr = -1, pos = 0, nentries = chain->nentries, verdict;
748         const struct ebt_entry *e = (struct ebt_entry *)chain->data;
749         const struct ebt_entry_target *t;
750
751         while (pos < nentries || chain_nr != -1) {
752                 /* end of udc, go back one 'recursion' step */
753                 if (pos == nentries) {
754                         /* put back values of the time when this chain was called */
755                         e = cl_s[chain_nr].cs.e;
756                         if (cl_s[chain_nr].from != -1)
757                                 nentries =
758                                 cl_s[cl_s[chain_nr].from].cs.chaininfo->nentries;
759                         else
760                                 nentries = chain->nentries;
761                         pos = cl_s[chain_nr].cs.n;
762                         /* make sure we won't see a loop that isn't one */
763                         cl_s[chain_nr].cs.n = 0;
764                         chain_nr = cl_s[chain_nr].from;
765                         if (pos == nentries)
766                                 continue;
767                 }
768                 t = (struct ebt_entry_target *)
769                    (((char *)e) + e->target_offset);
770                 if (strcmp(t->u.name, EBT_STANDARD_TARGET))
771                         goto letscontinue;
772                 if (e->target_offset + sizeof(struct ebt_standard_target) >
773                    e->next_offset) {
774                         BUGPRINT("Standard target size too big\n");
775                         return -1;
776                 }
777                 verdict = ((struct ebt_standard_target *)t)->verdict;
778                 if (verdict >= 0) { /* jump to another chain */
779                         struct ebt_entries *hlp2 =
780                            (struct ebt_entries *)(base + verdict);
781                         for (i = 0; i < udc_cnt; i++)
782                                 if (hlp2 == cl_s[i].cs.chaininfo)
783                                         break;
784                         /* bad destination or loop */
785                         if (i == udc_cnt) {
786                                 BUGPRINT("bad destination\n");
787                                 return -1;
788                         }
789                         if (cl_s[i].cs.n) {
790                                 BUGPRINT("loop\n");
791                                 return -1;
792                         }
793                         if (cl_s[i].hookmask & (1 << hooknr))
794                                 goto letscontinue;
795                         /* this can't be 0, so the loop test is correct */
796                         cl_s[i].cs.n = pos + 1;
797                         pos = 0;
798                         cl_s[i].cs.e = ebt_next_entry(e);
799                         e = (struct ebt_entry *)(hlp2->data);
800                         nentries = hlp2->nentries;
801                         cl_s[i].from = chain_nr;
802                         chain_nr = i;
803                         /* this udc is accessible from the base chain for hooknr */
804                         cl_s[i].hookmask |= (1 << hooknr);
805                         continue;
806                 }
807 letscontinue:
808                 e = ebt_next_entry(e);
809                 pos++;
810         }
811         return 0;
812 }
813
814 /* do the parsing of the table/chains/entries/matches/watchers/targets, heh */
815 static int translate_table(struct net *net, const char *name,
816                            struct ebt_table_info *newinfo)
817 {
818         unsigned int i, j, k, udc_cnt;
819         int ret;
820         struct ebt_cl_stack *cl_s = NULL; /* used in the checking for chain loops */
821
822         i = 0;
823         while (i < NF_BR_NUMHOOKS && !newinfo->hook_entry[i])
824                 i++;
825         if (i == NF_BR_NUMHOOKS) {
826                 BUGPRINT("No valid hooks specified\n");
827                 return -EINVAL;
828         }
829         if (newinfo->hook_entry[i] != (struct ebt_entries *)newinfo->entries) {
830                 BUGPRINT("Chains don't start at beginning\n");
831                 return -EINVAL;
832         }
833         /* make sure chains are ordered after each other in same order
834            as their corresponding hooks */
835         for (j = i + 1; j < NF_BR_NUMHOOKS; j++) {
836                 if (!newinfo->hook_entry[j])
837                         continue;
838                 if (newinfo->hook_entry[j] <= newinfo->hook_entry[i]) {
839                         BUGPRINT("Hook order must be followed\n");
840                         return -EINVAL;
841                 }
842                 i = j;
843         }
844
845         /* do some early checkings and initialize some things */
846         i = 0; /* holds the expected nr. of entries for the chain */
847         j = 0; /* holds the up to now counted entries for the chain */
848         k = 0; /* holds the total nr. of entries, should equal
849                   newinfo->nentries afterwards */
850         udc_cnt = 0; /* will hold the nr. of user defined chains (udc) */
851         ret = EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
852            ebt_check_entry_size_and_hooks, newinfo,
853            &i, &j, &k, &udc_cnt);
854
855         if (ret != 0)
856                 return ret;
857
858         if (i != j) {
859                 BUGPRINT("nentries does not equal the nr of entries in the "
860                          "(last) chain\n");
861                 return -EINVAL;
862         }
863         if (k != newinfo->nentries) {
864                 BUGPRINT("Total nentries is wrong\n");
865                 return -EINVAL;
866         }
867
868         /* get the location of the udc, put them in an array
869            while we're at it, allocate the chainstack */
870         if (udc_cnt) {
871                 /* this will get free'd in do_replace()/ebt_register_table()
872                    if an error occurs */
873                 newinfo->chainstack =
874                         vmalloc(nr_cpu_ids * sizeof(*(newinfo->chainstack)));
875                 if (!newinfo->chainstack)
876                         return -ENOMEM;
877                 for_each_possible_cpu(i) {
878                         newinfo->chainstack[i] =
879                           vmalloc(udc_cnt * sizeof(*(newinfo->chainstack[0])));
880                         if (!newinfo->chainstack[i]) {
881                                 while (i)
882                                         vfree(newinfo->chainstack[--i]);
883                                 vfree(newinfo->chainstack);
884                                 newinfo->chainstack = NULL;
885                                 return -ENOMEM;
886                         }
887                 }
888
889                 cl_s = vmalloc(udc_cnt * sizeof(*cl_s));
890                 if (!cl_s)
891                         return -ENOMEM;
892                 i = 0; /* the i'th udc */
893                 EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
894                    ebt_get_udc_positions, newinfo, &i, cl_s);
895                 /* sanity check */
896                 if (i != udc_cnt) {
897                         BUGPRINT("i != udc_cnt\n");
898                         vfree(cl_s);
899                         return -EFAULT;
900                 }
901         }
902
903         /* Check for loops */
904         for (i = 0; i < NF_BR_NUMHOOKS; i++)
905                 if (newinfo->hook_entry[i])
906                         if (check_chainloops(newinfo->hook_entry[i],
907                            cl_s, udc_cnt, i, newinfo->entries)) {
908                                 vfree(cl_s);
909                                 return -EINVAL;
910                         }
911
912         /* we now know the following (along with E=mc²):
913            - the nr of entries in each chain is right
914            - the size of the allocated space is right
915            - all valid hooks have a corresponding chain
916            - there are no loops
917            - wrong data can still be on the level of a single entry
918            - could be there are jumps to places that are not the
919              beginning of a chain. This can only occur in chains that
920              are not accessible from any base chains, so we don't care. */
921
922         /* used to know what we need to clean up if something goes wrong */
923         i = 0;
924         ret = EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
925            ebt_check_entry, net, newinfo, name, &i, cl_s, udc_cnt);
926         if (ret != 0) {
927                 EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
928                                   ebt_cleanup_entry, net, &i);
929         }
930         vfree(cl_s);
931         return ret;
932 }
933
934 /* called under write_lock */
935 static void get_counters(const struct ebt_counter *oldcounters,
936    struct ebt_counter *counters, unsigned int nentries)
937 {
938         int i, cpu;
939         struct ebt_counter *counter_base;
940
941         /* counters of cpu 0 */
942         memcpy(counters, oldcounters,
943                sizeof(struct ebt_counter) * nentries);
944
945         /* add other counters to those of cpu 0 */
946         for_each_possible_cpu(cpu) {
947                 if (cpu == 0)
948                         continue;
949                 counter_base = COUNTER_BASE(oldcounters, nentries, cpu);
950                 for (i = 0; i < nentries; i++) {
951                         counters[i].pcnt += counter_base[i].pcnt;
952                         counters[i].bcnt += counter_base[i].bcnt;
953                 }
954         }
955 }
956
957 static int do_replace_finish(struct net *net, struct ebt_replace *repl,
958                               struct ebt_table_info *newinfo)
959 {
960         int ret, i;
961         struct ebt_counter *counterstmp = NULL;
962         /* used to be able to unlock earlier */
963         struct ebt_table_info *table;
964         struct ebt_table *t;
965
966         /* the user wants counters back
967            the check on the size is done later, when we have the lock */
968         if (repl->num_counters) {
969                 unsigned long size = repl->num_counters * sizeof(*counterstmp);
970                 counterstmp = vmalloc(size);
971                 if (!counterstmp)
972                         return -ENOMEM;
973         }
974
975         newinfo->chainstack = NULL;
976         ret = ebt_verify_pointers(repl, newinfo);
977         if (ret != 0)
978                 goto free_counterstmp;
979
980         ret = translate_table(net, repl->name, newinfo);
981
982         if (ret != 0)
983                 goto free_counterstmp;
984
985         t = find_table_lock(net, repl->name, &ret, &ebt_mutex);
986         if (!t) {
987                 ret = -ENOENT;
988                 goto free_iterate;
989         }
990
991         /* the table doesn't like it */
992         if (t->check && (ret = t->check(newinfo, repl->valid_hooks)))
993                 goto free_unlock;
994
995         if (repl->num_counters && repl->num_counters != t->private->nentries) {
996                 BUGPRINT("Wrong nr. of counters requested\n");
997                 ret = -EINVAL;
998                 goto free_unlock;
999         }
1000
1001         /* we have the mutex lock, so no danger in reading this pointer */
1002         table = t->private;
1003         /* make sure the table can only be rmmod'ed if it contains no rules */
1004         if (!table->nentries && newinfo->nentries && !try_module_get(t->me)) {
1005                 ret = -ENOENT;
1006                 goto free_unlock;
1007         } else if (table->nentries && !newinfo->nentries)
1008                 module_put(t->me);
1009         /* we need an atomic snapshot of the counters */
1010         write_lock_bh(&t->lock);
1011         if (repl->num_counters)
1012                 get_counters(t->private->counters, counterstmp,
1013                    t->private->nentries);
1014
1015         t->private = newinfo;
1016         write_unlock_bh(&t->lock);
1017         mutex_unlock(&ebt_mutex);
1018         /* so, a user can change the chains while having messed up her counter
1019            allocation. Only reason why this is done is because this way the lock
1020            is held only once, while this doesn't bring the kernel into a
1021            dangerous state. */
1022         if (repl->num_counters &&
1023            copy_to_user(repl->counters, counterstmp,
1024            repl->num_counters * sizeof(struct ebt_counter))) {
1025                 ret = -EFAULT;
1026         }
1027         else
1028                 ret = 0;
1029
1030         /* decrease module count and free resources */
1031         EBT_ENTRY_ITERATE(table->entries, table->entries_size,
1032                           ebt_cleanup_entry, net, NULL);
1033
1034         vfree(table->entries);
1035         if (table->chainstack) {
1036                 for_each_possible_cpu(i)
1037                         vfree(table->chainstack[i]);
1038                 vfree(table->chainstack);
1039         }
1040         vfree(table);
1041
1042         vfree(counterstmp);
1043         return ret;
1044
1045 free_unlock:
1046         mutex_unlock(&ebt_mutex);
1047 free_iterate:
1048         EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
1049                           ebt_cleanup_entry, net, NULL);
1050 free_counterstmp:
1051         vfree(counterstmp);
1052         /* can be initialized in translate_table() */
1053         if (newinfo->chainstack) {
1054                 for_each_possible_cpu(i)
1055                         vfree(newinfo->chainstack[i]);
1056                 vfree(newinfo->chainstack);
1057         }
1058         return ret;
1059 }
1060
1061 /* replace the table */
1062 static int do_replace(struct net *net, const void __user *user,
1063                       unsigned int len)
1064 {
1065         int ret, countersize;
1066         struct ebt_table_info *newinfo;
1067         struct ebt_replace tmp;
1068
1069         if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
1070                 return -EFAULT;
1071
1072         if (len != sizeof(tmp) + tmp.entries_size) {
1073                 BUGPRINT("Wrong len argument\n");
1074                 return -EINVAL;
1075         }
1076
1077         if (tmp.entries_size == 0) {
1078                 BUGPRINT("Entries_size never zero\n");
1079                 return -EINVAL;
1080         }
1081         /* overflow check */
1082         if (tmp.nentries >= ((INT_MAX - sizeof(struct ebt_table_info)) /
1083                         NR_CPUS - SMP_CACHE_BYTES) / sizeof(struct ebt_counter))
1084                 return -ENOMEM;
1085         if (tmp.num_counters >= INT_MAX / sizeof(struct ebt_counter))
1086                 return -ENOMEM;
1087
1088         countersize = COUNTER_OFFSET(tmp.nentries) * nr_cpu_ids;
1089         newinfo = vmalloc(sizeof(*newinfo) + countersize);
1090         if (!newinfo)
1091                 return -ENOMEM;
1092
1093         if (countersize)
1094                 memset(newinfo->counters, 0, countersize);
1095
1096         newinfo->entries = vmalloc(tmp.entries_size);
1097         if (!newinfo->entries) {
1098                 ret = -ENOMEM;
1099                 goto free_newinfo;
1100         }
1101         if (copy_from_user(
1102            newinfo->entries, tmp.entries, tmp.entries_size) != 0) {
1103                 BUGPRINT("Couldn't copy entries from userspace\n");
1104                 ret = -EFAULT;
1105                 goto free_entries;
1106         }
1107
1108         ret = do_replace_finish(net, &tmp, newinfo);
1109         if (ret == 0)
1110                 return ret;
1111 free_entries:
1112         vfree(newinfo->entries);
1113 free_newinfo:
1114         vfree(newinfo);
1115         return ret;
1116 }
1117
1118 struct ebt_table *
1119 ebt_register_table(struct net *net, const struct ebt_table *input_table)
1120 {
1121         struct ebt_table_info *newinfo;
1122         struct ebt_table *t, *table;
1123         struct ebt_replace_kernel *repl;
1124         int ret, i, countersize;
1125         void *p;
1126
1127         if (input_table == NULL || (repl = input_table->table) == NULL ||
1128             repl->entries == 0 || repl->entries_size == 0 ||
1129             repl->counters != NULL || input_table->private != NULL) {
1130                 BUGPRINT("Bad table data for ebt_register_table!!!\n");
1131                 return ERR_PTR(-EINVAL);
1132         }
1133
1134         /* Don't add one table to multiple lists. */
1135         table = kmemdup(input_table, sizeof(struct ebt_table), GFP_KERNEL);
1136         if (!table) {
1137                 ret = -ENOMEM;
1138                 goto out;
1139         }
1140
1141         countersize = COUNTER_OFFSET(repl->nentries) * nr_cpu_ids;
1142         newinfo = vmalloc(sizeof(*newinfo) + countersize);
1143         ret = -ENOMEM;
1144         if (!newinfo)
1145                 goto free_table;
1146
1147         p = vmalloc(repl->entries_size);
1148         if (!p)
1149                 goto free_newinfo;
1150
1151         memcpy(p, repl->entries, repl->entries_size);
1152         newinfo->entries = p;
1153
1154         newinfo->entries_size = repl->entries_size;
1155         newinfo->nentries = repl->nentries;
1156
1157         if (countersize)
1158                 memset(newinfo->counters, 0, countersize);
1159
1160         /* fill in newinfo and parse the entries */
1161         newinfo->chainstack = NULL;
1162         for (i = 0; i < NF_BR_NUMHOOKS; i++) {
1163                 if ((repl->valid_hooks & (1 << i)) == 0)
1164                         newinfo->hook_entry[i] = NULL;
1165                 else
1166                         newinfo->hook_entry[i] = p +
1167                                 ((char *)repl->hook_entry[i] - repl->entries);
1168         }
1169         ret = translate_table(net, repl->name, newinfo);
1170         if (ret != 0) {
1171                 BUGPRINT("Translate_table failed\n");
1172                 goto free_chainstack;
1173         }
1174
1175         if (table->check && table->check(newinfo, table->valid_hooks)) {
1176                 BUGPRINT("The table doesn't like its own initial data, lol\n");
1177                 return ERR_PTR(-EINVAL);
1178         }
1179
1180         table->private = newinfo;
1181         rwlock_init(&table->lock);
1182         ret = mutex_lock_interruptible(&ebt_mutex);
1183         if (ret != 0)
1184                 goto free_chainstack;
1185
1186         list_for_each_entry(t, &net->xt.tables[NFPROTO_BRIDGE], list) {
1187                 if (strcmp(t->name, table->name) == 0) {
1188                         ret = -EEXIST;
1189                         BUGPRINT("Table name already exists\n");
1190                         goto free_unlock;
1191                 }
1192         }
1193
1194         /* Hold a reference count if the chains aren't empty */
1195         if (newinfo->nentries && !try_module_get(table->me)) {
1196                 ret = -ENOENT;
1197                 goto free_unlock;
1198         }
1199         list_add(&table->list, &net->xt.tables[NFPROTO_BRIDGE]);
1200         mutex_unlock(&ebt_mutex);
1201         return table;
1202 free_unlock:
1203         mutex_unlock(&ebt_mutex);
1204 free_chainstack:
1205         if (newinfo->chainstack) {
1206                 for_each_possible_cpu(i)
1207                         vfree(newinfo->chainstack[i]);
1208                 vfree(newinfo->chainstack);
1209         }
1210         vfree(newinfo->entries);
1211 free_newinfo:
1212         vfree(newinfo);
1213 free_table:
1214         kfree(table);
1215 out:
1216         return ERR_PTR(ret);
1217 }
1218
1219 void ebt_unregister_table(struct net *net, struct ebt_table *table)
1220 {
1221         int i;
1222
1223         if (!table) {
1224                 BUGPRINT("Request to unregister NULL table!!!\n");
1225                 return;
1226         }
1227         mutex_lock(&ebt_mutex);
1228         list_del(&table->list);
1229         mutex_unlock(&ebt_mutex);
1230         EBT_ENTRY_ITERATE(table->private->entries, table->private->entries_size,
1231                           ebt_cleanup_entry, net, NULL);
1232         if (table->private->nentries)
1233                 module_put(table->me);
1234         vfree(table->private->entries);
1235         if (table->private->chainstack) {
1236                 for_each_possible_cpu(i)
1237                         vfree(table->private->chainstack[i]);
1238                 vfree(table->private->chainstack);
1239         }
1240         vfree(table->private);
1241         kfree(table);
1242 }
1243
1244 /* userspace just supplied us with counters */
1245 static int update_counters(struct net *net, const void __user *user,
1246                            unsigned int len)
1247 {
1248         int i, ret;
1249         struct ebt_counter *tmp;
1250         struct ebt_replace hlp;
1251         struct ebt_table *t;
1252
1253         if (copy_from_user(&hlp, user, sizeof(hlp)))
1254                 return -EFAULT;
1255
1256         if (len != sizeof(hlp) + hlp.num_counters * sizeof(struct ebt_counter))
1257                 return -EINVAL;
1258         if (hlp.num_counters == 0)
1259                 return -EINVAL;
1260
1261         if (!(tmp = vmalloc(hlp.num_counters * sizeof(*tmp))))
1262                 return -ENOMEM;
1263
1264         t = find_table_lock(net, hlp.name, &ret, &ebt_mutex);
1265         if (!t)
1266                 goto free_tmp;
1267
1268         if (hlp.num_counters != t->private->nentries) {
1269                 BUGPRINT("Wrong nr of counters\n");
1270                 ret = -EINVAL;
1271                 goto unlock_mutex;
1272         }
1273
1274         if ( copy_from_user(tmp, hlp.counters,
1275            hlp.num_counters * sizeof(struct ebt_counter)) ) {
1276                 BUGPRINT("Updata_counters && !cfu\n");
1277                 ret = -EFAULT;
1278                 goto unlock_mutex;
1279         }
1280
1281         /* we want an atomic add of the counters */
1282         write_lock_bh(&t->lock);
1283
1284         /* we add to the counters of the first cpu */
1285         for (i = 0; i < hlp.num_counters; i++) {
1286                 t->private->counters[i].pcnt += tmp[i].pcnt;
1287                 t->private->counters[i].bcnt += tmp[i].bcnt;
1288         }
1289
1290         write_unlock_bh(&t->lock);
1291         ret = 0;
1292 unlock_mutex:
1293         mutex_unlock(&ebt_mutex);
1294 free_tmp:
1295         vfree(tmp);
1296         return ret;
1297 }
1298
1299 static inline int ebt_make_matchname(const struct ebt_entry_match *m,
1300     const char *base, char __user *ubase)
1301 {
1302         char __user *hlp = ubase + ((char *)m - base);
1303         if (copy_to_user(hlp, m->u.match->name, EBT_FUNCTION_MAXNAMELEN))
1304                 return -EFAULT;
1305         return 0;
1306 }
1307
1308 static inline int ebt_make_watchername(const struct ebt_entry_watcher *w,
1309     const char *base, char __user *ubase)
1310 {
1311         char __user *hlp = ubase + ((char *)w - base);
1312         if (copy_to_user(hlp , w->u.watcher->name, EBT_FUNCTION_MAXNAMELEN))
1313                 return -EFAULT;
1314         return 0;
1315 }
1316
1317 static inline int
1318 ebt_make_names(struct ebt_entry *e, const char *base, char __user *ubase)
1319 {
1320         int ret;
1321         char __user *hlp;
1322         const struct ebt_entry_target *t;
1323
1324         if (e->bitmask == 0)
1325                 return 0;
1326
1327         hlp = ubase + (((char *)e + e->target_offset) - base);
1328         t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
1329
1330         ret = EBT_MATCH_ITERATE(e, ebt_make_matchname, base, ubase);
1331         if (ret != 0)
1332                 return ret;
1333         ret = EBT_WATCHER_ITERATE(e, ebt_make_watchername, base, ubase);
1334         if (ret != 0)
1335                 return ret;
1336         if (copy_to_user(hlp, t->u.target->name, EBT_FUNCTION_MAXNAMELEN))
1337                 return -EFAULT;
1338         return 0;
1339 }
1340
1341 static int copy_counters_to_user(struct ebt_table *t,
1342                                   const struct ebt_counter *oldcounters,
1343                                   void __user *user, unsigned int num_counters,
1344                                   unsigned int nentries)
1345 {
1346         struct ebt_counter *counterstmp;
1347         int ret = 0;
1348
1349         /* userspace might not need the counters */
1350         if (num_counters == 0)
1351                 return 0;
1352
1353         if (num_counters != nentries) {
1354                 BUGPRINT("Num_counters wrong\n");
1355                 return -EINVAL;
1356         }
1357
1358         counterstmp = vmalloc(nentries * sizeof(*counterstmp));
1359         if (!counterstmp)
1360                 return -ENOMEM;
1361
1362         write_lock_bh(&t->lock);
1363         get_counters(oldcounters, counterstmp, nentries);
1364         write_unlock_bh(&t->lock);
1365
1366         if (copy_to_user(user, counterstmp,
1367            nentries * sizeof(struct ebt_counter)))
1368                 ret = -EFAULT;
1369         vfree(counterstmp);
1370         return ret;
1371 }
1372
1373 /* called with ebt_mutex locked */
1374 static int copy_everything_to_user(struct ebt_table *t, void __user *user,
1375     const int *len, int cmd)
1376 {
1377         struct ebt_replace tmp;
1378         const struct ebt_counter *oldcounters;
1379         unsigned int entries_size, nentries;
1380         int ret;
1381         char *entries;
1382
1383         if (cmd == EBT_SO_GET_ENTRIES) {
1384                 entries_size = t->private->entries_size;
1385                 nentries = t->private->nentries;
1386                 entries = t->private->entries;
1387                 oldcounters = t->private->counters;
1388         } else {
1389                 entries_size = t->table->entries_size;
1390                 nentries = t->table->nentries;
1391                 entries = t->table->entries;
1392                 oldcounters = t->table->counters;
1393         }
1394
1395         if (copy_from_user(&tmp, user, sizeof(tmp))) {
1396                 BUGPRINT("Cfu didn't work\n");
1397                 return -EFAULT;
1398         }
1399
1400         if (*len != sizeof(struct ebt_replace) + entries_size +
1401            (tmp.num_counters? nentries * sizeof(struct ebt_counter): 0)) {
1402                 BUGPRINT("Wrong size\n");
1403                 return -EINVAL;
1404         }
1405
1406         if (tmp.nentries != nentries) {
1407                 BUGPRINT("Nentries wrong\n");
1408                 return -EINVAL;
1409         }
1410
1411         if (tmp.entries_size != entries_size) {
1412                 BUGPRINT("Wrong size\n");
1413                 return -EINVAL;
1414         }
1415
1416         ret = copy_counters_to_user(t, oldcounters, tmp.counters,
1417                                         tmp.num_counters, nentries);
1418         if (ret)
1419                 return ret;
1420
1421         if (copy_to_user(tmp.entries, entries, entries_size)) {
1422                 BUGPRINT("Couldn't copy entries to userspace\n");
1423                 return -EFAULT;
1424         }
1425         /* set the match/watcher/target names right */
1426         return EBT_ENTRY_ITERATE(entries, entries_size,
1427            ebt_make_names, entries, tmp.entries);
1428 }
1429
1430 static int do_ebt_set_ctl(struct sock *sk,
1431         int cmd, void __user *user, unsigned int len)
1432 {
1433         int ret;
1434
1435         if (!capable(CAP_NET_ADMIN))
1436                 return -EPERM;
1437
1438         switch(cmd) {
1439         case EBT_SO_SET_ENTRIES:
1440                 ret = do_replace(sock_net(sk), user, len);
1441                 break;
1442         case EBT_SO_SET_COUNTERS:
1443                 ret = update_counters(sock_net(sk), user, len);
1444                 break;
1445         default:
1446                 ret = -EINVAL;
1447   }
1448         return ret;
1449 }
1450
1451 static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
1452 {
1453         int ret;
1454         struct ebt_replace tmp;
1455         struct ebt_table *t;
1456
1457         if (!capable(CAP_NET_ADMIN))
1458                 return -EPERM;
1459
1460         if (copy_from_user(&tmp, user, sizeof(tmp)))
1461                 return -EFAULT;
1462
1463         t = find_table_lock(sock_net(sk), tmp.name, &ret, &ebt_mutex);
1464         if (!t)
1465                 return ret;
1466
1467         switch(cmd) {
1468         case EBT_SO_GET_INFO:
1469         case EBT_SO_GET_INIT_INFO:
1470                 if (*len != sizeof(struct ebt_replace)){
1471                         ret = -EINVAL;
1472                         mutex_unlock(&ebt_mutex);
1473                         break;
1474                 }
1475                 if (cmd == EBT_SO_GET_INFO) {
1476                         tmp.nentries = t->private->nentries;
1477                         tmp.entries_size = t->private->entries_size;
1478                         tmp.valid_hooks = t->valid_hooks;
1479                 } else {
1480                         tmp.nentries = t->table->nentries;
1481                         tmp.entries_size = t->table->entries_size;
1482                         tmp.valid_hooks = t->table->valid_hooks;
1483                 }
1484                 mutex_unlock(&ebt_mutex);
1485                 if (copy_to_user(user, &tmp, *len) != 0){
1486                         BUGPRINT("c2u Didn't work\n");
1487                         ret = -EFAULT;
1488                         break;
1489                 }
1490                 ret = 0;
1491                 break;
1492
1493         case EBT_SO_GET_ENTRIES:
1494         case EBT_SO_GET_INIT_ENTRIES:
1495                 ret = copy_everything_to_user(t, user, len, cmd);
1496                 mutex_unlock(&ebt_mutex);
1497                 break;
1498
1499         default:
1500                 mutex_unlock(&ebt_mutex);
1501                 ret = -EINVAL;
1502         }
1503
1504         return ret;
1505 }
1506
1507 static struct nf_sockopt_ops ebt_sockopts =
1508 {
1509         .pf             = PF_INET,
1510         .set_optmin     = EBT_BASE_CTL,
1511         .set_optmax     = EBT_SO_SET_MAX + 1,
1512         .set            = do_ebt_set_ctl,
1513         .get_optmin     = EBT_BASE_CTL,
1514         .get_optmax     = EBT_SO_GET_MAX + 1,
1515         .get            = do_ebt_get_ctl,
1516         .owner          = THIS_MODULE,
1517 };
1518
1519 static int __init ebtables_init(void)
1520 {
1521         int ret;
1522
1523         ret = xt_register_target(&ebt_standard_target);
1524         if (ret < 0)
1525                 return ret;
1526         ret = nf_register_sockopt(&ebt_sockopts);
1527         if (ret < 0) {
1528                 xt_unregister_target(&ebt_standard_target);
1529                 return ret;
1530         }
1531
1532         printk(KERN_INFO "Ebtables v2.0 registered\n");
1533         return 0;
1534 }
1535
1536 static void __exit ebtables_fini(void)
1537 {
1538         nf_unregister_sockopt(&ebt_sockopts);
1539         xt_unregister_target(&ebt_standard_target);
1540         printk(KERN_INFO "Ebtables v2.0 unregistered\n");
1541 }
1542
1543 EXPORT_SYMBOL(ebt_register_table);
1544 EXPORT_SYMBOL(ebt_unregister_table);
1545 EXPORT_SYMBOL(ebt_do_table);
1546 module_init(ebtables_init);
1547 module_exit(ebtables_fini);
1548 MODULE_LICENSE("GPL");