ACS: Fix memory leak if interface is disabled during scan

The survey data was not freed if hostapd interface got disabled during
an ACS scan.

Signed-off-by: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2017-03-04 13:48:29 +02:00
parent 31b398e05f
commit 4c803dfcd7
3 changed files with 10 additions and 1 deletions

View File

@ -260,7 +260,7 @@ static void acs_clean_chan_surveys(struct hostapd_channel_data *chan)
} }
static void acs_cleanup(struct hostapd_iface *iface) void acs_cleanup(struct hostapd_iface *iface)
{ {
int i; int i;
struct hostapd_channel_data *chan; struct hostapd_channel_data *chan;

View File

@ -13,6 +13,7 @@
#ifdef CONFIG_ACS #ifdef CONFIG_ACS
enum hostapd_chan_status acs_init(struct hostapd_iface *iface); enum hostapd_chan_status acs_init(struct hostapd_iface *iface);
void acs_cleanup(struct hostapd_iface *iface);
#else /* CONFIG_ACS */ #else /* CONFIG_ACS */
@ -22,6 +23,10 @@ static inline enum hostapd_chan_status acs_init(struct hostapd_iface *iface)
return HOSTAPD_CHAN_INVALID; return HOSTAPD_CHAN_INVALID;
} }
static inline void acs_cleanup(struct hostapd_iface *iface)
{
}
#endif /* CONFIG_ACS */ #endif /* CONFIG_ACS */
#endif /* ACS_H */ #endif /* ACS_H */

View File

@ -46,6 +46,7 @@
#include "neighbor_db.h" #include "neighbor_db.h"
#include "rrm.h" #include "rrm.h"
#include "fils_hlp.h" #include "fils_hlp.h"
#include "acs.h"
static int hostapd_flush_old_stations(struct hostapd_data *hapd, u16 reason); static int hostapd_flush_old_stations(struct hostapd_data *hapd, u16 reason);
@ -394,8 +395,11 @@ static void hostapd_cleanup_iface_partial(struct hostapd_iface *iface)
hostapd_stop_setup_timers(iface); hostapd_stop_setup_timers(iface);
#endif /* NEED_AP_MLME */ #endif /* NEED_AP_MLME */
#endif /* CONFIG_IEEE80211N */ #endif /* CONFIG_IEEE80211N */
if (iface->current_mode)
acs_cleanup(iface);
hostapd_free_hw_features(iface->hw_features, iface->num_hw_features); hostapd_free_hw_features(iface->hw_features, iface->num_hw_features);
iface->hw_features = NULL; iface->hw_features = NULL;
iface->current_mode = NULL;
os_free(iface->current_rates); os_free(iface->current_rates);
iface->current_rates = NULL; iface->current_rates = NULL;
os_free(iface->basic_rates); os_free(iface->basic_rates);