|
|
8bd3b2 |
From 22151b111b493d4604c9490327c40fdac7bc4b37 Mon Sep 17 00:00:00 2001
|
|
|
8bd3b2 |
Message-Id: <22151b111b493d4604c9490327c40fdac7bc4b37.1525684664.git.davide.caratti@gmail.com>
|
|
|
8bd3b2 |
From: Davide Caratti <davide.caratti@gmail.com>
|
|
|
8bd3b2 |
Date: Thu, 8 Mar 2018 17:15:02 +0100
|
|
|
8bd3b2 |
Subject: [PATCH] wpa_supplicant: Fix memory leaks in
|
|
|
8bd3b2 |
ieee802_1x_create_preshared_mka()
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
In case MKA is initialized successfully, local copies of CAK and CKN
|
|
|
8bd3b2 |
were allocated, but never freed. Ensure that such memory is released
|
|
|
8bd3b2 |
also when ieee802_1x_kay_create_mka() returns a valid pointer.
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
Fixes: ad51731abf06 ("wpa_supplicant: Allow pre-shared (CAK,CKN) pair for MKA")
|
|
|
8bd3b2 |
Signed-off-by: Davide Caratti <davide.caratti@gmail.com>
|
|
|
8bd3b2 |
---
|
|
|
8bd3b2 |
wpa_supplicant/wpas_kay.c | 32 +++++++++++++++-----------------
|
|
|
8bd3b2 |
1 file changed, 15 insertions(+), 17 deletions(-)
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
diff --git a/wpa_supplicant/wpas_kay.c b/wpa_supplicant/wpas_kay.c
|
|
|
8bd3b2 |
index 11708b8a6..d3d06b8ae 100644
|
|
|
8bd3b2 |
--- a/wpa_supplicant/wpas_kay.c
|
|
|
8bd3b2 |
+++ b/wpa_supplicant/wpas_kay.c
|
|
|
8bd3b2 |
@@ -392,25 +392,25 @@ void * ieee802_1x_create_preshared_mka(struct wpa_supplicant *wpa_s,
|
|
|
8bd3b2 |
{
|
|
|
8bd3b2 |
struct mka_key *cak;
|
|
|
8bd3b2 |
struct mka_key_name *ckn;
|
|
|
8bd3b2 |
- void *res;
|
|
|
8bd3b2 |
+ void *res = NULL;
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
if ((ssid->mka_psk_set & MKA_PSK_SET) != MKA_PSK_SET)
|
|
|
8bd3b2 |
- return NULL;
|
|
|
8bd3b2 |
-
|
|
|
8bd3b2 |
- if (ieee802_1x_alloc_kay_sm(wpa_s, ssid) < 0)
|
|
|
8bd3b2 |
- return NULL;
|
|
|
8bd3b2 |
-
|
|
|
8bd3b2 |
- if (!wpa_s->kay || wpa_s->kay->policy == DO_NOT_SECURE)
|
|
|
8bd3b2 |
- return NULL;
|
|
|
8bd3b2 |
+ goto end;
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
ckn = os_zalloc(sizeof(*ckn));
|
|
|
8bd3b2 |
if (!ckn)
|
|
|
8bd3b2 |
- goto dealloc;
|
|
|
8bd3b2 |
+ goto end;
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
cak = os_zalloc(sizeof(*cak));
|
|
|
8bd3b2 |
if (!cak)
|
|
|
8bd3b2 |
goto free_ckn;
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
+ if (ieee802_1x_alloc_kay_sm(wpa_s, ssid) < 0 || !wpa_s->kay)
|
|
|
8bd3b2 |
+ goto free_cak;
|
|
|
8bd3b2 |
+
|
|
|
8bd3b2 |
+ if (wpa_s->kay->policy == DO_NOT_SECURE)
|
|
|
8bd3b2 |
+ goto dealloc;
|
|
|
8bd3b2 |
+
|
|
|
8bd3b2 |
cak->len = MACSEC_CAK_LEN;
|
|
|
8bd3b2 |
os_memcpy(cak->key, ssid->mka_cak, cak->len);
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
@@ -419,17 +419,15 @@ void * ieee802_1x_create_preshared_mka(struct wpa_supplicant *wpa_s,
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
res = ieee802_1x_kay_create_mka(wpa_s->kay, ckn, cak, 0, PSK, FALSE);
|
|
|
8bd3b2 |
if (res)
|
|
|
8bd3b2 |
- return res;
|
|
|
8bd3b2 |
+ goto free_cak;
|
|
|
8bd3b2 |
|
|
|
8bd3b2 |
+dealloc:
|
|
|
8bd3b2 |
/* Failed to create MKA */
|
|
|
8bd3b2 |
+ ieee802_1x_dealloc_kay_sm(wpa_s);
|
|
|
8bd3b2 |
+free_cak:
|
|
|
8bd3b2 |
os_free(cak);
|
|
|
8bd3b2 |
-
|
|
|
8bd3b2 |
- /* fallthrough */
|
|
|
8bd3b2 |
-
|
|
|
8bd3b2 |
free_ckn:
|
|
|
8bd3b2 |
os_free(ckn);
|
|
|
8bd3b2 |
-dealloc:
|
|
|
8bd3b2 |
- ieee802_1x_dealloc_kay_sm(wpa_s);
|
|
|
8bd3b2 |
-
|
|
|
8bd3b2 |
- return NULL;
|
|
|
8bd3b2 |
+end:
|
|
|
8bd3b2 |
+ return res;
|
|
|
8bd3b2 |
}
|
|
|
8bd3b2 |
--
|
|
|
8bd3b2 |
2.14.3
|
|
|
8bd3b2 |
|