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