@@ -1398,6 +1398,17 @@ struct wpa_gtk_data {
};
+static int wpa_supplicant_validate_gtk_kde_len(size_t gtk_len)
+{
+ struct wpa_gtk_data gd;
+
+ if (gtk_len < 2 || gtk_len - 2 > sizeof(gd.gtk))
+ return -1;
+
+ return 0;
+}
+
+
static int wpa_supplicant_install_gtk(struct wpa_sm *sm,
const struct wpa_gtk_data *gd,
const u8 *key_rsc, int wnm_sleep)
@@ -1668,7 +1679,7 @@ static int wpa_supplicant_pairwise_gtk(struct wpa_sm *sm,
wpa_hexdump_key(MSG_DEBUG, "RSN: received GTK in pairwise handshake",
gtk, gtk_len);
- if (gtk_len < 2 || gtk_len - 2 > sizeof(gd.gtk))
+ if (wpa_supplicant_validate_gtk_kde_len(gtk_len) < 0)
return -1;
gd.keyidx = gtk[0] & 0x3;
@@ -2892,6 +2903,15 @@ static void wpa_supplicant_process_3_of_4(struct wpa_sm *sm,
"WPA: GTK IE in unencrypted key data");
goto failed;
}
+
+ if (!mlo && ie.gtk &&
+ wpa_supplicant_validate_gtk_kde_len(ie.gtk_len) < 0) {
+ wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
+ "WPA: Invalid GTK KDE length %lu",
+ (unsigned long) ie.gtk_len);
+ goto failed;
+ }
+
if (!mlo && ie.igtk && !(key_info & WPA_KEY_INFO_ENCR_KEY_DATA)) {
wpa_msg(sm->ctx->msg_ctx, MSG_WARNING,
"WPA: IGTK KDE in unencrypted key data");