summaryrefslogtreecommitdiff
path: root/net/sched/sch_htb.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2008-01-23 20:33:32 -0800
committerDavid S. Miller <davem@davemloft.net>2008-01-28 15:11:18 -0800
commitcee63723b358e594225e812d6e14a2a0abfd5c88 (patch)
tree847f929e0f445cca8cdf55d7c17a56b0d0f2ec68 /net/sched/sch_htb.c
parentab27cfb85c5778400740ad0c401bde65616774eb (diff)
[NET_SCHED]: Propagate nla_parse return value
nla_parse() returns more detailed errno codes, propagate them back on error. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_htb.c')
-rw-r--r--net/sched/sch_htb.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c
index 3b3ff641b6d7..512df9a0a242 100644
--- a/net/sched/sch_htb.c
+++ b/net/sched/sch_htb.c
@@ -997,9 +997,17 @@ static int htb_init(struct Qdisc *sch, struct nlattr *opt)
struct htb_sched *q = qdisc_priv(sch);
struct nlattr *tb[TCA_HTB_INIT + 1];
struct tc_htb_glob *gopt;
+ int err;
int i;
- if (!opt || nla_parse_nested(tb, TCA_HTB_INIT, opt, NULL) ||
- tb[TCA_HTB_INIT] == NULL ||
+
+ if (!opt)
+ return -EINVAL;
+
+ err = nla_parse_nested(tb, TCA_HTB_INIT, opt, NULL);
+ if (err < 0)
+ return err;
+
+ if (tb[TCA_HTB_INIT] == NULL ||
nla_len(tb[TCA_HTB_INIT]) < sizeof(*gopt)) {
printk(KERN_ERR "HTB: hey probably you have bad tc tool ?\n");
return -EINVAL;
@@ -1302,8 +1310,15 @@ static int htb_change_class(struct Qdisc *sch, u32 classid,
struct tc_htb_opt *hopt;
/* extract all subattrs from opt attr */
- if (!opt || nla_parse_nested(tb, TCA_HTB_RTAB, opt, NULL) ||
- tb[TCA_HTB_PARMS] == NULL ||
+ if (!opt)
+ goto failure;
+
+ err = nla_parse_nested(tb, TCA_HTB_RTAB, opt, NULL);
+ if (err < 0)
+ goto failure;
+
+ err = -EINVAL;
+ if (tb[TCA_HTB_PARMS] == NULL ||
nla_len(tb[TCA_HTB_PARMS]) < sizeof(*hopt))
goto failure;