[PATCH 11/23] P2P: Cleanup handling of unknown peer in PD request processing

Jouni Malinen j
Mon Oct 5 09:56:23 PDT 2015


On Thu, Sep 24, 2015 at 08:38:01PM +0300, Ilan Peer wrote:
> If a P2P provision discovery request is received for an unknown peer,
> a new device entry is being added, but the flow continues without
> updating the local p2p_device pointer, requiring to check the pointer
> value before every access.
> 
> Change this, so once a device is added, the flow updates the local
> p2p_device pointer and avoids the checks later in the flow.

> diff --git a/src/p2p/p2p_pd.c b/src/p2p/p2p_pd.c
> @@ -330,8 +330,7 @@ static struct wpabuf * p2p_build_prov_disc_resp(struct p2p_data *p2p,
> -			if (dev)
> -				p2p_go_select_channel(p2p, dev, &tmp);
> +			p2p_go_select_channel(p2p, dev, &tmp);

Could you please clarify why this change is fine?
p2p_go_select_channel() dereferences the dev argument unconditionally..

> @@ -575,6 +574,19 @@ void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa,
> +			p2p_parse_free(&msg);
> +			goto out;

And this "goto out" case has dev == NULL.

> +		if (!dev) {
> +			dev = p2p_get_device(p2p, sa);
> +			if (!dev) {
> +				p2p_dbg(p2p,
> +					"Provision Discovery device not found "
> +					MACSTR, MAC2STR(sa));
> +				p2p_parse_free(&msg);
> +				goto out;
> +			}

Just like this one..

Wouldn't this result in NULL pointer dereference in
p2p_go_select_channel() due to that p2p_build_prov_disc_resp() change?

-- 
Jouni Malinen                                            PGP id EFC895FA



More information about the Hostap mailing list