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:
Jouni Malinen 2011-02-10 22:12:29 +02:00 committed by Jouni Malinen
parent 810f08bab4
commit e3e52e364e
3 changed files with 19 additions and 4 deletions

View file

@ -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;

View file

@ -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;
}

View file

@ -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 */