summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Devera <devik@cdi.cz>2002-09-26 00:28:19 -0700
committerDavid S. Miller <davem@nuts.ninka.net>2002-09-26 00:28:19 -0700
commit5568a809583c69fab1cb22d0e9dcd3c93a118167 (patch)
tree6eb26f406d51758cd7ed0d94780f51110428c0c0
parentb0cb4be782d042015cd39dc66b58e1a5f41820c9 (diff)
net/sched/sch_htb.c: Verify classid and direct_qlen properly.
-rw-r--r--net/sched/sch_htb.c6
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");