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=<idx> instead of conncap=<role> 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=<idx> 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 <Max.Stepanov@intel.com>
This commit is contained in:
parent
ecf56c7270
commit
cd571e14dd
1 changed files with 4 additions and 3 deletions
|
@ -3817,7 +3817,7 @@ static void wpas_p2ps_prov_complete(void *ctx, u8 status, const u8 *dev,
|
||||||
{
|
{
|
||||||
struct wpa_supplicant *wpa_s = ctx;
|
struct wpa_supplicant *wpa_s = ctx;
|
||||||
u8 mac[ETH_ALEN];
|
u8 mac[ETH_ALEN];
|
||||||
struct wpa_ssid *persistent_go, *stale, *s;
|
struct wpa_ssid *persistent_go, *stale, *s = NULL;
|
||||||
int save_config = 0;
|
int save_config = 0;
|
||||||
struct wpa_supplicant *go_wpa_s;
|
struct wpa_supplicant *go_wpa_s;
|
||||||
char feat_cap_str[256];
|
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 */
|
/* Clean up stale persistent groups with this device */
|
||||||
s = wpas_p2p_get_persistent(wpa_s, dev, persist_ssid,
|
if (persist_ssid && persist_ssid_size)
|
||||||
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 &&
|
if (persist_ssid && s && s->mode != WPAS_MODE_P2P_GO &&
|
||||||
is_zero_ether_addr(grp_mac)) {
|
is_zero_ether_addr(grp_mac)) {
|
||||||
|
|
Loading…
Reference in a new issue