[PATCH] P2P: Disconnect P2P group on supplicant deinit

Shah, Nirav J2 nirav.j2.shah
Tue Apr 3 17:55:44 PDT 2012

Hey Jouni, 

You are right it does break the non dbus build because of wpa_printf message in the patch which references dbus_groupobj_path. Also I have realized that wpa_supplicant_deinit_iface() may not be a good place to do p2p specific operation. To answer your question about the leak, although wpas_notify_p2p_group_removed is enough to solve the immediate problem, I am calling wpas_p2p_group_delete to avoid similar cleanup issues in the future. And I do need ssid portion of code in wpas_p2p_group_delete as well. 

I have created an updated patch (I will send that to the mailing list in a few mins).Here I am calling the same function inside wpas_p2p_deinit_global(). If you know of a better way to do this let me know and I can redo the patch. 


-----Original Message-----
From: hostap-bounces at lists.shmoo.com [mailto:hostap-bounces at lists.shmoo.com] On Behalf Of Jouni Malinen
Sent: Saturday, March 31, 2012 11:30 AM
To: hostap at lists.shmoo.com
Subject: Re: [PATCH] P2P: Disconnect P2P group on supplicant deinit

On Thu, Mar 22, 2012 at 09:17:36AM -0700, nirav shah wrote:
> When a supplicant is deinited and shutting, adding code to disconnect
> from p2p_group. Found root causing the memory leak on variable
> dbus_groupobj_path on exiting supplicant.

> diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
> @@ -2570,6 +2570,18 @@ next_driver:
>  static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
>  					int notify, int terminate)
>  {
> +
> +#ifdef CONFIG_P2P
> +	if (wpa_s && wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) {
> +		/* This is a p2p interface */
> +		wpa_printf(MSG_DEBUG, "P2P: Disconnecting the P2P group %s",
> +			 wpa_s->dbus_groupobj_path);

This breaks non-D-Bus builds..

> +		/* Disconnect from the p2p group if any */
> +		wpas_p2p_disconnect(wpa_s);

And this could potentially free the wpa_s structure which looks
suspicious when the following statement here dereferences the pointer:

>  	if (wpa_s->drv_priv) {

This will need to be done differently. What parts of
wpas_p2p_group_delete() are needed to avoid the memory leak? Just the
call to wpas_notify_p2p_group_removed() to get
wpas_dbus_unregister_p2p_group() called to free

Jouni Malinen                                            PGP id EFC895FA
HostAP mailing list
HostAP at lists.shmoo.com

More information about the Hostap mailing list