From cd571e14dda862c64202ab7bf590d14d6c0e9fb6 Mon Sep 17 00:00:00 2001 From: Max Stepanov Date: Thu, 8 Oct 2015 12:36:03 +0300 Subject: [PATCH] P2PS: Fix persistent group reporting in wpas_p2ps_prov_complete() When one peer doesn't include a persistent group info in PD Request the other peer shouldn't report a persistent group usage with this peer even if such a persistent group exists locally. This condition could be violated in the previous implementation. In case a local persistent group exists and the wpas_p2ps_prov_complete() function is called with persist_ssid parameter set to NULL, wpa_supplicant reported P2PS-PROV-DONE with persist= instead of conncap= parameter. This happened because the wpas_p2p_get_persistent() function was called without verification whether the persist_ssid was set to NULL. In this case the wpas_p2p_get_persistent() returns the first existing persistent group matching the P2P Device Address without verifying the group's SSID. After that the group ID is used as persist= parameter of P2PS-PROV-DONE event. Fix the issue by adding persist_ssid and persist_ssid_size verification as a condition for the wpas_p2p_get_persistent() call. Signed-off-by: Max Stepanov --- wpa_supplicant/p2p_supplicant.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index f7c43a9fe..fd8252ef2 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -3817,7 +3817,7 @@ static void wpas_p2ps_prov_complete(void *ctx, u8 status, const u8 *dev, { struct wpa_supplicant *wpa_s = ctx; u8 mac[ETH_ALEN]; - struct wpa_ssid *persistent_go, *stale, *s; + struct wpa_ssid *persistent_go, *stale, *s = NULL; int save_config = 0; struct wpa_supplicant *go_wpa_s; char feat_cap_str[256]; @@ -3888,8 +3888,9 @@ static void wpas_p2ps_prov_complete(void *ctx, u8 status, const u8 *dev, } /* Clean up stale persistent groups with this device */ - s = wpas_p2p_get_persistent(wpa_s, dev, persist_ssid, - persist_ssid_size); + if (persist_ssid && persist_ssid_size) + s = wpas_p2p_get_persistent(wpa_s, dev, persist_ssid, + persist_ssid_size); if (persist_ssid && s && s->mode != WPAS_MODE_P2P_GO && is_zero_ether_addr(grp_mac)) {