On Thu, 2010-02-04 at 13:07 +0100, Stanislaw Gruszka wrote: > Patch prevents call set_wep_key() with zero key length. That fix long > standing regression since commit c0380693520b1a1e4f756799a0edc379378b462a > "airo: clean up WEP key operations". Additionally print call trace when > someone will try to use improper parameters, and remove key.len = 0 > assignment, because it is in not possible code path. > > v1->v2 > Return instantly from set_wep_key() when keylen == 0. > > Reported-and-bisected-by: Chris Siebenmann <cks-rhbugzilla@xxxxxxxxxxxxxx> > Cc: Dan Williams <dcbw@xxxxxxxxxx> > Cc: <stable@xxxxxxxxxx> > Signed-off-by: Stanislaw Gruszka <sgruszka@xxxxxxxxxx> Acked-by: Dan Williams <dcbw@xxxxxxxxxx> > --- > drivers/net/wireless/airo.c | 33 ++++++++++++++++++--------------- > 1 files changed, 18 insertions(+), 15 deletions(-) > > diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c > index 4331d67..01bffc2 100644 > --- a/drivers/net/wireless/airo.c > +++ b/drivers/net/wireless/airo.c > @@ -5254,11 +5254,8 @@ static int set_wep_key(struct airo_info *ai, u16 index, const char *key, > WepKeyRid wkr; > int rc; > > - if (keylen == 0) { > - airo_print_err(ai->dev->name, "%s: key length to set was zero", > - __func__); > + if (WARN_ON(keylen == 0)) > return -1; > - } > > memset(&wkr, 0, sizeof(wkr)); > wkr.len = cpu_to_le16(sizeof(wkr)); > @@ -6405,11 +6402,7 @@ static int airo_set_encode(struct net_device *dev, > if (dwrq->length > MIN_KEY_SIZE) > key.len = MAX_KEY_SIZE; > else > - if (dwrq->length > 0) > - key.len = MIN_KEY_SIZE; > - else > - /* Disable the key */ > - key.len = 0; > + key.len = MIN_KEY_SIZE; > /* Check if the key is not marked as invalid */ > if(!(dwrq->flags & IW_ENCODE_NOKEY)) { > /* Cleanup */ > @@ -6590,12 +6583,22 @@ static int airo_set_encodeext(struct net_device *dev, > default: > return -EINVAL; > } > - /* Send the key to the card */ > - rc = set_wep_key(local, idx, key.key, key.len, perm, 1); > - if (rc < 0) { > - airo_print_err(local->dev->name, "failed to set WEP key" > - " at index %d: %d.", idx, rc); > - return rc; > + if (key.len == 0) { > + rc = set_wep_tx_idx(local, idx, perm, 1); > + if (rc < 0) { > + airo_print_err(local->dev->name, > + "failed to set WEP transmit index to %d: %d.", > + idx, rc); > + return rc; > + } > + } else { > + rc = set_wep_key(local, idx, key.key, key.len, perm, 1); > + if (rc < 0) { > + airo_print_err(local->dev->name, > + "failed to set WEP key at index %d: %d.", > + idx, rc); > + return rc; > + } > } > } > -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html