diff options
author | Daniel C Halperin <daniel.c.halperin@intel.com> | 2009-08-13 16:31:01 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-08-20 11:33:13 -0400 |
commit | 396887a2b2ad1ef5e5526fec34dec582baf39b81 (patch) | |
tree | 5730d04dedb1cbd97ececce93c039b642d8abaa1 /drivers/net/wireless/iwlwifi/iwl-3945.c | |
parent | 15993e08ac027b64b6f3400d32754966b4cac7b0 (diff) |
iwlwifi: fix erroneous use of iwl_rx_packet.len as a length
The field called 'len' in struct iwl_rx_packet is in fact not just a length
field but also includes some flags from the flow handler. In several places
throughout the driver, this causes incorrect values to be interpreted as
lengths when the field is improperly masked.
In most situations the improper use is for debugging output, and simply results
in an erroneous message, such as:
[551933.070224] ieee80211 phy0: I iwl_rx_statistics Statistics notification received (480 vs -1367342620).
which should read '(480 vs 484)'.
In at least one case this could case bad things to happen:
void iwl_rx_pm_debug_statistics_notif(struct iwl_priv *priv,
struct iwl_rx_mem_buffer *rxb)
{
struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
IWL_DEBUG_RADIO(priv, "Dumping %d bytes of unhandled "
"notification for %s:\n",
le32_to_cpu(pkt->len), get_cmd_string(pkt->hdr.cmd));
iwl_print_hex_dump(priv, IWL_DL_RADIO, pkt->u.raw, le32_to_cpu(pkt->len)
);
}
EXPORT_SYMBOL(iwl_rx_pm_debug_statistics_notif);
Given the rampant misuse of this field without proper masking throughout the
driver (every use but one), this patch renames the field from 'len' to
'len_n_flags' to reduce confusion. It also adds the proper masking when
this field is used as a length value.
Signed-off-by: Daniel C Halperin <daniel.c.halperin@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-3945.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index b5a4d2ecdd2d..e9a685d8e3a1 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -349,12 +349,13 @@ static void iwl3945_rx_reply_tx(struct iwl_priv *priv, | |||
349 | * | 349 | * |
350 | *****************************************************************************/ | 350 | *****************************************************************************/ |
351 | 351 | ||
352 | void iwl3945_hw_rx_statistics(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) | 352 | void iwl3945_hw_rx_statistics(struct iwl_priv *priv, |
353 | struct iwl_rx_mem_buffer *rxb) | ||
353 | { | 354 | { |
354 | struct iwl_rx_packet *pkt = (void *)rxb->skb->data; | 355 | struct iwl_rx_packet *pkt = (void *)rxb->skb->data; |
355 | IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n", | 356 | IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n", |
356 | (int)sizeof(struct iwl3945_notif_statistics), | 357 | (int)sizeof(struct iwl3945_notif_statistics), |
357 | le32_to_cpu(pkt->len)); | 358 | le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK); |
358 | 359 | ||
359 | memcpy(&priv->statistics_39, pkt->u.raw, sizeof(priv->statistics_39)); | 360 | memcpy(&priv->statistics_39, pkt->u.raw, sizeof(priv->statistics_39)); |
360 | 361 | ||