]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net_sched: initialize timer earlier in red_init()
authorCong Wang <xiyou.wangcong@gmail.com>
Sat, 25 Jul 2020 20:17:07 +0000 (13:17 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 29 Jul 2020 00:41:23 +0000 (17:41 -0700)
When red_init() fails, red_destroy() is called to clean up.
If the timer is not initialized yet, del_timer_sync() will
complain. So we have to move timer_setup() before any failure.

Reported-and-tested-by: syzbot+6e95a4fabf88dc217145@syzkaller.appspotmail.com
Fixes: aee9caa03fc3 ("net: sched: sch_red: Add qevents "early_drop" and "mark"")
Cc: Petr Machata <petrm@mellanox.com>
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: Jiri Pirko <jiri@resnulli.us>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Reviewed-by: Petr Machata <petrm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_red.c

index 4cc0ad0b11892b270acf776157c934097fb319ed..deac82f3ad7b860b7494901e5084863a3cc13e0c 100644 (file)
@@ -333,6 +333,10 @@ static int red_init(struct Qdisc *sch, struct nlattr *opt,
        struct nlattr *tb[TCA_RED_MAX + 1];
        int err;
 
+       q->qdisc = &noop_qdisc;
+       q->sch = sch;
+       timer_setup(&q->adapt_timer, red_adaptative_timer, 0);
+
        if (!opt)
                return -EINVAL;
 
@@ -341,10 +345,6 @@ static int red_init(struct Qdisc *sch, struct nlattr *opt,
        if (err < 0)
                return err;
 
-       q->qdisc = &noop_qdisc;
-       q->sch = sch;
-       timer_setup(&q->adapt_timer, red_adaptative_timer, 0);
-
        err = __red_change(sch, tb, extack);
        if (err)
                return err;