aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2012-01-07 21:46:40 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-01-24 14:08:37 -0500
commit76a92be537f1c8c259e393632301446257ca3ea9 (patch)
tree2b5e5b43f0eb4e16ac32b07254cb26383a0a0d35 /drivers
parent39d02a7d90602d4557ee05db2a157a4e0ec3a3d3 (diff)
rtlwifi: rtl8192c_common: rtl8192de: Check for allocation failures
In https://bugzilla.redhat.com/show_bug.cgi?id=771656, a kernel bug was triggered due to a failed skb allocation that was not checked. This event lead to an audit of all memory allocations in the complete rtlwifi family of drivers. This patch fixes the rest. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: Stable <stable@vger.kernel.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/fw.c14
-rw-r--r--drivers/net/wireless/rtlwifi/usb.c12
4 files changed, 20 insertions, 10 deletions
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index 3c4ae5d9de4f..8758b3db0723 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -652,6 +652,8 @@ static void _rtl_receive_one(struct ieee80211_hw *hw, struct sk_buff *skb,
652 return; 652 return;
653 653
654 uskb = dev_alloc_skb(skb->len + 128); 654 uskb = dev_alloc_skb(skb->len + 128);
655 if (!uskb)
656 return; /* exit if allocation failed */
655 memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, sizeof(rx_status)); 657 memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, sizeof(rx_status));
656 pdata = (u8 *)skb_put(uskb, skb->len); 658 pdata = (u8 *)skb_put(uskb, skb->len);
657 memcpy(pdata, skb->data, skb->len); 659 memcpy(pdata, skb->data, skb->len);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
index 1eae3baae518..e9e9c26d4963 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
@@ -785,6 +785,8 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
785 785
786 786
787 skb = dev_alloc_skb(totalpacketlen); 787 skb = dev_alloc_skb(totalpacketlen);
788 if (!skb)
789 return;
788 memcpy((u8 *) skb_put(skb, totalpacketlen), 790 memcpy((u8 *) skb_put(skb, totalpacketlen),
789 &reserved_page_packet, totalpacketlen); 791 &reserved_page_packet, totalpacketlen);
790 792
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/fw.c b/drivers/net/wireless/rtlwifi/rtl8192de/fw.c
index 94f5b7dd06ed..da58ca4966cc 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/fw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/fw.c
@@ -756,12 +756,16 @@ void rtl92d_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
756 "rtl92d_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL", 756 "rtl92d_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL",
757 u1RsvdPageLoc, 3); 757 u1RsvdPageLoc, 3);
758 skb = dev_alloc_skb(totalpacketlen); 758 skb = dev_alloc_skb(totalpacketlen);
759 memcpy((u8 *) skb_put(skb, totalpacketlen), &reserved_page_packet, 759 if (!skb) {
760 totalpacketlen); 760 dlok = false;
761 rtstatus = _rtl92d_cmd_send_packet(hw, skb); 761 } else {
762 memcpy((u8 *) skb_put(skb, totalpacketlen),
763 &reserved_page_packet, totalpacketlen);
764 rtstatus = _rtl92d_cmd_send_packet(hw, skb);
762 765
763 if (rtstatus) 766 if (rtstatus)
764 dlok = true; 767 dlok = true;
768 }
765 if (dlok) { 769 if (dlok) {
766 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 770 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
767 "Set RSVD page location to Fw\n"); 771 "Set RSVD page location to Fw\n");
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index 6ae1b212ad99..4db06f6f9084 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -520,12 +520,14 @@ static void _rtl_usb_rx_process_noagg(struct ieee80211_hw *hw,
520 u8 *pdata; 520 u8 *pdata;
521 521
522 uskb = dev_alloc_skb(skb->len + 128); 522 uskb = dev_alloc_skb(skb->len + 128);
523 memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, 523 if (uskb) { /* drop packet on allocation failure */
524 sizeof(rx_status)); 524 memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status,
525 pdata = (u8 *)skb_put(uskb, skb->len); 525 sizeof(rx_status));
526 memcpy(pdata, skb->data, skb->len); 526 pdata = (u8 *)skb_put(uskb, skb->len);
527 memcpy(pdata, skb->data, skb->len);
528 ieee80211_rx_irqsafe(hw, uskb);
529 }
527 dev_kfree_skb_any(skb); 530 dev_kfree_skb_any(skb);
528 ieee80211_rx_irqsafe(hw, uskb);
529 } else { 531 } else {
530 dev_kfree_skb_any(skb); 532 dev_kfree_skb_any(skb);
531 } 533 }