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>
        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;
 
        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;