blob: fedff76b180b06cce1896195cf70215a1ff7f7e3 [file] [log] [blame]
Andrew Geisslere34f8962021-04-15 15:53:51 -05001From 8460e3230988ef2ec13ce6b69b687e941f6cdb32 Mon Sep 17 00:00:00 2001
2From: Jouni Malinen <jouni@codeaurora.org>
3Date: Tue, 8 Dec 2020 23:52:50 +0200
4Subject: [PATCH] P2P: Fix a corner case in peer addition based on PD Request
5
6p2p_add_device() may remove the oldest entry if there is no room in the
7peer table for a new peer. This would result in any pointer to that
8removed entry becoming stale. A corner case with an invalid PD Request
9frame could result in such a case ending up using (read+write) freed
10memory. This could only by triggered when the peer table has reached its
11maximum size and the PD Request frame is received from the P2P Device
12Address of the oldest remaining entry and the frame has incorrect P2P
13Device Address in the payload.
14
15Fix this by fetching the dev pointer again after having called
16p2p_add_device() so that the stale pointer cannot be used.
17
18CVE: CVE-2021-27803
19
20Upstream-Status: Backport
21
22Fixes: 17bef1e97a50 ("P2P: Add peer entry based on Provision Discovery Request")
23Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
24---
25 src/p2p/p2p_pd.c | 12 +++++-------
26 1 file changed, 5 insertions(+), 7 deletions(-)
27
28diff --git a/src/p2p/p2p_pd.c b/src/p2p/p2p_pd.c
29index 3994ec03f..05fd59349 100644
30--- a/src/p2p/p2p_pd.c
31+++ b/src/p2p/p2p_pd.c
32@@ -595,14 +595,12 @@ void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa,
33 goto out;
34 }
35
36+ dev = p2p_get_device(p2p, sa);
37 if (!dev) {
38- dev = p2p_get_device(p2p, sa);
39- if (!dev) {
40- p2p_dbg(p2p,
41- "Provision Discovery device not found "
42- MACSTR, MAC2STR(sa));
43- goto out;
44- }
45+ p2p_dbg(p2p,
46+ "Provision Discovery device not found "
47+ MACSTR, MAC2STR(sa));
48+ goto out;
49 }
50 } else if (msg.wfd_subelems) {
51 wpabuf_free(dev->info.wfd_subelems);
52--
532.17.1
54