Commit 7c629401 authored by Luis Felipe Dominguez Vega's avatar Luis Felipe Dominguez Vega Committed by Kalle Valo

rtlwifi: Fix NULL dereference when PCI driver used as an AP

In commit 33511b15 ("rtlwifi: add support to
send beacon frame"), the mechanism for sending beacons was established. That
patch works correctly for rtl8192cu, but there is a possibility of getting
the following warnings in the PCI drivers:

WARNING: CPU: 1 PID: 2439 at net/mac80211/driver-ops.h:12
ieee80211_bss_info_change_notify+0x179/0x1d0 [mac80211]()
wlp5s0:  Failed check-sdata-in-driver check, flags: 0x0

The warning is followed by a NULL pointer dereference as follows:

BUG: unable to handle kernel NULL pointer dereference at 0000000000000006
IP: [<ffffffffc073998e>] rtl_get_tcb_desc+0x5e/0x760 [rtlwifi]

This problem was reported at http://thread.gmane.org/gmane.linux.kernel.wireless.general/138645,
but no solution was found at that time.

The problem was also reported at https://bugzilla.kernel.org/show_bug.cgi?id=9744
and this solution was developed and tested there.

The USB driver works with a NULL final argument in the adapter_tx() callback;
however, the PCI drivers need a struct rtl_tcb_desc in that position.

Fixes: 33511b15 ("rtlwifi: add support to send beacon frame.")
Signed-off-by: default avatarLuis Felipe Dominguez Vega <lfdominguez@nauta.cu>
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Cc: Stable <stable@vger.kernel.org> [3.19+]
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 098697db
...@@ -1015,9 +1015,12 @@ static void send_beacon_frame(struct ieee80211_hw *hw, ...@@ -1015,9 +1015,12 @@ static void send_beacon_frame(struct ieee80211_hw *hw,
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct sk_buff *skb = ieee80211_beacon_get(hw, vif); struct sk_buff *skb = ieee80211_beacon_get(hw, vif);
struct rtl_tcb_desc tcb_desc;
if (skb) if (skb) {
rtlpriv->intf_ops->adapter_tx(hw, NULL, skb, NULL); memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
rtlpriv->intf_ops->adapter_tx(hw, NULL, skb, &tcb_desc);
}
} }
static void rtl_op_bss_info_changed(struct ieee80211_hw *hw, static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment