| From 5caf485d6dd9e2cc911845a3ef64b9338783f19b Mon Sep 17 00:00:00 2001 |
| From: Johannes Berg <johannes.berg@intel.com> |
| Date: Wed, 30 Jul 2014 14:55:26 +0200 |
| Subject: nl80211: clear skb cb before passing to netlink |
| |
| commit bd8c78e78d5011d8111bc2533ee73b13a3bd6c42 upstream. |
| From bd8c78e78d5011d8111bc2533ee73b13a3bd6c42 Mon Sep 17 00:00:00 2001 |
| |
| In testmode and vendor command reply/event SKBs we use the |
| skb cb data to store nl80211 parameters between allocation |
| and sending. This causes the code for CONFIG_NETLINK_MMAP |
| to get confused, because it takes ownership of the skb cb |
| data when the SKB is handed off to netlink, and it doesn't |
| explicitly clear it. |
| |
| Clear the skb cb explicitly when we're done and before it |
| gets passed to netlink to avoid this issue. |
| |
| Reported-by: Assaf Azulay <assaf.azulay@intel.com> |
| Reported-by: David Spinadel <david.spinadel@intel.com> |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| [lizf: Backported to 3.4: adjust context] |
| Signed-off-by: Zefan Li <lizefan@huawei.com> |
| --- |
| net/wireless/nl80211.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/net/wireless/nl80211.c |
| +++ b/net/wireless/nl80211.c |
| @@ -5059,6 +5059,9 @@ int cfg80211_testmode_reply(struct sk_bu |
| void *hdr = ((void **)skb->cb)[1]; |
| struct nlattr *data = ((void **)skb->cb)[2]; |
| |
| + /* clear CB data for netlink core to own from now on */ |
| + memset(skb->cb, 0, sizeof(skb->cb)); |
| + |
| if (WARN_ON(!rdev->testmode_info)) { |
| kfree_skb(skb); |
| return -EINVAL; |
| @@ -5085,6 +5088,9 @@ void cfg80211_testmode_event(struct sk_b |
| void *hdr = ((void **)skb->cb)[1]; |
| struct nlattr *data = ((void **)skb->cb)[2]; |
| |
| + /* clear CB data for netlink core to own from now on */ |
| + memset(skb->cb, 0, sizeof(skb->cb)); |
| + |
| nla_nest_end(skb, data); |
| genlmsg_end(skb, hdr); |
| genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0, |