aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Cahill <ben.m.cahill@intel.com>2009-11-06 17:52:57 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-11-11 15:23:45 -0500
commit84c4069232a671b3739387949d5cb588dacbd24a (patch)
tree47f0bf17d5ea2e1386b26915b348fc0e1f806e3c
parent6762f07fd55ff5e588aa5f0a1b70efe8e268a2e8 (diff)
iwlwifi: Limit size of Event Log dump
If device provides bad values for Event Log parameters (due to being asleep or SRAM corruption, etc.), the size can be very, very large (e.g. 0xa5a5a5a5), which can flood system log. Sanity-check capacity and next_entry values and limit to reasonable size dump. Signed-off-by: Ben Cahill <ben.m.cahill@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c15
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c15
2 files changed, 30 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index ad8a348b1c81..9c40742727a2 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -1702,6 +1702,9 @@ static void iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
1702 } 1702 }
1703} 1703}
1704 1704
1705/* For sanity check only. Actual size is determined by uCode, typ. 512 */
1706#define MAX_EVENT_LOG_SIZE (512)
1707
1705void iwl_dump_nic_event_log(struct iwl_priv *priv) 1708void iwl_dump_nic_event_log(struct iwl_priv *priv)
1706{ 1709{
1707 u32 base; /* SRAM byte address of event log header */ 1710 u32 base; /* SRAM byte address of event log header */
@@ -1727,6 +1730,18 @@ void iwl_dump_nic_event_log(struct iwl_priv *priv)
1727 num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32))); 1730 num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32)));
1728 next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32))); 1731 next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32)));
1729 1732
1733 if (capacity > MAX_EVENT_LOG_SIZE) {
1734 IWL_ERR(priv, "Log capacity %d is bogus, limit to %d entries\n",
1735 capacity, MAX_EVENT_LOG_SIZE);
1736 capacity = MAX_EVENT_LOG_SIZE;
1737 }
1738
1739 if (next_entry > MAX_EVENT_LOG_SIZE) {
1740 IWL_ERR(priv, "Log write index %d is bogus, limit to %d\n",
1741 next_entry, MAX_EVENT_LOG_SIZE);
1742 next_entry = MAX_EVENT_LOG_SIZE;
1743 }
1744
1730 size = num_wraps ? capacity : next_entry; 1745 size = num_wraps ? capacity : next_entry;
1731 1746
1732 /* bail out if nothing in log */ 1747 /* bail out if nothing in log */
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 23b31e6dcacd..a17afe01c0c0 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -1603,6 +1603,9 @@ static void iwl3945_print_event_log(struct iwl_priv *priv, u32 start_idx,
1603 } 1603 }
1604} 1604}
1605 1605
1606/* For sanity check only. Actual size is determined by uCode, typ. 512 */
1607#define IWL3945_MAX_EVENT_LOG_SIZE (512)
1608
1606void iwl3945_dump_nic_event_log(struct iwl_priv *priv) 1609void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
1607{ 1610{
1608 u32 base; /* SRAM byte address of event log header */ 1611 u32 base; /* SRAM byte address of event log header */
@@ -1624,6 +1627,18 @@ void iwl3945_dump_nic_event_log(struct iwl_priv *priv)
1624 num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32))); 1627 num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32)));
1625 next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32))); 1628 next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32)));
1626 1629
1630 if (capacity > IWL3945_MAX_EVENT_LOG_SIZE) {
1631 IWL_ERR(priv, "Log capacity %d is bogus, limit to %d entries\n",
1632 capacity, IWL3945_MAX_EVENT_LOG_SIZE);
1633 capacity = IWL3945_MAX_EVENT_LOG_SIZE;
1634 }
1635
1636 if (next_entry > IWL3945_MAX_EVENT_LOG_SIZE) {
1637 IWL_ERR(priv, "Log write index %d is bogus, limit to %d\n",
1638 next_entry, IWL3945_MAX_EVENT_LOG_SIZE);
1639 next_entry = IWL3945_MAX_EVENT_LOG_SIZE;
1640 }
1641
1627 size = num_wraps ? capacity : next_entry; 1642 size = num_wraps ? capacity : next_entry;
1628 1643
1629 /* bail out if nothing in log */ 1644 /* bail out if nothing in log */