diff mbox series

[net] net_sched: avoid matching qdisc with zero handle

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

Commit Message

Cong Wang Oct. 28, 2017, 5:08 a.m. UTC
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(+)

Comments

David Miller Oct. 29, 2017, 8:56 a.m. UTC | #1
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 mbox series

Patch

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;