diff options
author | Jouni Malinen <j@w1.fi> | 2015-05-02 19:23:04 +0300 |
---|---|---|
committer | Dan Pasanen <dan.pasanen@gmail.com> | 2015-05-11 09:02:07 -0500 |
commit | f24da54fee7e3cb0ba28fbb69d56055d310afb53 (patch) | |
tree | 057240c4b1cf74b8389485a8bf0e152ffa282c04 /src | |
parent | c9a4555d84a8dbcfc7939832f75ed3654a72da80 (diff) | |
download | android_external_wpa_supplicant_8-f24da54fee7e3cb0ba28fbb69d56055d310afb53.tar.gz android_external_wpa_supplicant_8-f24da54fee7e3cb0ba28fbb69d56055d310afb53.tar.bz2 android_external_wpa_supplicant_8-f24da54fee7e3cb0ba28fbb69d56055d310afb53.zip |
EAP-pwd peer: Fix Total-Length parsing for fragment reassembly
The remaining number of bytes in the message could be smaller than the
Total-Length field size, so the length needs to be explicitly checked
prior to reading the field and decrementing the len variable. This could
have resulted in the remaining length becoming negative and interpreted
as a huge positive integer.
In addition, check that there is no already started fragment in progress
before allocating a new buffer for reassembling fragments. This avoid a
potential memory leak when processing invalid message.
Change-Id: Iff93a6434df546f093eb192e999e82f999abb96e
Signed-off-by: Jouni Malinen <j@w1.fi>
Diffstat (limited to 'src')
-rw-r--r-- | src/eap_peer/eap_pwd.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/eap_peer/eap_pwd.c b/src/eap_peer/eap_pwd.c index 669d2d2b..4642527c 100644 --- a/src/eap_peer/eap_pwd.c +++ b/src/eap_peer/eap_pwd.c @@ -812,11 +812,23 @@ eap_pwd_process(struct eap_sm *sm, void *priv, struct eap_method_ret *ret, * if it's the first fragment there'll be a length field */ if (EAP_PWD_GET_LENGTH_BIT(lm_exch)) { + if (len < 2) { + wpa_printf(MSG_DEBUG, + "EAP-pwd: Frame too short to contain Total-Length field"); + ret->ignore = TRUE; + return NULL; + } tot_len = WPA_GET_BE16(pos); wpa_printf(MSG_DEBUG, "EAP-pwd: Incoming fragments whose " "total length = %d", tot_len); if (tot_len > 15000) return NULL; + if (data->inbuf) { + wpa_printf(MSG_DEBUG, + "EAP-pwd: Unexpected new fragment start when previous fragment is still in use"); + ret->ignore = TRUE; + return NULL; + } data->inbuf = wpabuf_alloc(tot_len); if (data->inbuf == NULL) { wpa_printf(MSG_INFO, "Out of memory to buffer " |