source: trunk/target/linux/generic/patches-3.0/610-netfilter_match_bypass_default_checks.patch @ 27945

Last change on this file since 27945 was 27945, checked in by florian, 5 years ago

[kernel] add ignore_oc in struct ehci_hcd

File size: 2.5 KB
  • include/linux/netfilter_ipv4/ip_tables.h

    a b struct ipt_ip { 
    9393#define IPT_F_FRAG              0x01    /* Set if rule is a fragment rule */ 
    9494#define IPT_F_GOTO              0x02    /* Set if jump is a goto */ 
    9595#define IPT_F_MASK              0x03    /* All possible flag bits mask. */ 
     96#define IPT_F_NO_DEF_MATCH      0x80    /* Internal: no default match rules present */ 
    9697 
    9798/* Values for "inv" field in struct ipt_ip. */ 
    9899#define IPT_INV_VIA_IN          0x01    /* Invert the sense of IN IFACE. */ 
  • net/ipv4/netfilter/ip_tables.c

    a b ip_packet_match(const struct iphdr *ip, 
    8181 
    8282#define FWINV(bool, invflg) ((bool) ^ !!(ipinfo->invflags & (invflg))) 
    8383 
     84        if (ipinfo->flags & IPT_F_NO_DEF_MATCH) 
     85                return true; 
     86 
    8487        if (FWINV((ip->saddr&ipinfo->smsk.s_addr) != ipinfo->src.s_addr, 
    8588                  IPT_INV_SRCIP) || 
    8689            FWINV((ip->daddr&ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr, 
    ip_packet_match(const struct iphdr *ip, 
    134137        return true; 
    135138} 
    136139 
     140static void 
     141ip_checkdefault(struct ipt_ip *ip) 
     142{ 
     143        static const char iface_mask[IFNAMSIZ] = {}; 
     144 
     145        if (ip->invflags || ip->flags & IPT_F_FRAG) 
     146                return; 
     147 
     148        if (memcmp(ip->iniface_mask, iface_mask, IFNAMSIZ) != 0) 
     149                return; 
     150 
     151        if (memcmp(ip->outiface_mask, iface_mask, IFNAMSIZ) != 0) 
     152                return; 
     153 
     154        if (ip->smsk.s_addr || ip->dmsk.s_addr) 
     155                return; 
     156 
     157        if (ip->proto) 
     158                return; 
     159 
     160        ip->flags |= IPT_F_NO_DEF_MATCH; 
     161} 
     162 
    137163static bool 
    138164ip_checkentry(const struct ipt_ip *ip) 
    139165{ 
    static void cleanup_match(struct xt_entr 
    561587} 
    562588 
    563589static int 
    564 check_entry(const struct ipt_entry *e, const char *name) 
     590check_entry(struct ipt_entry *e, const char *name) 
    565591{ 
    566592        const struct xt_entry_target *t; 
    567593 
    check_entry(const struct ipt_entry *e, c 
    570596                return -EINVAL; 
    571597        } 
    572598 
     599        ip_checkdefault(&e->ip); 
     600 
    573601        if (e->target_offset + sizeof(struct xt_entry_target) > 
    574602            e->next_offset) 
    575603                return -EINVAL; 
    copy_entries_to_user(unsigned int total_ 
    931959        const struct xt_table_info *private = table->private; 
    932960        int ret = 0; 
    933961        const void *loc_cpu_entry; 
     962        u8 flags; 
    934963 
    935964        counters = alloc_counters(table); 
    936965        if (IS_ERR(counters)) 
    copy_entries_to_user(unsigned int total_ 
    961990                        ret = -EFAULT; 
    962991                        goto free_counters; 
    963992                } 
     993 
     994                flags = e->ip.flags & IPT_F_MASK; 
     995                if (copy_to_user(userptr + off 
     996                                 + offsetof(struct ipt_entry, ip.flags), 
     997                                 &flags, sizeof(flags)) != 0) { 
     998                        ret = -EFAULT; 
     999                        goto free_counters; 
     1000                } 
    9641001 
    9651002                for (i = sizeof(struct ipt_entry); 
    9661003                     i < e->target_offset; 
Note: See TracBrowser for help on using the repository browser.