[PATCH] P2P: Prevent p2p connect misuse
Michal Kazior
michal.kazior
Tue Dec 2 03:29:50 PST 2014
It was possible to request p2p_connect (and possibly other callers like
p2p_prov_disc, and nfc-related stuff) on a different wpa_s context than
its subsequent related events were processed in causing failures.
For example with dedicated p2pdev wpa_s->create_p2p_iface could be set
on, e.g. wlan1 but later wpas_go_neg_completed() was called for
p2p-dev-wlan1 whose create_p2p_iface was 0. This ended up with wpa_s
trying to use p2p-dev-wlan1 to associate (which isn't even a netdev).
Steps to reproduce:
1. use driver with p2pdev
2. start wpa_s, let wlan0 connect
3. wpa_cli -i wlan0 p2p_find
4. wpa_cli -i wlan0 p2p_connect ..
5. p2p-dev-wlan0 tries to associate despite it's not even a netdev
Obviously using p2p commands on non-main/p2p interface seems wrong and
steps (3) and (4) should be using p2p-dev-wlan0 instead. Nevertheless it
makes sense to prevent this misuse and warn the user in a sane way
instead of performing a cascade of strange failures.
Signed-off-by: Michal Kazior <michal.kazior at tieto.com>
---
wpa_supplicant/p2p_supplicant.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index aac3a10..ad79d8a 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -16,6 +16,7 @@
#include "common/wpa_ctrl.h"
#include "wps/wps_i.h"
#include "p2p/p2p.h"
+#include "p2p/p2p_i.h"
#include "ap/hostapd.h"
#include "ap/ap_config.h"
#include "ap/sta_info.h"
@@ -4927,6 +4928,7 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
int go_intent, int freq, int persistent_id, int pd,
int ht40, int vht)
{
+ struct wpa_supplicant *p2p_wpa_s;
int force_freq = 0, pref_freq = 0;
int ret = 0, res;
enum wpa_driver_if_type iftype;
@@ -4936,6 +4938,21 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
return -1;
+ /*
+ * If P2P callbacks have different context than the trigger command
+ * they may behave incorrectly. Prevent that by issuing a warning and
+ * refusing to continue.
+ */
+ p2p_wpa_s = wpa_s->global->p2p->cfg->cb_ctx;
+ if (p2p_wpa_s == NULL)
+ return -1; /* should not happen? */
+
+ if (p2p_wpa_s != wpa_s) {
+ wpa_printf(MSG_WARNING, "P2P: Cannot connect via %s. Use %s instead",
+ wpa_s->ifname, p2p_wpa_s->ifname);
+ return -1;
+ }
+
if (persistent_id >= 0) {
ssid = wpa_config_get_network(wpa_s->conf, persistent_id);
if (ssid == NULL || ssid->disabled != 2 ||
--
1.8.5.3
More information about the Hostap
mailing list