| From cb3b7106b526380da4133364ffb2cf187759d8ea Mon Sep 17 00:00:00 2001 |
| From: Thomas Graf <tgraf@suug.ch> |
| Date: Wed, 3 Sep 2008 01:00:02 -0700 |
| Subject: [PATCH] sch_prio: Fix nla_parse_nested_compat() regression |
| |
| From: Thomas Graf <tgraf@suug.ch> |
| |
| [ No upstream commit, this is fixing code no longer in 2.6.27 ] |
| |
| nla_parse_nested_compat() was used to parse two different message |
| formats in the netem and prio qdisc, when it was "fixed" to work |
| with netem, it broke the multi queue support in the prio qdisc. |
| Since the prio qdisc code in question is already removed in the |
| development tree, this patch only fixes the regression in the |
| stable tree. |
| |
| Based on original patch from Alexander H Duyck <alexander.h.duyck@intel.com> |
| |
| Signed-off-by: Thomas Graf <tgraf@suug.ch> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/sched/sch_prio.c | 16 +++++++++++----- |
| 1 file changed, 11 insertions(+), 5 deletions(-) |
| |
| --- a/net/sched/sch_prio.c |
| +++ b/net/sched/sch_prio.c |
| @@ -228,14 +228,20 @@ static int prio_tune(struct Qdisc *sch, |
| { |
| struct prio_sched_data *q = qdisc_priv(sch); |
| struct tc_prio_qopt *qopt; |
| - struct nlattr *tb[TCA_PRIO_MAX + 1]; |
| + struct nlattr *tb[TCA_PRIO_MAX + 1] = {0}; |
| int err; |
| int i; |
| |
| - err = nla_parse_nested_compat(tb, TCA_PRIO_MAX, opt, NULL, qopt, |
| - sizeof(*qopt)); |
| - if (err < 0) |
| - return err; |
| + qopt = nla_data(opt); |
| + if (nla_len(opt) < sizeof(*qopt)) |
| + return -1; |
| + |
| + if (nla_len(opt) >= sizeof(*qopt) + sizeof(struct nlattr)) { |
| + err = nla_parse_nested(tb, TCA_PRIO_MAX, |
| + (struct nlattr *) (qopt + 1), NULL); |
| + if (err < 0) |
| + return err; |
| + } |
| |
| q->bands = qopt->bands; |
| /* If we're multiqueue, make sure the number of incoming bands |