Patch "net: sched: set xt_tgchk_param par.net properly in ipt_init_target" has been added to the 4.12-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
net: sched: set xt_tgchk_param par.net properly in ipt_init_target
to the 4.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-sched-set-xt_tgchk_param-par.net-properly-in-ipt_init_target.patch
and it can be found in the queue-4.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri Aug 11 09:09:38 PDT 2017
From: Xin Long <[email protected]>
Date: Tue, 8 Aug 2017 15:25:25 +0800
Subject: net: sched: set xt_tgchk_param par.net properly in ipt_init_target
From: Xin Long <[email protected]>
[ Upstream commit ec0acb09313074ba1a4976945791d9c6815f39fb ]
Now xt_tgchk_param par in ipt_init_target is a local varibale, par.net is not initialized there. Later when xt_check_target calls target's checkentry in which it may access par.net, it would cause kernel panic.
Jaroslav found this panic when running:
# ip link add TestIface type dummy
# tc qd add dev TestIface ingress handle ffff:
# tc filter add dev TestIface parent ffff: u32 match u32 0 0 \
action xt -j CONNMARK --set-mark 4This patch is to pass net param into ipt_init_target and set par.net with it properly in there.
v1->v2:
As Wang Cong pointed, I missed ipt_net_id != xt_net_id, so fix it by also passing net_id to __tcf_ipt_init.v2->v3:
Missed the fixes tag, so add it.
--- net/sched/act_ipt.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
net/sched/act_ipt.c +10 -10
@@ -36,8 +36,8 @@ static struct tc_action_ops act_ipt_ops;static unsigned int xt_net_id;static struct tc_action_ops act_xt_ops; -static int ipt_init_target (struct xt_entry_target *t,char *table, -unsigned int hook) +static int ipt_init_target (struct net *net,struct xt_entry_target *t, +char *table,unsigned int hook) {struct xt_tgchk_param par;struct xt_target *target;
@@ -49,6 +49,7 @@ static int ipt_init_target(struct xt_entreturn PTR_ERR (target); t->u.kernel.target = target; + par.net = net; par.table = table; par.entryinfo =NULL ; par.target = target;
@@ -91,10 +92,11 @@ static const struct nla_policy ipt_polic [TCA_IPT_TARG] = { .len = sizeof(struct xt_entry_target) }, }; -static int __tcf_ipt_init (struct tc_action_net *tn,struct nlattr *nla, +static int __tcf_ipt_init (struct net *net,unsigned int id,struct nlattr *nla,struct nlattr *est,struct tc_action **a,const struct tc_action_ops *ops,int ovr,int bind) { +struct tc_action_net *tn =net_generic (net, id);struct nlattr *tb[TCA_IPT_MAX +1 ];struct tcf_ipt *ipt;struct xt_entry_target *td, *t;
@@ -159,7 +161,7 @@ static int __tcf_ipt_init(struct tc_actiif (unlikely (!t)) goto err2; - err =ipt_init_target (t, tname, hook); + err =ipt_init_target (net, t, tname, hook);if (err <0 ) goto err3;
@@ -193,18 +195,16 @@ static int tcf_ipt_init(struct net *net, struct nlattr *est, struct tc_action **a, int ovr, int bind) { - struct tc_action_net *tn = net_generic(net, ipt_net_id); - -return __tcf_ipt_init (tn, nla, est, a, &act_ipt_ops, ovr, bind); + return __tcf_ipt_init(net, ipt_net_id, nla, est, a, &act_ipt_ops, ovr, +bind ); }static int tcf_xt_init (struct net *net,struct nlattr *nla,struct nlattr *est,struct tc_action **a,int ovr,int bind) { -struct tc_action_net *tn =net_generic (net, xt_net_id); - -return __tcf_ipt_init (tn, nla, est, a, &act_xt_ops, ovr, bind); +return __tcf_ipt_init (net, xt_net_id, nla, est, a, &act_xt_ops, ovr, + bind); } static int tcf_ipt(struct sk_buff *skb, const struct tc_action *a,
Patches currently in stable-queue which might be from [email protected] are
queue-4.12/ipv6-set-rt6i_protocol-properly-in-the-route-when-it-is-installed.patch queue-4.12/net-sched-set-xt_tgchk_param-par.nft_compat-as-0-in-ipt_init_target.patch queue-4.12/net-sched-set-xt_tgchk_param-par.net-properly-in-ipt_init_target.patch