diff --git a/hostapd/config_file.c b/hostapd/config_file.c index 3466f2851..9edbe6326 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -2325,12 +2325,11 @@ static int hostapd_config_fill(struct hostapd_config *conf, os_free(bss->ssid.wpa_passphrase); bss->ssid.wpa_passphrase = os_strdup(pos); if (bss->ssid.wpa_passphrase) { - os_free(bss->ssid.wpa_psk); - bss->ssid.wpa_psk = NULL; + hostapd_config_clear_wpa_psk(&bss->ssid.wpa_psk); bss->ssid.wpa_passphrase_set = 1; } } else if (os_strcmp(buf, "wpa_psk") == 0) { - os_free(bss->ssid.wpa_psk); + hostapd_config_clear_wpa_psk(&bss->ssid.wpa_psk); bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk)); if (bss->ssid.wpa_psk == NULL) return 1; @@ -2338,8 +2337,7 @@ static int hostapd_config_fill(struct hostapd_config *conf, pos[PMK_LEN * 2] != '\0') { wpa_printf(MSG_ERROR, "Line %d: Invalid PSK '%s'.", line, pos); - os_free(bss->ssid.wpa_psk); - bss->ssid.wpa_psk = NULL; + hostapd_config_clear_wpa_psk(&bss->ssid.wpa_psk); return 1; } bss->ssid.wpa_psk->group = 1; diff --git a/src/ap/ap_config.c b/src/ap/ap_config.c index c1861d4f7..76011dc07 100644 --- a/src/ap/ap_config.c +++ b/src/ap/ap_config.c @@ -394,20 +394,27 @@ static void hostapd_config_free_wep(struct hostapd_wep_keys *keys) } +void hostapd_config_clear_wpa_psk(struct hostapd_wpa_psk **l) +{ + struct hostapd_wpa_psk *psk, *tmp; + + for (psk = *l; psk;) { + tmp = psk; + psk = psk->next; + bin_clear_free(tmp, sizeof(*tmp)); + } + *l = NULL; +} + + void hostapd_config_free_bss(struct hostapd_bss_config *conf) { - struct hostapd_wpa_psk *psk, *prev; struct hostapd_eap_user *user, *prev_user; if (conf == NULL) return; - psk = conf->ssid.wpa_psk; - while (psk) { - prev = psk; - psk = psk->next; - bin_clear_free(prev, sizeof(*prev)); - } + hostapd_config_clear_wpa_psk(&conf->ssid.wpa_psk); str_clear_free(conf->ssid.wpa_passphrase); os_free(conf->ssid.wpa_psk_file); diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index ec73771f6..961d2dd38 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -657,6 +657,7 @@ int hostapd_mac_comp_empty(const void *a); struct hostapd_config * hostapd_config_defaults(void); void hostapd_config_defaults_bss(struct hostapd_bss_config *bss); void hostapd_config_free_eap_user(struct hostapd_eap_user *user); +void hostapd_config_clear_wpa_psk(struct hostapd_wpa_psk **p); void hostapd_config_free_bss(struct hostapd_bss_config *conf); void hostapd_config_free(struct hostapd_config *conf); int hostapd_maclist_found(struct mac_acl_entry *list, int num_entries, diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index 61614dc3d..e641b129f 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -82,8 +82,7 @@ static void hostapd_reload_bss(struct hostapd_data *hapd) * Force PSK to be derived again since SSID or passphrase may * have changed. */ - os_free(ssid->wpa_psk); - ssid->wpa_psk = NULL; + hostapd_config_clear_wpa_psk(&hapd->conf->ssid.wpa_psk); } if (hostapd_setup_wpa_psk(hapd->conf)) { wpa_printf(MSG_ERROR, "Failed to re-configure WPA PSK " diff --git a/src/ap/wps_hostapd.c b/src/ap/wps_hostapd.c index 9ba7aba8d..b0e8b0bfc 100644 --- a/src/ap/wps_hostapd.c +++ b/src/ap/wps_hostapd.c @@ -362,10 +362,9 @@ static int hapd_wps_reconfig_in_memory(struct hostapd_data *hapd, if (bss->ssid.wpa_passphrase) os_memcpy(bss->ssid.wpa_passphrase, cred->key, cred->key_len); - os_free(bss->ssid.wpa_psk); - bss->ssid.wpa_psk = NULL; + hostapd_config_clear_wpa_psk(&bss->ssid.wpa_psk); } else if (cred->key_len == 64) { - os_free(bss->ssid.wpa_psk); + hostapd_config_clear_wpa_psk(&bss->ssid.wpa_psk); bss->ssid.wpa_psk = os_zalloc(sizeof(struct hostapd_wpa_psk)); if (bss->ssid.wpa_psk &&