diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 4f8e14ebf..b1f334450 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -1951,7 +1951,12 @@ static void wpas_p2p_clone_config(struct wpa_supplicant *dst, d = dst->conf; s = src->conf; -#define C(n) if (s->n) d->n = os_strdup(s->n) +#define C(n) \ +do { \ + if (s->n && !d->n) \ + d->n = os_strdup(s->n); \ +} while (0) + C(device_name); C(manufacturer); C(model_name); @@ -1979,7 +1984,10 @@ static void wpas_p2p_clone_config(struct wpa_supplicant *dst, d->disable_scan_offload = s->disable_scan_offload; d->passive_scan = s->passive_scan; - if (s->wps_nfc_dh_privkey && s->wps_nfc_dh_pubkey) { + if (s->wps_nfc_dh_privkey && s->wps_nfc_dh_pubkey && + !d->wps_nfc_pw_from_config) { + wpabuf_free(d->wps_nfc_dh_privkey); + wpabuf_free(d->wps_nfc_dh_pubkey); d->wps_nfc_dh_privkey = wpabuf_dup(s->wps_nfc_dh_privkey); d->wps_nfc_dh_pubkey = wpabuf_dup(s->wps_nfc_dh_pubkey); } @@ -1987,23 +1995,6 @@ static void wpas_p2p_clone_config(struct wpa_supplicant *dst, } -static void wpas_p2p_clone_config_dh(struct wpa_supplicant *dst, - const struct wpa_supplicant *src) -{ - struct wpa_config *d; - const struct wpa_config *s; - - d = dst->conf; - s = src->conf; - - if (s->wps_nfc_dh_privkey && s->wps_nfc_dh_pubkey && - !d->wps_nfc_dh_privkey && !d->wps_nfc_dh_pubkey) { - d->wps_nfc_dh_privkey = wpabuf_dup(s->wps_nfc_dh_privkey); - d->wps_nfc_dh_pubkey = wpabuf_dup(s->wps_nfc_dh_pubkey); - } -} - - static void wpas_p2p_get_group_ifname(struct wpa_supplicant *wpa_s, char *ifname, size_t len) { @@ -2255,7 +2246,7 @@ static void wpas_go_neg_completed(void *ctx, struct p2p_go_neg_results *res) group_wpa_s = wpa_s->parent; wpa_s->global->p2p_group_formation = group_wpa_s; if (group_wpa_s != wpa_s) - wpas_p2p_clone_config_dh(group_wpa_s, wpa_s); + wpas_p2p_clone_config(group_wpa_s, wpa_s); } group_wpa_s->p2p_in_provisioning = 1; @@ -6013,7 +6004,7 @@ wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated, "P2P: Use primary interface for group operations"); wpa_s->p2p_first_connection_timeout = 0; if (wpa_s != wpa_s->p2pdev) - wpas_p2p_clone_config_dh(wpa_s, wpa_s->p2pdev); + wpas_p2p_clone_config(wpa_s, wpa_s->p2pdev); return wpa_s; }