AP MLD: Fix RADIUS deinit
The singleton RADIUS client design did not address the deinit path
properly. Since hapd->radius could be shared with another links, the
pointer on all those other links needs to be cleared before freeing the
RADIUS client context. Without this, deinit path could have ended trying
to use freed memory when clearing STA entries from other links and
trying to flush any pending RADIUS client messages.
Fixes: a213fee11d
("AP: MLO: Make IEEE 802.1X SM, authserv, and RADIUS client singletons")
Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
fa79e46c78
commit
b91572b308
1 changed files with 18 additions and 0 deletions
|
@ -496,6 +496,24 @@ void hostapd_free_hapd_data(struct hostapd_data *hapd)
|
||||||
hostapd_acl_deinit(hapd);
|
hostapd_acl_deinit(hapd);
|
||||||
#ifndef CONFIG_NO_RADIUS
|
#ifndef CONFIG_NO_RADIUS
|
||||||
if (!hapd->mld_first_bss) {
|
if (!hapd->mld_first_bss) {
|
||||||
|
struct hapd_interfaces *ifaces = hapd->iface->interfaces;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < ifaces->count; i++) {
|
||||||
|
struct hostapd_iface *iface = ifaces->iface[i];
|
||||||
|
size_t j;
|
||||||
|
|
||||||
|
for (j = 0; iface && j < iface->num_bss; j++) {
|
||||||
|
struct hostapd_data *h = iface->bss[j];
|
||||||
|
|
||||||
|
if (hapd == h)
|
||||||
|
continue;
|
||||||
|
if (h->radius == hapd->radius)
|
||||||
|
h->radius = NULL;
|
||||||
|
if (h->radius_das == hapd->radius_das)
|
||||||
|
h->radius_das = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
radius_client_deinit(hapd->radius);
|
radius_client_deinit(hapd->radius);
|
||||||
radius_das_deinit(hapd->radius_das);
|
radius_das_deinit(hapd->radius_das);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue