From: Navaneeth K Date: Mon, 30 Mar 2026 03:12:31 +0000 (+0800) Subject: staging: rtl8723bs: fix out-of-bounds read in rtw_get_ie() parser X-Git-Tag: v5.15.203~71 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9829c6e1b2e4180fd18315252ad6faeab6128076;p=thirdparty%2Fkernel%2Fstable.git staging: rtl8723bs: fix out-of-bounds read in rtw_get_ie() parser [ Upstream commit 154828bf9559b9c8421fc2f0d7f7f76b3683aaed ] The Information Element (IE) parser rtw_get_ie() trusted the length byte of each IE without validating that the IE body (len bytes after the 2-byte header) fits inside the remaining frame buffer. A malformed frame can advertise an IE length larger than the available data, causing the parser to increment its pointer beyond the buffer end. This results in out-of-bounds reads or, depending on the pattern, an infinite loop. Fix by validating that (offset + 2 + len) does not exceed the limit before accepting the IE or advancing to the next element. This prevents OOB reads and ensures the parser terminates safely on malformed frames. [ The context change is due to the commit 4610e57a7d2e ("staging: rtl8723bs: Remove redundant else branches.") in v5.19 which is irrelevant to the logic of this patch. ] Signed-off-by: Navaneeth K Cc: stable Signed-off-by: Greg Kroah-Hartman Signed-off-by: Johnny Hao Signed-off-by: Sasha Levin --- diff --git a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c index c01f7da9d025c..666ce2f9c5270 100644 --- a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c +++ b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c @@ -141,23 +141,24 @@ u8 *rtw_get_ie(u8 *pbuf, signed int index, signed int *len, signed int limit) signed int tmp, i; u8 *p; - if (limit < 1) + if (limit < 2) return NULL; p = pbuf; i = 0; *len = 0; - while (1) { + while (i + 2 <= limit) { + tmp = *(p + 1); + if (i + 2 + tmp > limit) + break; + if (*p == index) { - *len = *(p + 1); + *len = tmp; return p; } else { - tmp = *(p + 1); p += (tmp + 2); i += (tmp + 2); } - if (i >= limit) - break; } return NULL; }