Commit 32b2f4b196b37695fdb42b31afcbc15399d6ef91
Committed by
David S. Miller
1 parent
ff3532f265
sched: cls_flow: fix panic on filter replace
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. Fixes: 70da9f0bf999 ("net: sched: cls_flow use RCU") Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: John Fastabend <john.r.fastabend@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 1 changed file with 3 additions and 2 deletions Side-by-side Diff
net/sched/cls_flow.c
... | ... | @@ -425,6 +425,8 @@ |
425 | 425 | if (!fnew) |
426 | 426 | goto err2; |
427 | 427 | |
428 | + tcf_exts_init(&fnew->exts, TCA_FLOW_ACT, TCA_FLOW_POLICE); | |
429 | + | |
428 | 430 | fold = (struct flow_filter *)*arg; |
429 | 431 | if (fold) { |
430 | 432 | err = -EINVAL; |
... | ... | @@ -486,7 +488,6 @@ |
486 | 488 | fnew->mask = ~0U; |
487 | 489 | fnew->tp = tp; |
488 | 490 | get_random_bytes(&fnew->hashrnd, 4); |
489 | - tcf_exts_init(&fnew->exts, TCA_FLOW_ACT, TCA_FLOW_POLICE); | |
490 | 491 | } |
491 | 492 | |
492 | 493 | fnew->perturb_timer.function = flow_perturbation; |
... | ... | @@ -526,7 +527,7 @@ |
526 | 527 | if (*arg == 0) |
527 | 528 | list_add_tail_rcu(&fnew->list, &head->filters); |
528 | 529 | else |
529 | - list_replace_rcu(&fnew->list, &fold->list); | |
530 | + list_replace_rcu(&fold->list, &fnew->list); | |
530 | 531 | |
531 | 532 | *arg = (unsigned long)fnew; |
532 | 533 |