Message ID | 20171028050856.18393-1-xiyou.wangcong@gmail.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Series | [net] net_sched: avoid matching qdisc with zero handle | expand |
From: Cong Wang <xiyou.wangcong@gmail.com> Date: Fri, 27 Oct 2017 22:08:56 -0700 > Davide found the following script triggers a NULL pointer > dereference: > > ip l a name eth0 type dummy > tc q a dev eth0 parent :1 handle 1: htb > > This is because for a freshly created netdevice noop_qdisc > is attached and when passing 'parent :1', kernel actually > tries to match the major handle which is 0 and noop_qdisc > has handle 0 so is matched by mistake. Commit 69012ae425d7 > tries to fix a similar bug but still misses this case. > > Handle 0 is not a valid one, should be just skipped. In > fact, kernel uses it as TC_H_UNSPEC. > > Fixes: 69012ae425d7 ("net: sched: fix handling of singleton qdiscs with qdisc_hash") > Fixes: 59cc1f61f09c ("net: sched:convert qdisc linked list to hashtable") > Reported-by: Davide Caratti <dcaratti@redhat.com> > Cc: Jiri Kosina <jkosina@suse.cz> > Cc: Eric Dumazet <edumazet@google.com> > Cc: Jamal Hadi Salim <jhs@mojatatu.com> > Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Applied and queued up for -stable, thanks.
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index c6deb74e3d2f..22bc6fc48311 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -301,6 +301,8 @@ struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle) { struct Qdisc *q; + if (!handle) + return NULL; q = qdisc_match_from_root(dev->qdisc, handle); if (q) goto out;
Davide found the following script triggers a NULL pointer dereference: ip l a name eth0 type dummy tc q a dev eth0 parent :1 handle 1: htb This is because for a freshly created netdevice noop_qdisc is attached and when passing 'parent :1', kernel actually tries to match the major handle which is 0 and noop_qdisc has handle 0 so is matched by mistake. Commit 69012ae425d7 tries to fix a similar bug but still misses this case. Handle 0 is not a valid one, should be just skipped. In fact, kernel uses it as TC_H_UNSPEC. Fixes: 69012ae425d7 ("net: sched: fix handling of singleton qdiscs with qdisc_hash") Fixes: 59cc1f61f09c ("net: sched:convert qdisc linked list to hashtable") Reported-by: Davide Caratti <dcaratti@redhat.com> Cc: Jiri Kosina <jkosina@suse.cz> Cc: Eric Dumazet <edumazet@google.com> Cc: Jamal Hadi Salim <jhs@mojatatu.com> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> --- net/sched/sch_api.c | 2 ++ 1 file changed, 2 insertions(+)