Commit 7834704b authored by Nishant Sarmukadam's avatar Nishant Sarmukadam Committed by John W. Linville

cfg80211: Avoid sending IWEVASSOCREQIE and IWEVASSOCRESPIE events with NULL event body

In a scenario, where a cfg80211 driver (station mode) does not send assoc request
and assoc response IEs in cfg80211_connect_result after a successful association
to an AP, cfg80211 sends IWEVASSOCREQIE and IWEVASSOCRESPIE to the user space
application with NULL data. This can cause an issue at the event recipient.

An example of this is when cfg80211 sends IWEVASSOCREQIE and IWEVASSOCRESPIE
events with NULL event body to wpa_supplicant. The wpa_supplicant overwrites
the assoc request and assoc response IEs for this station with NULL data.
If the association is WPA/WPA2, the wpa_supplicant is not able to generate
EAPOL handshake messages, since the IEs are NULL.

With the patch, req_ie and resp_ie will be NULL by avoiding the
assignment if the driver has not sent the IEs to cfg80211. The event sending
code sends the events only if resp_ie and req_ie are not NULL. This
will ensure that the events are not sent with NULL event body.
Signed-off-by: default avatarNishant Sarmukadam <nishants@marvell.com>
Reviewed-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 61c2a80b
...@@ -517,12 +517,16 @@ void cfg80211_connect_result(struct net_device *dev, const u8 *bssid, ...@@ -517,12 +517,16 @@ void cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
ev->type = EVENT_CONNECT_RESULT; ev->type = EVENT_CONNECT_RESULT;
if (bssid) if (bssid)
memcpy(ev->cr.bssid, bssid, ETH_ALEN); memcpy(ev->cr.bssid, bssid, ETH_ALEN);
if (req_ie_len) {
ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev); ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev);
ev->cr.req_ie_len = req_ie_len; ev->cr.req_ie_len = req_ie_len;
memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len); memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len);
}
if (resp_ie_len) {
ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len; ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len;
ev->cr.resp_ie_len = resp_ie_len; ev->cr.resp_ie_len = resp_ie_len;
memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len); memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len);
}
ev->cr.status = status; ev->cr.status = status;
spin_lock_irqsave(&wdev->event_lock, flags); spin_lock_irqsave(&wdev->event_lock, flags);
......
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