Patch "sched: cls_flow: fix panic on filter replace" has been added to the 4.1-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
sched: cls_flow: fix panic on filter replace
to the 4.1-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:
sched-cls_flow-fix-panic-on-filter-replace.patch
and it can be found in the queue-4.1 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 Sat Sep 26 11:13:07 PDT 2015
From: Daniel Borkmann <[email protected]>
Date: Fri, 17 Jul 2015 22:38:45 +0200
Subject: sched: cls_flow: fix panic on filter replace
From: Daniel Borkmann <[email protected]>
[ Upstream commit 32b2f4b196b37695fdb42b31afcbc15399d6ef91 ]
The following test case causes a NULL pointer dereference in cls_flow:
tc filter add dev foo parent 1: handle 0x1 flow hash keys dst action ok tc filter replace dev foo parent 1: pref 49152 handle 0x1 \
flow hash keys mark action drop
To be more precise, actually two different panics are fixed, the first occurs because tcf_exts_init() is not called on the newly allocated filter when we do a replace. And the second panic uncovered after that happens since the arguments of list_replace_rcu() are swapped, the old element needs to be the first argument and the new element the second.
--- net/sched/cls_flow.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/sched/cls_flow.c +3 -2
@@ -419,6 +419,8 @@ static int flow_change(struct net *net,if (!fnew) goto err2; +tcf_exts_init (&fnew->exts,TCA_FLOW_ACT ,TCA_FLOW_POLICE ); + fold = (struct flow_filter *)*arg;if (fold) { err = -EINVAL ;
@@ -480,7 +482,6 @@ static int flow_change(struct net *net, fnew->mask = ~0U ; fnew->tp = tp;get_random_bytes (&fnew->hashrnd,4 ); -tcf_exts_init (&fnew->exts,TCA_FLOW_ACT ,TCA_FLOW_POLICE ); } fnew->perturb_timer.function = flow_perturbation;
@@ -520,7 +521,7 @@ static int flow_change(struct net *net,if (*arg ==0 )list_add_tail_rcu (&fnew->list, &head->filters);else -list_replace_rcu (&fnew->list, &fold->list); +list_replace_rcu (&fold->list, &fnew->list); *arg = (unsigned long )fnew;
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/sched-cls_bpf-fix-panic-on-filter-replace.patch queue-4.1/net-sched-fix-refcount-imbalance-in-actions.patch queue-4.1/sched-cls_flow-fix-panic-on-filter-replace.patch queue-4.1/act_bpf-fix-memory-leaks-when-replacing-bpf-programs.patch queue-4.1/packet-tpacket_snd-fix-signed-unsigned-comparison.patch queue-4.1/rtnetlink-verify-ifla_vf_info-attributes-before-passing-them-to-driver.patch queue-4.1/netlink-make-sure-ebusy-won-t-escape-from-netlink_insert.patch