hostapd: Fix RADIUS client configuration update on reconfig
The internal pointer to RADIUS client configuration needs to be updated whenever a new hostapd configuration is loaded. Without this, freed memory may be dereferenced and this can result in segmentation faults.
This commit is contained in:
parent
810f08bab4
commit
e3e52e364e
3 changed files with 19 additions and 4 deletions
|
@ -46,6 +46,10 @@ extern int wpa_debug_level;
|
||||||
|
|
||||||
static void hostapd_reload_bss(struct hostapd_data *hapd)
|
static void hostapd_reload_bss(struct hostapd_data *hapd)
|
||||||
{
|
{
|
||||||
|
#ifndef CONFIG_NO_RADIUS
|
||||||
|
radius_client_reconfig(hapd->radius, hapd->conf->radius);
|
||||||
|
#endif /* CONFIG_NO_RADIUS */
|
||||||
|
|
||||||
if (hostapd_setup_wpa_psk(hapd->conf)) {
|
if (hostapd_setup_wpa_psk(hapd->conf)) {
|
||||||
wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK "
|
wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK "
|
||||||
"after reloading configuration");
|
"after reloading configuration");
|
||||||
|
@ -103,14 +107,15 @@ int hostapd_reload_config(struct hostapd_iface *iface)
|
||||||
* Deauthenticate all stations since the new configuration may not
|
* Deauthenticate all stations since the new configuration may not
|
||||||
* allow them to use the BSS anymore.
|
* allow them to use the BSS anymore.
|
||||||
*/
|
*/
|
||||||
for (j = 0; j < iface->num_bss; j++)
|
for (j = 0; j < iface->num_bss; j++) {
|
||||||
hostapd_flush_old_stations(iface->bss[j]);
|
hostapd_flush_old_stations(iface->bss[j]);
|
||||||
|
|
||||||
#ifndef CONFIG_NO_RADIUS
|
#ifndef CONFIG_NO_RADIUS
|
||||||
/* TODO: update dynamic data based on changed configuration
|
/* TODO: update dynamic data based on changed configuration
|
||||||
* items (e.g., open/close sockets, etc.) */
|
* items (e.g., open/close sockets, etc.) */
|
||||||
radius_client_flush(hapd->radius, 0);
|
radius_client_flush(iface->bss[j]->radius, 0);
|
||||||
#endif /* CONFIG_NO_RADIUS */
|
#endif /* CONFIG_NO_RADIUS */
|
||||||
|
}
|
||||||
|
|
||||||
oldconf = hapd->iconf;
|
oldconf = hapd->iconf;
|
||||||
iface->conf = newconf;
|
iface->conf = newconf;
|
||||||
|
|
|
@ -1489,3 +1489,11 @@ int radius_client_get_mib(struct radius_client_data *radius, char *buf,
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void radius_client_reconfig(struct radius_client_data *radius,
|
||||||
|
struct hostapd_radius_servers *conf)
|
||||||
|
{
|
||||||
|
if (radius)
|
||||||
|
radius->conf = conf;
|
||||||
|
}
|
||||||
|
|
|
@ -259,5 +259,7 @@ void radius_client_flush_auth(struct radius_client_data *radius,
|
||||||
const u8 *addr);
|
const u8 *addr);
|
||||||
int radius_client_get_mib(struct radius_client_data *radius, char *buf,
|
int radius_client_get_mib(struct radius_client_data *radius, char *buf,
|
||||||
size_t buflen);
|
size_t buflen);
|
||||||
|
void radius_client_reconfig(struct radius_client_data *radius,
|
||||||
|
struct hostapd_radius_servers *conf);
|
||||||
|
|
||||||
#endif /* RADIUS_CLIENT_H */
|
#endif /* RADIUS_CLIENT_H */
|
||||||
|
|
Loading…
Reference in a new issue