Blame SOURCES/rh1495527-0008-FT-Do-not-allow-multiple-Reassociation-Response-fram.patch

92bdd1
From b372ab0b7daea719749194dc554b26e6367603f2 Mon Sep 17 00:00:00 2001
92bdd1
From: Jouni Malinen <j@w1.fi>
92bdd1
Date: Fri, 22 Sep 2017 12:06:37 +0300
92bdd1
Subject: [PATCH 8/8] FT: Do not allow multiple Reassociation Response frames
92bdd1
92bdd1
The driver is expected to not report a second association event without
92bdd1
the station having explicitly request a new association. As such, this
92bdd1
case should not be reachable. However, since reconfiguring the same
92bdd1
pairwise or group keys to the driver could result in nonce reuse issues,
92bdd1
be extra careful here and do an additional state check to avoid this
92bdd1
even if the local driver ends up somehow accepting an unexpected
92bdd1
Reassociation Response frame.
92bdd1
92bdd1
Signed-off-by: Jouni Malinen <j@w1.fi>
92bdd1
---
92bdd1
 src/rsn_supp/wpa.c    | 3 +++
92bdd1
 src/rsn_supp/wpa_ft.c | 8 ++++++++
92bdd1
 src/rsn_supp/wpa_i.h  | 1 +
92bdd1
 3 files changed, 12 insertions(+)
92bdd1
92bdd1
diff --git a/src/rsn_supp/wpa.c b/src/rsn_supp/wpa.c
92bdd1
index 0550a41..2a53c6f 100644
92bdd1
--- a/src/rsn_supp/wpa.c
92bdd1
+++ b/src/rsn_supp/wpa.c
92bdd1
@@ -2440,6 +2440,9 @@ void wpa_sm_notify_disassoc(struct wpa_sm *sm)
92bdd1
 #ifdef CONFIG_TDLS
92bdd1
 	wpa_tdls_disassoc(sm);
92bdd1
 #endif /* CONFIG_TDLS */
92bdd1
+#ifdef CONFIG_IEEE80211R
92bdd1
+	sm->ft_reassoc_completed = 0;
92bdd1
+#endif /* CONFIG_IEEE80211R */
92bdd1
 
92bdd1
 	/* Keys are not needed in the WPA state machine anymore */
92bdd1
 	wpa_sm_drop_sa(sm);
92bdd1
diff --git a/src/rsn_supp/wpa_ft.c b/src/rsn_supp/wpa_ft.c
92bdd1
index 205793e..d45bb45 100644
92bdd1
--- a/src/rsn_supp/wpa_ft.c
92bdd1
+++ b/src/rsn_supp/wpa_ft.c
92bdd1
@@ -153,6 +153,7 @@ static u8 * wpa_ft_gen_req_ies(struct wpa_sm *sm, size_t *len,
92bdd1
 	u16 capab;
92bdd1
 
92bdd1
 	sm->ft_completed = 0;
92bdd1
+	sm->ft_reassoc_completed = 0;
92bdd1
 
92bdd1
 	buf_len = 2 + sizeof(struct rsn_mdie) + 2 + sizeof(struct rsn_ftie) +
92bdd1
 		2 + sm->r0kh_id_len + ric_ies_len + 100;
92bdd1
@@ -681,6 +682,11 @@ int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
92bdd1
 		return -1;
92bdd1
 	}
92bdd1
 
92bdd1
+	if (sm->ft_reassoc_completed) {
92bdd1
+		wpa_printf(MSG_DEBUG, "FT: Reassociation has already been completed for this FT protocol instance - ignore unexpected retransmission");
92bdd1
+		return 0;
92bdd1
+	}
92bdd1
+
92bdd1
 	if (wpa_ft_parse_ies(ies, ies_len, &parse) < 0) {
92bdd1
 		wpa_printf(MSG_DEBUG, "FT: Failed to parse IEs");
92bdd1
 		return -1;
92bdd1
@@ -781,6 +787,8 @@ int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
92bdd1
 		return -1;
92bdd1
 	}
92bdd1
 
92bdd1
+	sm->ft_reassoc_completed = 1;
92bdd1
+
92bdd1
 	if (wpa_ft_process_gtk_subelem(sm, parse.gtk, parse.gtk_len) < 0)
92bdd1
 		return -1;
92bdd1
 
92bdd1
diff --git a/src/rsn_supp/wpa_i.h b/src/rsn_supp/wpa_i.h
92bdd1
index 41f371f..56f88dc 100644
92bdd1
--- a/src/rsn_supp/wpa_i.h
92bdd1
+++ b/src/rsn_supp/wpa_i.h
92bdd1
@@ -128,6 +128,7 @@ struct wpa_sm {
92bdd1
 	size_t r0kh_id_len;
92bdd1
 	u8 r1kh_id[FT_R1KH_ID_LEN];
92bdd1
 	int ft_completed;
92bdd1
+	int ft_reassoc_completed;
92bdd1
 	int over_the_ds_in_progress;
92bdd1
 	u8 target_ap[ETH_ALEN]; /* over-the-DS target AP */
92bdd1
 	int set_ptk_after_assoc;
92bdd1
-- 
92bdd1
2.7.4
92bdd1