[PATCH] P2P: Prevent p2p connect misuse
Arend van Spriel
arend
Tue Dec 2 08:13:25 PST 2014
On 12/02/14 12:29, Michal Kazior wrote:
> 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.
I thought steps (3) and (4) are global commands and would be forwarded
to the (dedicated) p2p management interface.
Regards,
Arend
> 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 ||
More information about the Hostap
mailing list