mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-04 04:54:18 +00:00
41 lines
1.6 KiB
Diff
41 lines
1.6 KiB
Diff
|
From fe76f487e28bdc61940f304f153a954cf36935ea Mon Sep 17 00:00:00 2001
|
||
|
From: Jouni Malinen <jouni@codeaurora.org>
|
||
|
Date: Wed, 17 Apr 2019 01:55:32 +0300
|
||
|
Subject: [PATCH 1/3] EAP-pwd server: Fix reassembly buffer handling
|
||
|
|
||
|
data->inbuf allocation might fail and if that were to happen, the next
|
||
|
fragment in the exchange could have resulted in NULL pointer
|
||
|
dereference. Unexpected fragment with more bit might also be able to
|
||
|
trigger this. Fix that by explicitly checking for data->inbuf to be
|
||
|
available before using it.
|
||
|
|
||
|
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
|
||
|
---
|
||
|
src/eap_server/eap_server_pwd.c | 8 +++++++-
|
||
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
||
|
|
||
|
--- a/src/eap_server/eap_server_pwd.c
|
||
|
+++ b/src/eap_server/eap_server_pwd.c
|
||
|
@@ -947,6 +947,12 @@ static void eap_pwd_process(struct eap_s
|
||
|
* the first and all intermediate fragments have the M bit set
|
||
|
*/
|
||
|
if (EAP_PWD_GET_MORE_BIT(lm_exch) || data->in_frag_pos) {
|
||
|
+ if (!data->inbuf) {
|
||
|
+ wpa_printf(MSG_DEBUG,
|
||
|
+ "EAP-pwd: No buffer for reassembly");
|
||
|
+ eap_pwd_state(data, FAILURE);
|
||
|
+ return;
|
||
|
+ }
|
||
|
if ((data->in_frag_pos + len) > wpabuf_size(data->inbuf)) {
|
||
|
wpa_printf(MSG_DEBUG, "EAP-pwd: Buffer overflow "
|
||
|
"attack detected! (%d+%d > %d)",
|
||
|
@@ -967,7 +973,7 @@ static void eap_pwd_process(struct eap_s
|
||
|
* last fragment won't have the M bit set (but we're obviously
|
||
|
* buffering fragments so that's how we know it's the last)
|
||
|
*/
|
||
|
- if (data->in_frag_pos) {
|
||
|
+ if (data->in_frag_pos && data->inbuf) {
|
||
|
pos = wpabuf_head_u8(data->inbuf);
|
||
|
len = data->in_frag_pos;
|
||
|
wpa_printf(MSG_DEBUG, "EAP-pwd: Last fragment, %d bytes",
|