2009-08-09 12:24:10

by Christian Lamparter

[permalink] [raw]
Subject: [PATCH 2.6.31] ar9170: fix read & write outside array bounds

From: Dan Carpenter <[email protected]>

queue == __AR9170_NUM_TXQ would cause a bug on the next line.

found by Smatch ( http://repo.or.cz/w/smatch.git ).

Cc: [email protected]
Reported-by: Dan Carpenter <[email protected]>
Signed-off-by: Dan Carpenter <[email protected]>
Signed-off-by: Christian Lamparter <[email protected]>
---
diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
index 4fc389a..ea8c941 100644
--- a/drivers/net/wireless/ath/ar9170/main.c
+++ b/drivers/net/wireless/ath/ar9170/main.c
@@ -2458,13 +2458,14 @@ static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
int ret;

mutex_lock(&ar->mutex);
- if ((param) && !(queue > __AR9170_NUM_TXQ)) {
+ if (queue < __AR9170_NUM_TXQ) {
memcpy(&ar->edcf[ar9170_qos_hwmap[queue]],
param, sizeof(*param));

ret = ar9170_set_qos(ar);
- } else
+ } else {
ret = -EINVAL;
+ }

mutex_unlock(&ar->mutex);
return ret;


2009-08-10 18:01:08

by John W. Linville

[permalink] [raw]
Subject: Re: [PATCH 2.6.31] ar9170: fix read & write outside array bounds

On Sun, Aug 09, 2009 at 02:24:09PM +0200, Christian Lamparter wrote:
> From: Dan Carpenter <[email protected]>
>
> queue == __AR9170_NUM_TXQ would cause a bug on the next line.
>
> found by Smatch ( http://repo.or.cz/w/smatch.git ).
>
> Cc: [email protected]
> Reported-by: Dan Carpenter <[email protected]>
> Signed-off-by: Dan Carpenter <[email protected]>
> Signed-off-by: Christian Lamparter <[email protected]>
> ---
> diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
> index 4fc389a..ea8c941 100644
> --- a/drivers/net/wireless/ath/ar9170/main.c
> +++ b/drivers/net/wireless/ath/ar9170/main.c
> @@ -2458,13 +2458,14 @@ static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
> int ret;
>
> mutex_lock(&ar->mutex);
> - if ((param) && !(queue > __AR9170_NUM_TXQ)) {
> + if (queue < __AR9170_NUM_TXQ) {
> memcpy(&ar->edcf[ar9170_qos_hwmap[queue]],
> param, sizeof(*param));
>
> ret = ar9170_set_qos(ar);
> - } else
> + } else {
> ret = -EINVAL;
> + }
>
> mutex_unlock(&ar->mutex);
> return ret;

The p54 version of this patch used hw->queues instead of a constant.
Wouldn't that be better here?

John
--
John W. Linville Someday the world will need a hero, and you
[email protected] might be all we have. Be ready.

2009-08-10 18:56:07

by Christian Lamparter

[permalink] [raw]
Subject: Re: [PATCH 2.6.31] ar9170: fix read & write outside array bounds

"John W. Linville" <[email protected]> wrote:
> On Sun, Aug 09, 2009 at 02:24:09PM +0200, Christian Lamparter wrote:
> > From: Dan Carpenter <[email protected]>
> >
> > queue == __AR9170_NUM_TXQ would cause a bug on the next line.
> >
> > found by Smatch ( http://repo.or.cz/w/smatch.git ).
> >
> > Cc: [email protected]
> > Reported-by: Dan Carpenter <[email protected]>
> > Signed-off-by: Dan Carpenter <[email protected]>
> > Signed-off-by: Christian Lamparter <[email protected]>
> > ---
> > diff --git a/drivers/net/wireless/ath/ar9170/main.c b/drivers/net/wireless/ath/ar9170/main.c
> > index 4fc389a..ea8c941 100644
> > --- a/drivers/net/wireless/ath/ar9170/main.c
> > +++ b/drivers/net/wireless/ath/ar9170/main.c
> > @@ -2458,13 +2458,14 @@ static int ar9170_conf_tx(struct ieee80211_hw *hw, u16 queue,
> > int ret;
> >
> > mutex_lock(&ar->mutex);
> > - if ((param) && !(queue > __AR9170_NUM_TXQ)) {
> > + if (queue < __AR9170_NUM_TXQ) {
> > memcpy(&ar->edcf[ar9170_qos_hwmap[queue]],
> > param, sizeof(*param));
> >
> > ret = ar9170_set_qos(ar);
> > - } else
> > + } else {
> > ret = -EINVAL;
> > + }
> >
> > mutex_unlock(&ar->mutex);
> > return ret;
>
> The p54 version of this patch used hw->queues instead of a constant.
> Wouldn't that be better here?
Depends...

Other drivers like ath9k/iwlwifi use a constant _check_ as well.
Having constants is always a plus for AOT compilers.

The reason why p54 does this differently and uses a variable
here, is simply because the number of queues depends on
the firmware revision. Users - with the old, original windows
driver firmwares - have experienced serve stability problems
with QoS enabled.

Regards,
Chr

________________________________________________________________
Neu: WEB.DE Doppel-FLAT mit Internet-Flatrate + Telefon-Flatrate
f?r nur 19,99 Euro/mtl.!* http://produkte.web.de/go/02/