]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Jan 2017 10:42:43 +0000 (11:42 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Jan 2017 10:42:43 +0000 (11:42 +0100)
added patches:
nl80211-fix-sched-scan-netlink-socket-owner-destruction.patch

queue-4.4/nl80211-fix-sched-scan-netlink-socket-owner-destruction.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/nl80211-fix-sched-scan-netlink-socket-owner-destruction.patch b/queue-4.4/nl80211-fix-sched-scan-netlink-socket-owner-destruction.patch
new file mode 100644 (file)
index 0000000..e1ebc71
--- /dev/null
@@ -0,0 +1,61 @@
+From 753aacfd2e95df6a0caf23c03dc309020765bea9 Mon Sep 17 00:00:00 2001
+From: Johannes Berg <johannes.berg@intel.com>
+Date: Thu, 5 Jan 2017 10:57:14 +0100
+Subject: nl80211: fix sched scan netlink socket owner destruction
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+commit 753aacfd2e95df6a0caf23c03dc309020765bea9 upstream.
+
+A single netlink socket might own multiple interfaces *and* a
+scheduled scan request (which might belong to another interface),
+so when it goes away both may need to be destroyed.
+
+Remove the schedule_scan_stop indirection to fix this - it's only
+needed for interface destruction because of the way this works
+right now, with a single work taking care of all interfaces.
+
+Fixes: 93a1e86ce10e4 ("nl80211: Stop scheduled scan if netlink client disappears")
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/wireless/nl80211.c |   16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -13168,13 +13168,17 @@ static int nl80211_netlink_notify(struct
+       list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
+               bool schedule_destroy_work = false;
+-              bool schedule_scan_stop = false;
+               struct cfg80211_sched_scan_request *sched_scan_req =
+                       rcu_dereference(rdev->sched_scan_req);
+               if (sched_scan_req && notify->portid &&
+-                  sched_scan_req->owner_nlportid == notify->portid)
+-                      schedule_scan_stop = true;
++                  sched_scan_req->owner_nlportid == notify->portid) {
++                      sched_scan_req->owner_nlportid = 0;
++
++                      if (rdev->ops->sched_scan_stop &&
++                          rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
++                              schedule_work(&rdev->sched_scan_stop_wk);
++              }
+               list_for_each_entry_rcu(wdev, &rdev->wdev_list, list) {
+                       cfg80211_mlme_unregister_socket(wdev, notify->portid);
+@@ -13205,12 +13209,6 @@ static int nl80211_netlink_notify(struct
+                               spin_unlock(&rdev->destroy_list_lock);
+                               schedule_work(&rdev->destroy_work);
+                       }
+-              } else if (schedule_scan_stop) {
+-                      sched_scan_req->owner_nlportid = 0;
+-
+-                      if (rdev->ops->sched_scan_stop &&
+-                          rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
+-                              schedule_work(&rdev->sched_scan_stop_wk);
+               }
+       }
index 7b66c9fd899b1fa5fc4798dc054d694547fb95ec..e22f63598ad2d8e83630a3efeb44f7eefa5db498 100644 (file)
@@ -13,3 +13,4 @@ kvm-x86-add-align16-instruction-flag.patch
 kvm-x86-add-asm_safe-wrapper.patch
 kvm-x86-emulate-fxsave-and-fxrstor.patch
 kvm-x86-introduce-segmented_write_std.patch
+nl80211-fix-sched-scan-netlink-socket-owner-destruction.patch