Commit fa9586af authored by David S. Miller's avatar David S. Miller

Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf

Pablo Neira Ayuso says:

====================
netfilter fixes for net

The following patchset contains Netfilter fixes for your net tree:

1) memleak in ebtables from the error path for the 32/64 compat layer,
   from Florian Westphal.

2) Fix inverted meta ifname/ifidx matching when no interface is set
   on either from the input/output path, from Phil Sutter.

3) Remove goto label in nft_meta_bridge, also from Phil.

4) Missing include guard in xt_connlabel, from Masahiro Yamada.

5) Two patch to fix ipset destination MAC matching coming from
   Stephano Brivio, via Jozsef Kadlecsik.

6) Fix set rename and listing concurrency problem, from Shijie Luo.
   Patch also coming via Jozsef Kadlecsik.

7) ebtables 32/64 compat missing base chain policy in rule count,
   from Florian Westphal.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 246902bd 7cdc4412
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _UAPI_XT_CONNLABEL_H
#define _UAPI_XT_CONNLABEL_H
#include <linux/types.h> #include <linux/types.h>
#define XT_CONNLABEL_MAXBIT 127 #define XT_CONNLABEL_MAXBIT 127
...@@ -11,3 +15,5 @@ struct xt_connlabel_mtinfo { ...@@ -11,3 +15,5 @@ struct xt_connlabel_mtinfo {
__u16 bit; __u16 bit;
__u16 options; __u16 options;
}; };
#endif /* _UAPI_XT_CONNLABEL_H */
...@@ -1770,20 +1770,28 @@ static int compat_calc_entry(const struct ebt_entry *e, ...@@ -1770,20 +1770,28 @@ static int compat_calc_entry(const struct ebt_entry *e,
return 0; return 0;
} }
static int ebt_compat_init_offsets(unsigned int number)
{
if (number > INT_MAX)
return -EINVAL;
/* also count the base chain policies */
number += NF_BR_NUMHOOKS;
return xt_compat_init_offsets(NFPROTO_BRIDGE, number);
}
static int compat_table_info(const struct ebt_table_info *info, static int compat_table_info(const struct ebt_table_info *info,
struct compat_ebt_replace *newinfo) struct compat_ebt_replace *newinfo)
{ {
unsigned int size = info->entries_size; unsigned int size = info->entries_size;
const void *entries = info->entries; const void *entries = info->entries;
int ret;
newinfo->entries_size = size; newinfo->entries_size = size;
if (info->nentries) { ret = ebt_compat_init_offsets(info->nentries);
int ret = xt_compat_init_offsets(NFPROTO_BRIDGE,
info->nentries);
if (ret) if (ret)
return ret; return ret;
}
return EBT_ENTRY_ITERATE(entries, size, compat_calc_entry, info, return EBT_ENTRY_ITERATE(entries, size, compat_calc_entry, info,
entries, newinfo); entries, newinfo);
...@@ -2234,11 +2242,9 @@ static int compat_do_replace(struct net *net, void __user *user, ...@@ -2234,11 +2242,9 @@ static int compat_do_replace(struct net *net, void __user *user,
xt_compat_lock(NFPROTO_BRIDGE); xt_compat_lock(NFPROTO_BRIDGE);
if (tmp.nentries) { ret = ebt_compat_init_offsets(tmp.nentries);
ret = xt_compat_init_offsets(NFPROTO_BRIDGE, tmp.nentries);
if (ret < 0) if (ret < 0)
goto out_unlock; goto out_unlock;
}
ret = compat_copy_entries(entries_tmp, tmp.entries_size, &state); ret = compat_copy_entries(entries_tmp, tmp.entries_size, &state);
if (ret < 0) if (ret < 0)
...@@ -2261,8 +2267,10 @@ static int compat_do_replace(struct net *net, void __user *user, ...@@ -2261,8 +2267,10 @@ static int compat_do_replace(struct net *net, void __user *user,
state.buf_kern_len = size64; state.buf_kern_len = size64;
ret = compat_copy_entries(entries_tmp, tmp.entries_size, &state); ret = compat_copy_entries(entries_tmp, tmp.entries_size, &state);
if (WARN_ON(ret < 0)) if (WARN_ON(ret < 0)) {
vfree(entries_tmp);
goto out_unlock; goto out_unlock;
}
vfree(entries_tmp); vfree(entries_tmp);
tmp.entries_size = size64; tmp.entries_size = size64;
......
...@@ -30,13 +30,9 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr, ...@@ -30,13 +30,9 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr,
switch (priv->key) { switch (priv->key) {
case NFT_META_BRI_IIFNAME: case NFT_META_BRI_IIFNAME:
br_dev = nft_meta_get_bridge(in); br_dev = nft_meta_get_bridge(in);
if (!br_dev)
goto err;
break; break;
case NFT_META_BRI_OIFNAME: case NFT_META_BRI_OIFNAME:
br_dev = nft_meta_get_bridge(out); br_dev = nft_meta_get_bridge(out);
if (!br_dev)
goto err;
break; break;
case NFT_META_BRI_IIFPVID: { case NFT_META_BRI_IIFPVID: {
u16 p_pvid; u16 p_pvid;
...@@ -61,13 +57,11 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr, ...@@ -61,13 +57,11 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr,
return; return;
} }
default: default:
goto out; return nft_meta_get_eval(expr, regs, pkt);
} }
strncpy((char *)dest, br_dev->name, IFNAMSIZ); strncpy((char *)dest, br_dev ? br_dev->name : "", IFNAMSIZ);
return; return;
out:
return nft_meta_get_eval(expr, regs, pkt);
err: err:
regs->verdict.code = NFT_BREAK; regs->verdict.code = NFT_BREAK;
} }
......
...@@ -226,7 +226,7 @@ bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb, ...@@ -226,7 +226,7 @@ bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb,
e.id = ip_to_id(map, ip); e.id = ip_to_id(map, ip);
if (opt->flags & IPSET_DIM_ONE_SRC) if (opt->flags & IPSET_DIM_TWO_SRC)
ether_addr_copy(e.ether, eth_hdr(skb)->h_source); ether_addr_copy(e.ether, eth_hdr(skb)->h_source);
else else
ether_addr_copy(e.ether, eth_hdr(skb)->h_dest); ether_addr_copy(e.ether, eth_hdr(skb)->h_dest);
......
...@@ -1161,7 +1161,7 @@ static int ip_set_rename(struct net *net, struct sock *ctnl, ...@@ -1161,7 +1161,7 @@ static int ip_set_rename(struct net *net, struct sock *ctnl,
return -ENOENT; return -ENOENT;
write_lock_bh(&ip_set_ref_lock); write_lock_bh(&ip_set_ref_lock);
if (set->ref != 0) { if (set->ref != 0 || set->ref_netlink != 0) {
ret = -IPSET_ERR_REFERENCED; ret = -IPSET_ERR_REFERENCED;
goto out; goto out;
} }
......
...@@ -89,15 +89,11 @@ hash_ipmac4_kadt(struct ip_set *set, const struct sk_buff *skb, ...@@ -89,15 +89,11 @@ hash_ipmac4_kadt(struct ip_set *set, const struct sk_buff *skb,
struct hash_ipmac4_elem e = { .ip = 0, { .foo[0] = 0, .foo[1] = 0 } }; struct hash_ipmac4_elem e = { .ip = 0, { .foo[0] = 0, .foo[1] = 0 } };
struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set); struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set);
/* MAC can be src only */
if (!(opt->flags & IPSET_DIM_TWO_SRC))
return 0;
if (skb_mac_header(skb) < skb->head || if (skb_mac_header(skb) < skb->head ||
(skb_mac_header(skb) + ETH_HLEN) > skb->data) (skb_mac_header(skb) + ETH_HLEN) > skb->data)
return -EINVAL; return -EINVAL;
if (opt->flags & IPSET_DIM_ONE_SRC) if (opt->flags & IPSET_DIM_TWO_SRC)
ether_addr_copy(e.ether, eth_hdr(skb)->h_source); ether_addr_copy(e.ether, eth_hdr(skb)->h_source);
else else
ether_addr_copy(e.ether, eth_hdr(skb)->h_dest); ether_addr_copy(e.ether, eth_hdr(skb)->h_dest);
......
...@@ -60,24 +60,16 @@ void nft_meta_get_eval(const struct nft_expr *expr, ...@@ -60,24 +60,16 @@ void nft_meta_get_eval(const struct nft_expr *expr,
*dest = skb->mark; *dest = skb->mark;
break; break;
case NFT_META_IIF: case NFT_META_IIF:
if (in == NULL) *dest = in ? in->ifindex : 0;
goto err;
*dest = in->ifindex;
break; break;
case NFT_META_OIF: case NFT_META_OIF:
if (out == NULL) *dest = out ? out->ifindex : 0;
goto err;
*dest = out->ifindex;
break; break;
case NFT_META_IIFNAME: case NFT_META_IIFNAME:
if (in == NULL) strncpy((char *)dest, in ? in->name : "", IFNAMSIZ);
goto err;
strncpy((char *)dest, in->name, IFNAMSIZ);
break; break;
case NFT_META_OIFNAME: case NFT_META_OIFNAME:
if (out == NULL) strncpy((char *)dest, out ? out->name : "", IFNAMSIZ);
goto err;
strncpy((char *)dest, out->name, IFNAMSIZ);
break; break;
case NFT_META_IIFTYPE: case NFT_META_IIFTYPE:
if (in == NULL) if (in == NULL)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment