diff options
| author | Martin Devera <devik@cdi.cz> | 2002-09-26 00:28:19 -0700 |
|---|---|---|
| committer | David S. Miller <davem@nuts.ninka.net> | 2002-09-26 00:28:19 -0700 |
| commit | 5568a809583c69fab1cb22d0e9dcd3c93a118167 (patch) | |
| tree | 6eb26f406d51758cd7ed0d94780f51110428c0c0 | |
| parent | b0cb4be782d042015cd39dc66b58e1a5f41820c9 (diff) | |
net/sched/sch_htb.c: Verify classid and direct_qlen properly.
| -rw-r--r-- | net/sched/sch_htb.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index d271d4defc14..fbf86ac9a2d2 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -1163,6 +1163,8 @@ static int htb_init(struct Qdisc *sch, struct rtattr *opt) skb_queue_head_init(&q->direct_queue); q->direct_qlen = sch->dev->tx_queue_len; + if (q->direct_qlen < 2) /* some devices have zero tx_queue_len */ + q->direct_qlen = 2; q->timer.function = htb_timer; q->timer.data = (unsigned long)sch; @@ -1429,6 +1431,10 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, if (!rtab || !ctab) goto failure; if (!cl) { /* new class */ + /* check for valid classid */ + if (!classid || TC_H_MAJ(classid^sch->handle) || htb_find(classid,sch)) + goto failure; + /* check maximal depth */ if (parent && parent->parent && parent->parent->level < 2) { printk(KERN_ERR "htb: tree is too deep\n"); |
