orinoco: pass orinoco_set_tkip_key the sequence lengths
authorDavid Kilroy <kilroyd@googlemail.com>
Wed, 5 Aug 2009 20:23:29 +0000 (21:23 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 14 Aug 2009 13:12:42 +0000 (09:12 -0400)
When we store the keys for cfg80211, the sequence lengths will also be
stored. So avoid assuming the sequence lengths at this level.

Signed-off-by: David Kilroy <kilroyd@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/orinoco/hw.c
drivers/net/wireless/orinoco/hw.h
drivers/net/wireless/orinoco/wext.c

index d069fe8b6033470cea5149803dca659881196778..35516a9e2a3006cd03e22bc2389c99a597647b01 100644 (file)
@@ -905,11 +905,12 @@ int __orinoco_hw_setup_enc(struct orinoco_private *priv)
 }
 
 /* key must be 32 bytes, including the tx and rx MIC keys.
- * rsc must be 8 bytes
- * tsc must be 8 bytes or NULL
+ * rsc must be NULL or up to 8 bytes
+ * tsc must be NULL or up to 8 bytes
  */
 int __orinoco_hw_set_tkip_key(struct orinoco_private *priv, int key_idx,
-                             int set_tx, u8 *key, u8 *rsc, u8 *tsc)
+                             int set_tx, u8 *key, u8 *rsc, size_t rsc_len,
+                             u8 *tsc, size_t tsc_len)
 {
        struct {
                __le16 idx;
@@ -934,17 +935,22 @@ int __orinoco_hw_set_tkip_key(struct orinoco_private *priv, int key_idx,
        memcpy(buf.key, key,
               sizeof(buf.key) + sizeof(buf.tx_mic) + sizeof(buf.rx_mic));
 
-       if (rsc == NULL)
-               memset(buf.rsc, 0, sizeof(buf.rsc));
-       else
-               memcpy(buf.rsc, rsc, sizeof(buf.rsc));
+       if (rsc_len > sizeof(buf.rsc))
+               rsc_len = sizeof(buf.rsc);
+
+       if (tsc_len > sizeof(buf.tsc))
+               tsc_len = sizeof(buf.tsc);
+
+       memset(buf.rsc, 0, sizeof(buf.rsc));
+       memset(buf.tsc, 0, sizeof(buf.tsc));
+
+       if (rsc != NULL)
+               memcpy(buf.rsc, rsc, rsc_len);
 
-       if (tsc == NULL) {
-               memset(buf.tsc, 0, sizeof(buf.tsc));
+       if (tsc != NULL)
+               memcpy(buf.tsc, tsc, tsc_len);
+       else
                buf.tsc[4] = 0x10;
-       } else {
-               memcpy(buf.tsc, tsc, sizeof(buf.tsc));
-       }
 
        /* Wait upto 100ms for tx queue to empty */
        for (k = 100; k > 0; k--) {
index 27b427649d1bea232165ba226592d5f251c06c27..33a31fa7c6259d959f0f5ad3edc435512431e6a4 100644 (file)
@@ -38,7 +38,8 @@ int __orinoco_hw_set_wap(struct orinoco_private *priv);
 int __orinoco_hw_setup_wepkeys(struct orinoco_private *priv);
 int __orinoco_hw_setup_enc(struct orinoco_private *priv);
 int __orinoco_hw_set_tkip_key(struct orinoco_private *priv, int key_idx,
-                             int set_tx, u8 *key, u8 *rsc, u8 *tsc);
+                             int set_tx, u8 *key, u8 *rsc, size_t rsc_len,
+                             u8 *tsc, size_t tsc_len);
 int orinoco_clear_tkip_key(struct orinoco_private *priv, int key_idx);
 int __orinoco_hw_set_multicast_list(struct orinoco_private *priv,
                                    struct dev_addr_list *mc_list,
index 33d81b4823a28bafd9d96776fbb5e3e74debdded..7e18bb404935c16a5399b3b9e386c7547983d324 100644 (file)
@@ -863,7 +863,7 @@ static int orinoco_ioctl_set_encodeext(struct net_device *dev,
                        err = __orinoco_hw_set_tkip_key(priv, idx,
                                 ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY,
                                 (u8 *) &priv->tkip_key[idx],
-                                tkip_iv, NULL);
+                                tkip_iv, ORINOCO_SEQ_LEN, NULL, 0);
                        if (err)
                                printk(KERN_ERR "%s: Error %d setting TKIP key"
                                       "\n", dev->name, err);