lkml.org 
[lkml]   [2010]   [Mar]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[031/145] airo: fix setting zero length WEP key
    2.6.32-stable review patch.  If anyone has any objections, please let me know.

    ----------------
    From: Stanislaw Gruszka <sgruszka@redhat.com>

    commit f09c256375c7cf1e112b8ef6306cdd313490d7c0 upstream.

    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.

    Reported-by: Chris Siebenmann <cks-rhbugzilla@cs.toronto.edu>
    Bisected-by: Chris Siebenmann <cks-rhbugzilla@cs.toronto.edu>
    Tested-by: Chris Siebenmann <cks@cs.toronto.edu>
    Cc: Dan Williams <dcbw@redhat.com>
    Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
    Signed-off-by: John W. Linville <linville@tuxdriver.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/net/wireless/airo.c | 34 ++++++++++++++++++----------------
    1 file changed, 18 insertions(+), 16 deletions(-)

    --- a/drivers/net/wireless/airo.c
    +++ b/drivers/net/wireless/airo.c
    @@ -5254,11 +5254,7 @@ static int set_wep_key(struct airo_info
    WepKeyRid wkr;
    int rc;

    - if (keylen == 0) {
    - airo_print_err(ai->dev->name, "%s: key length to set was zero",
    - __func__);
    - return -1;
    - }
    + WARN_ON(keylen == 0);

    memset(&wkr, 0, sizeof(wkr));
    wkr.len = cpu_to_le16(sizeof(wkr));
    @@ -6404,11 +6400,7 @@ static int airo_set_encode(struct net_de
    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 */
    @@ -6589,12 +6581,22 @@ static int airo_set_encodeext(struct net
    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;
    + }
    }
    }




    \
     
     \ /
      Last update: 2010-03-13 01:35    [W:0.024 / U:0.036 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site