2007-05-04 01:04:18

by Michael Wu

[permalink] [raw]
Subject: [PATCH v2] mac80211: prevent a wme_qdiscop_init BUG on other devices

From: Michael Wu <[email protected]>

This prevents a BUG if the ieee80211 qdisc is being registered on a net dev
without ieee80211_ptr set. It also ensures the device is a mac80211 device.

Signed-off-by: Michael Wu <[email protected]>
---

net/mac80211/wme.c | 12 ++++++++++--
1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c
index 3823f15..89ce815 100644
--- a/net/mac80211/wme.c
+++ b/net/mac80211/wme.c
@@ -389,10 +389,15 @@ static int wme_qdiscop_init(struct Qdisc *qd, struct rtattr *opt)
{
struct ieee80211_sched_data *q = qdisc_priv(qd);
struct net_device *dev = qd->dev;
- struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
- int queues = local->hw.queues;
+ struct ieee80211_local *local;
+ int queues;
int err = 0, i;

+ /* check that device is a mac80211 device */
+ if (!dev->ieee80211_ptr ||
+ dev->ieee80211_ptr->wiphy->privid != mac80211_wiphy_privid)
+ return -EINVAL;
+
/* check this device is an ieee80211 master type device */
if (dev->type != ARPHRD_IEEE80211)
return -EINVAL;
@@ -406,6 +411,9 @@ static int wme_qdiscop_init(struct Qdisc *qd, struct rtattr *opt)
if (qd->flags & TCQ_F_INGRESS)
return -EINVAL;

+ local = wdev_priv(dev->ieee80211_ptr);
+ queues = local->hw.queues;
+
/* if options were passed in, set them */
if (opt) {
err = wme_qdiscop_tune(qd, opt);



2007-05-04 14:46:08

by Jiri Benc

[permalink] [raw]
Subject: Re: [PATCH v2] mac80211: prevent a wme_qdiscop_init BUG on other devices

On Thu, 03 May 2007 21:02:31 -0400, Michael Wu wrote:
> This prevents a BUG if the ieee80211 qdisc is being registered on a net dev
> without ieee80211_ptr set. It also ensures the device is a mac80211 device.

Applied, thanks!

Jiri

--
Jiri Benc
SUSE Labs