mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-16 05:50:19 +00:00
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, they are: 1) Use mod_timer_pending() to avoid reactivating a dead expectation in the h323 conntrack helper, from Liping Zhang. 2) Oneliner to fix a type in the register name defined in the nf_tables header. 3) Don't try to look further when we find an inactive elements with no descendants in the rbtree set implementation, otherwise we crash. 4) Handle valid zero CSeq in the SIP conntrack helper, from Christophe Leroy. 5) Don't display a trailing slash in conntrack helper with no classes via /proc/net/nf_conntrack_expect, from Liping Zhang. 6) Fix an expectation leak during creation from the nfqueue path, again from Liping Zhang. 7) Validate netlink port ID in verdict message from nfqueue, otherwise an injection can be possible. Again from Zhang. 8) Reject conntrack tuples with different transport protocol on original and reply tuples, also from Zhang. 9) Validate offset and length in nft_exthdr, make sure they are under sizeof(u8), from Laura Garcia Liebana. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
293fddff20
@ -24,7 +24,7 @@ enum nft_registers {
|
||||
__NFT_REG_MAX,
|
||||
|
||||
NFT_REG32_00 = 8,
|
||||
MFT_REG32_01,
|
||||
NFT_REG32_01,
|
||||
NFT_REG32_02,
|
||||
NFT_REG32_03,
|
||||
NFT_REG32_04,
|
||||
|
@ -574,7 +574,7 @@ static int exp_seq_show(struct seq_file *s, void *v)
|
||||
helper = rcu_dereference(nfct_help(expect->master)->helper);
|
||||
if (helper) {
|
||||
seq_printf(s, "%s%s", expect->flags ? " " : "", helper->name);
|
||||
if (helper->expect_policy[expect->class].name)
|
||||
if (helper->expect_policy[expect->class].name[0])
|
||||
seq_printf(s, "/%s",
|
||||
helper->expect_policy[expect->class].name);
|
||||
}
|
||||
|
@ -1473,7 +1473,8 @@ static int process_rcf(struct sk_buff *skb, struct nf_conn *ct,
|
||||
"timeout to %u seconds for",
|
||||
info->timeout);
|
||||
nf_ct_dump_tuple(&exp->tuple);
|
||||
mod_timer(&exp->timeout, jiffies + info->timeout * HZ);
|
||||
mod_timer_pending(&exp->timeout,
|
||||
jiffies + info->timeout * HZ);
|
||||
}
|
||||
spin_unlock_bh(&nf_conntrack_expect_lock);
|
||||
}
|
||||
|
@ -1894,6 +1894,8 @@ static int ctnetlink_new_conntrack(struct net *net, struct sock *ctnl,
|
||||
|
||||
if (!cda[CTA_TUPLE_ORIG] || !cda[CTA_TUPLE_REPLY])
|
||||
return -EINVAL;
|
||||
if (otuple.dst.protonum != rtuple.dst.protonum)
|
||||
return -EINVAL;
|
||||
|
||||
ct = ctnetlink_create_conntrack(net, &zone, cda, &otuple,
|
||||
&rtuple, u3);
|
||||
@ -2362,12 +2364,8 @@ ctnetlink_glue_attach_expect(const struct nlattr *attr, struct nf_conn *ct,
|
||||
return PTR_ERR(exp);
|
||||
|
||||
err = nf_ct_expect_related_report(exp, portid, report);
|
||||
if (err < 0) {
|
||||
nf_ct_expect_put(exp);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
nf_ct_expect_put(exp);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void ctnetlink_glue_seqadj(struct sk_buff *skb, struct nf_conn *ct,
|
||||
|
@ -1383,7 +1383,7 @@ static int process_sip_response(struct sk_buff *skb, unsigned int protoff,
|
||||
return NF_DROP;
|
||||
}
|
||||
cseq = simple_strtoul(*dptr + matchoff, NULL, 10);
|
||||
if (!cseq) {
|
||||
if (!cseq && *(*dptr + matchoff) != '0') {
|
||||
nf_ct_helper_log(skb, ct, "cannot get cseq");
|
||||
return NF_DROP;
|
||||
}
|
||||
@ -1446,7 +1446,7 @@ static int process_sip_request(struct sk_buff *skb, unsigned int protoff,
|
||||
return NF_DROP;
|
||||
}
|
||||
cseq = simple_strtoul(*dptr + matchoff, NULL, 10);
|
||||
if (!cseq) {
|
||||
if (!cseq && *(*dptr + matchoff) != '0') {
|
||||
nf_ct_helper_log(skb, ct, "cannot get cseq");
|
||||
return NF_DROP;
|
||||
}
|
||||
|
@ -1145,10 +1145,8 @@ static int nfqnl_recv_verdict(struct net *net, struct sock *ctnl,
|
||||
struct nfnl_queue_net *q = nfnl_queue_pernet(net);
|
||||
int err;
|
||||
|
||||
queue = instance_lookup(q, queue_num);
|
||||
if (!queue)
|
||||
queue = verdict_instance_lookup(q, queue_num,
|
||||
NETLINK_CB(skb).portid);
|
||||
queue = verdict_instance_lookup(q, queue_num,
|
||||
NETLINK_CB(skb).portid);
|
||||
if (IS_ERR(queue))
|
||||
return PTR_ERR(queue);
|
||||
|
||||
|
@ -59,6 +59,7 @@ static int nft_exthdr_init(const struct nft_ctx *ctx,
|
||||
const struct nlattr * const tb[])
|
||||
{
|
||||
struct nft_exthdr *priv = nft_expr_priv(expr);
|
||||
u32 offset, len;
|
||||
|
||||
if (tb[NFTA_EXTHDR_DREG] == NULL ||
|
||||
tb[NFTA_EXTHDR_TYPE] == NULL ||
|
||||
@ -66,9 +67,15 @@ static int nft_exthdr_init(const struct nft_ctx *ctx,
|
||||
tb[NFTA_EXTHDR_LEN] == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
offset = ntohl(nla_get_be32(tb[NFTA_EXTHDR_OFFSET]));
|
||||
len = ntohl(nla_get_be32(tb[NFTA_EXTHDR_LEN]));
|
||||
|
||||
if (offset > U8_MAX || len > U8_MAX)
|
||||
return -ERANGE;
|
||||
|
||||
priv->type = nla_get_u8(tb[NFTA_EXTHDR_TYPE]);
|
||||
priv->offset = ntohl(nla_get_be32(tb[NFTA_EXTHDR_OFFSET]));
|
||||
priv->len = ntohl(nla_get_be32(tb[NFTA_EXTHDR_LEN]));
|
||||
priv->offset = offset;
|
||||
priv->len = len;
|
||||
priv->dreg = nft_parse_register(tb[NFTA_EXTHDR_DREG]);
|
||||
|
||||
return nft_validate_register_store(ctx, priv->dreg, NULL,
|
||||
|
@ -70,7 +70,6 @@ static bool nft_rbtree_lookup(const struct net *net, const struct nft_set *set,
|
||||
} else if (d > 0)
|
||||
parent = parent->rb_right;
|
||||
else {
|
||||
found:
|
||||
if (!nft_set_elem_active(&rbe->ext, genmask)) {
|
||||
parent = parent->rb_left;
|
||||
continue;
|
||||
@ -84,9 +83,12 @@ found:
|
||||
}
|
||||
}
|
||||
|
||||
if (set->flags & NFT_SET_INTERVAL && interval != NULL) {
|
||||
rbe = interval;
|
||||
goto found;
|
||||
if (set->flags & NFT_SET_INTERVAL && interval != NULL &&
|
||||
nft_set_elem_active(&interval->ext, genmask) &&
|
||||
!nft_rbtree_interval_end(interval)) {
|
||||
spin_unlock_bh(&nft_rbtree_lock);
|
||||
*ext = &interval->ext;
|
||||
return true;
|
||||
}
|
||||
out:
|
||||
spin_unlock_bh(&nft_rbtree_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user