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