summaryrefslogtreecommitdiff
path: root/drivers/staging
diff options
context:
space:
mode:
authorNavaneeth K <knavaneeth786@gmail.com>2025-11-20 16:23:52 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-12-12 18:40:23 +0100
commitdf191dd9f4c7249d98ada55634fa8ac19089b8cb (patch)
tree1cfbf52ec062593eb7eb27d74c09339532d8d28a /drivers/staging
parent573b07d2e3d473ee7eb625ef87519922cf01168d (diff)
downloadlinux-df191dd9f4c7249d98ada55634fa8ac19089b8cb.tar.gz
linux-df191dd9f4c7249d98ada55634fa8ac19089b8cb.tar.bz2
linux-df191dd9f4c7249d98ada55634fa8ac19089b8cb.zip
staging: rtl8723bs: fix out-of-bounds read in rtw_get_ie() parser
commit 154828bf9559b9c8421fc2f0d7f7f76b3683aaed upstream. 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. Signed-off-by: Navaneeth K <knavaneeth786@gmail.com> Cc: stable <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/rtl8723bs/core/rtw_ieee80211.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c
index 53d4c113b19c..df35c616e71f 100644
--- a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c
+++ b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c
@@ -140,22 +140,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;
}
- tmp = *(p + 1);
+
p += (tmp + 2);
i += (tmp + 2);
- if (i >= limit)
- break;
}
return NULL;
}