[PATCH 14/44] 802.11 Factor out authentication code for reuse with FT-over-DS
Jouni Malinen
j at w1.fi
Sun Feb 28 07:45:22 PST 2016
On Wed, Feb 24, 2016 at 12:53:20PM +0100, michael-dev at fami-braun.de wrote:
> diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c
> +int handle_auth_cfg_sta(struct hostapd_data *hapd, struct sta_info *sta,
> + int res, struct hostapd_allowed_address_info *info,
> + u16 *resp)
> + hostapd_free_psk_list(sta->psk);
> + if (hapd->conf->wpa_psk_radius != PSK_RADIUS_IGNORED) {
> + sta->psk = info->psk;
> + info->psk = NULL;
> + } else {
> + sta->psk = NULL;
> + }
Wouldn't this be able to leave out info->psk allocated and then return
0?
> + sta->identity = info->identity;
> + info->identity = NULL;
> + sta->radius_cui = info->radius_cui;
> + info->radius_cui = NULL;
These free the other allocated items within struct
hostapd_allowed_address_info, but this is done without calling
hostapd_allowed_address_free() which can make it more likely for this
detail to be missed if new fields are added in the future.
> + return 0;
So this is handle_auth_cfg_sta() returning 0 with info->psk potentially
left allocated.
> static void handle_auth(struct hostapd_data *hapd,
> const struct ieee80211_mgmt *mgmt, size_t len)
> {
> @@ -1068,9 +1129,8 @@ static void handle_auth(struct hostapd_data *hapd,
> res = hostapd_allowed_address(hapd, mgmt->sa, (u8 *) mgmt, len,
> - &session_timeout,
> - &acct_interim_interval, &vlan_id,
> - &psk, &identity, &radius_cui);
> + &handle_auth_restart_cb,
> + &details);
This allocates the details.* based on response.
> @@ -1085,6 +1145,7 @@ static void handle_auth(struct hostapd_data *hapd,
> + hostapd_allowed_address_free(&details);
> return;
And many code paths within handle_auth() were modified to call
hostapd_allowed_address_free() before returning.
> @@ -1138,47 +1202,12 @@ static void handle_auth(struct hostapd_data *hapd,
> + if (handle_auth_cfg_sta(hapd, sta, res, &details, &resp) < 0)
> goto fail;
But after this, only the "goto fail" cases end up calling
hostapd_allowed_address_free().
Is this correct?
> @@ -1288,9 +1317,7 @@ static void handle_auth(struct hostapd_data *hapd,
> fail:
> - os_free(identity);
> - os_free(radius_cui);
> - hostapd_free_psk_list(psk);
> + hostapd_allowed_address_free(&details);
So there is the hostapd_allowed_address_free() for some of the error
cases and the success path. However, there are at least two return
statements above in WLAN_AUTH_FT and WLAN_AUTH_SAE cases of
switch (auth_alg). Do those free memory in all cases? Even if they do,
it looks a bit strange to see paths that do not have
hostapd_allowed_address_free() being called.
--
Jouni Malinen PGP id EFC895FA
More information about the Hostap
mailing list