diff options
| author | Navaneeth K <knavaneeth786@gmail.com> | 2025-11-20 16:23:52 +0000 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2025-12-12 18:40:23 +0100 |
| commit | df191dd9f4c7249d98ada55634fa8ac19089b8cb (patch) | |
| tree | 1cfbf52ec062593eb7eb27d74c09339532d8d28a /drivers/staging | |
| parent | 573b07d2e3d473ee7eb625ef87519922cf01168d (diff) | |
| download | linux-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.c | 14 |
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; } |
