Browse Source

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.
Jouni Malinen 14 years ago
parent
commit
e3e52e364e
3 changed files with 19 additions and 4 deletions
  1. 9 4
      src/ap/hostapd.c
  2. 8 0
      src/radius/radius_client.c
  3. 2 0
      src/radius/radius_client.h

+ 9 - 4
src/ap/hostapd.c

@@ -46,6 +46,10 @@ extern int wpa_debug_level;
 
 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)) {
 		wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK "
 			   "after reloading configuration");
@@ -103,14 +107,15 @@ int hostapd_reload_config(struct hostapd_iface *iface)
 	 * Deauthenticate all stations since the new configuration may not
 	 * 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]);
 
 #ifndef CONFIG_NO_RADIUS
-	/* TODO: update dynamic data based on changed configuration
-	 * items (e.g., open/close sockets, etc.) */
-	radius_client_flush(hapd->radius, 0);
+		/* TODO: update dynamic data based on changed configuration
+		 * items (e.g., open/close sockets, etc.) */
+		radius_client_flush(iface->bss[j]->radius, 0);
 #endif /* CONFIG_NO_RADIUS */
+	}
 
 	oldconf = hapd->iconf;
 	iface->conf = newconf;

+ 8 - 0
src/radius/radius_client.c

@@ -1489,3 +1489,11 @@ int radius_client_get_mib(struct radius_client_data *radius, char *buf,
 
 	return count;
 }
+
+
+void radius_client_reconfig(struct radius_client_data *radius,
+			    struct hostapd_radius_servers *conf)
+{
+	if (radius)
+		radius->conf = conf;
+}

+ 2 - 0
src/radius/radius_client.h

@@ -259,5 +259,7 @@ void radius_client_flush_auth(struct radius_client_data *radius,
 			      const u8 *addr);
 int radius_client_get_mib(struct radius_client_data *radius, char *buf,
 			  size_t buflen);
+void radius_client_reconfig(struct radius_client_data *radius,
+			    struct hostapd_radius_servers *conf);
 
 #endif /* RADIUS_CLIENT_H */