Simplify 'cfg80211_mlme_register_mgmt()' to allocate an instance of 'struct cfg80211_mgmt_registration' only if the latter is really needed (i.e. when the list of registrations should be updated) and prefer 'kmalloc()' over 'kzalloc()' since all of the members are explicitly initialized. Fixes: 9dba48a6ece7 ("cfg80211: support multicast RX registration") Signed-off-by: Dmitry Antipov <dmantipov@xxxxxxxxx> --- net/wireless/mlme.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index 4790136758d5..c7d913c76966 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c @@ -639,7 +639,7 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid, struct netlink_ext_ack *extack) { struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); - struct cfg80211_mgmt_registration *reg, *nreg; + struct cfg80211_mgmt_registration *reg; int err = 0; u16 mgmt_type; bool update_multicast = false; @@ -680,10 +680,6 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid, return -EINVAL; } - nreg = kzalloc(sizeof(*reg) + match_len, GFP_KERNEL); - if (!nreg) - return -ENOMEM; - spin_lock_bh(&rdev->mgmt_registrations_lock); list_for_each_entry(reg, &wdev->mgmt_registrations, list) { @@ -707,9 +703,14 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid, if (err) goto out; - if (update_multicast) { - kfree(nreg); - } else { + if (!update_multicast) { + struct cfg80211_mgmt_registration *nreg = + kmalloc(sizeof(*reg) + match_len, GFP_KERNEL); + + if (!nreg) { + err = -ENOMEM; + goto out; + } nreg->match_len = match_len; memcpy(nreg->match, match_data, match_len); nreg->nlportid = snd_portid; @@ -726,7 +727,6 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid, return 0; out: - kfree(nreg); spin_unlock_bh(&rdev->mgmt_registrations_lock); return err; -- 2.47.1