iwlwifi: mvm: rs: fix a theoretical out of bounds access
authorEyal Shapira <eyal@wizery.com>
Sun, 5 Jan 2014 19:04:19 +0000 (21:04 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 13 Jan 2014 20:17:16 +0000 (22:17 +0200)
Discovered by klocwork

Array 'iwl_rate_mcs' of size 15 may use index value(s) -1
  * rs.c:2562: index = iwl_hwrate_to_plcp_idx(rate)
    * rs.c:2562: Result of function call 'iwl_hwrate_to_plcp_idx(rate)' is '[-1,14]'
  * rs.c:2565: Array 'iwl_rate_mcs' size is 15.
  * rs.c:2565: Possible attempt to access element -1 of array 'iwl_rate_mcs'.

While at it stop using index = -1 and always use IWL_RATE_INVALID

Signed-off-by: Eyal Shapira <eyalx.shapira@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/rs.c

index 54887b952eb5cd411893a70743032a6c6d189ac7..c4f214d4c44ebc668e97ec03d49d87e1bd0f0447 100644 (file)
@@ -357,7 +357,7 @@ static int iwl_hwrate_to_plcp_idx(u32 rate_n_flags)
                                return idx;
        }
 
-       return -1;
+       return IWL_RATE_INVALID;
 }
 
 static void rs_rate_scale_perform(struct iwl_mvm *mvm,
@@ -703,10 +703,8 @@ static int rs_rate_from_ucode_rate(const u32 ucode_rate,
        memset(rate, 0, sizeof(*rate));
        rate->index = iwl_hwrate_to_plcp_idx(ucode_rate);
 
-       if (rate->index == IWL_RATE_INVALID) {
-               rate->index = -1;
+       if (rate->index == IWL_RATE_INVALID)
                return -EINVAL;
-       }
 
        rate->ant = (ant_msk >> RATE_MCS_ANT_POS);
 
@@ -2562,7 +2560,9 @@ static int rs_pretty_print_rate(char *buf, const u32 rate)
                int index = iwl_hwrate_to_plcp_idx(rate);
 
                return sprintf(buf, "Legacy | ANT: %s Rate: %s Mbps\n",
-                              rs_pretty_ant(ant), iwl_rate_mcs[index].mbps);
+                              rs_pretty_ant(ant),
+                              index == IWL_RATE_INVALID ? "BAD" :
+                              iwl_rate_mcs[index].mbps);
        }
 
        if (rate & RATE_MCS_VHT_MSK) {