Blame SOURCES/wpa_supplicant-P2P-Fix-a-corner-case-in-peer-addition-based-on-PD-R.patch

9d7e52
From 8460e3230988ef2ec13ce6b69b687e941f6cdb32 Mon Sep 17 00:00:00 2001
9d7e52
From: Jouni Malinen <jouni@codeaurora.org>
9d7e52
Date: Tue, 8 Dec 2020 23:52:50 +0200
9d7e52
Subject: [PATCH] P2P: Fix a corner case in peer addition based on PD Request
9d7e52
9d7e52
p2p_add_device() may remove the oldest entry if there is no room in the
9d7e52
peer table for a new peer. This would result in any pointer to that
9d7e52
removed entry becoming stale. A corner case with an invalid PD Request
9d7e52
frame could result in such a case ending up using (read+write) freed
9d7e52
memory. This could only by triggered when the peer table has reached its
9d7e52
maximum size and the PD Request frame is received from the P2P Device
9d7e52
Address of the oldest remaining entry and the frame has incorrect P2P
9d7e52
Device Address in the payload.
9d7e52
9d7e52
Fix this by fetching the dev pointer again after having called
9d7e52
p2p_add_device() so that the stale pointer cannot be used.
9d7e52
9d7e52
Fixes: 17bef1e97a50 ("P2P: Add peer entry based on Provision Discovery Request")
9d7e52
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
9d7e52
---
9d7e52
 src/p2p/p2p_pd.c | 12 +++++-------
9d7e52
 1 file changed, 5 insertions(+), 7 deletions(-)
9d7e52
9d7e52
diff --git a/src/p2p/p2p_pd.c b/src/p2p/p2p_pd.c
9d7e52
index 3994ec03f86b..05fd593494ef 100644
9d7e52
--- a/src/p2p/p2p_pd.c
9d7e52
+++ b/src/p2p/p2p_pd.c
9d7e52
@@ -595,14 +595,12 @@ void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa,
9d7e52
 			goto out;
9d7e52
 		}
9d7e52
 
9d7e52
+		dev = p2p_get_device(p2p, sa);
9d7e52
 		if (!dev) {
9d7e52
-			dev = p2p_get_device(p2p, sa);
9d7e52
-			if (!dev) {
9d7e52
-				p2p_dbg(p2p,
9d7e52
-					"Provision Discovery device not found "
9d7e52
-					MACSTR, MAC2STR(sa));
9d7e52
-				goto out;
9d7e52
-			}
9d7e52
+			p2p_dbg(p2p,
9d7e52
+				"Provision Discovery device not found "
9d7e52
+				MACSTR, MAC2STR(sa));
9d7e52
+			goto out;
9d7e52
 		}
9d7e52
 	} else if (msg.wfd_subelems) {
9d7e52
 		wpabuf_free(dev->info.wfd_subelems);
9d7e52
-- 
9d7e52
2.25.1
9d7e52