| From 2ad59bd090efd05e0ff7f08602a241cea3aa284d Mon Sep 17 00:00:00 2001 |
| From: Johannes Berg <johannes.berg@intel.com> |
| Date: Mon, 23 Sep 2019 13:51:16 +0200 |
| Subject: [PATCH] cfg80211: initialize on-stack chandefs |
| |
| commit f43e5210c739fe76a4b0ed851559d6902f20ceb1 upstream. |
| |
| In a few places we don't properly initialize on-stack chandefs, |
| resulting in EDMG data to be non-zero, which broke things. |
| |
| Additionally, in a few places we rely on the driver to init the |
| data completely, but perhaps we shouldn't as non-EDMG drivers |
| may not initialize the EDMG data, also initialize it there. |
| |
| Cc: stable@vger.kernel.org |
| Fixes: 2a38075cd0be ("nl80211: Add support for EDMG channels") |
| Reported-by: Dmitry Osipenko <digetx@gmail.com> |
| Tested-by: Dmitry Osipenko <digetx@gmail.com> |
| Link: https://lore.kernel.org/r/1569239475-I2dcce394ecf873376c386a78f31c2ec8b538fa25@changeid |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
| index 73891b7c2f8b..77d3141c8ed8 100644 |
| --- a/net/wireless/nl80211.c |
| +++ b/net/wireless/nl80211.c |
| @@ -2594,6 +2594,8 @@ int nl80211_parse_chandef(struct cfg80211_registered_device *rdev, |
| |
| control_freq = nla_get_u32(attrs[NL80211_ATTR_WIPHY_FREQ]); |
| |
| + memset(chandef, 0, sizeof(*chandef)); |
| + |
| chandef->chan = ieee80211_get_channel(&rdev->wiphy, control_freq); |
| chandef->width = NL80211_CHAN_WIDTH_20_NOHT; |
| chandef->center_freq1 = control_freq; |
| @@ -3122,7 +3124,7 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag |
| |
| if (rdev->ops->get_channel) { |
| int ret; |
| - struct cfg80211_chan_def chandef; |
| + struct cfg80211_chan_def chandef = {}; |
| |
| ret = rdev_get_channel(rdev, wdev, &chandef); |
| if (ret == 0) { |
| diff --git a/net/wireless/reg.c b/net/wireless/reg.c |
| index 327479ce69f5..36eba5804efe 100644 |
| --- a/net/wireless/reg.c |
| +++ b/net/wireless/reg.c |
| @@ -2108,7 +2108,7 @@ static void reg_call_notifier(struct wiphy *wiphy, |
| |
| static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev) |
| { |
| - struct cfg80211_chan_def chandef; |
| + struct cfg80211_chan_def chandef = {}; |
| struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); |
| enum nl80211_iftype iftype; |
| |
| diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c |
| index 46e4d69db845..b1f94730bde2 100644 |
| --- a/net/wireless/wext-compat.c |
| +++ b/net/wireless/wext-compat.c |
| @@ -797,7 +797,7 @@ static int cfg80211_wext_giwfreq(struct net_device *dev, |
| { |
| struct wireless_dev *wdev = dev->ieee80211_ptr; |
| struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); |
| - struct cfg80211_chan_def chandef; |
| + struct cfg80211_chan_def chandef = {}; |
| int ret; |
| |
| switch (wdev->iftype) { |
| -- |
| 2.7.4 |
| |