]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
staging: rtl8723bs: fix stack buffer overflow in OnAssocReq IE parsing
authorNavaneeth K <knavaneeth786@gmail.com>
Thu, 20 Nov 2025 16:33:08 +0000 (16:33 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 12 Dec 2025 17:37:21 +0000 (18:37 +0100)
commit 6ef0e1c10455927867cac8f0ed6b49f328f8cf95 upstream.

The Supported Rates IE length from an incoming Association Request frame
was used directly as the memcpy() length when copying into a fixed-size
16-byte stack buffer (supportRate). A malicious station can advertise an
IE length larger than 16 bytes, causing a stack buffer overflow.

Clamp ie_len to the buffer size before copying the Supported Rates IE,
and correct the bounds check when merging Extended Supported Rates to
prevent a second potential overflow.

This prevents kernel stack corruption triggered by malformed association
requests.

Signed-off-by: Navaneeth K <knavaneeth786@gmail.com>
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8723bs/core/rtw_mlme_ext.c

index 4d4bec47d1874cd125fc8fdb034c664f7c4efa16..c51e7e5513003be8718b6b41bb44df2d5c0d56e0 100644 (file)
@@ -1033,6 +1033,9 @@ unsigned int OnAssocReq(struct adapter *padapter, union recv_frame *precv_frame)
                status = WLAN_STATUS_CHALLENGE_FAIL;
                goto OnAssocReqFail;
        } else {
+               if (ie_len > sizeof(supportRate))
+                       ie_len = sizeof(supportRate);
+
                memcpy(supportRate, p+2, ie_len);
                supportRateNum = ie_len;
 
@@ -1040,7 +1043,7 @@ unsigned int OnAssocReq(struct adapter *padapter, union recv_frame *precv_frame)
                                pkt_len - WLAN_HDR_A3_LEN - ie_offset);
                if (p) {
 
-                       if (supportRateNum <= sizeof(supportRate)) {
+                       if (supportRateNum + ie_len <= sizeof(supportRate)) {
                                memcpy(supportRate+supportRateNum, p+2, ie_len);
                                supportRateNum += ie_len;
                        }