diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2012-01-07 21:46:40 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-01-24 14:08:37 -0500 |
commit | 76a92be537f1c8c259e393632301446257ca3ea9 (patch) | |
tree | 2b5e5b43f0eb4e16ac32b07254cb26383a0a0d35 /drivers | |
parent | 39d02a7d90602d4557ee05db2a157a4e0ec3a3d3 (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.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192de/fw.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/usb.c | 12 |
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 | } |