summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZekun Shen <bruceshenzk@gmail.com>2021-06-19 09:29:14 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-09-22 11:43:08 +0200
commit08d3a4c050a1af7956cc251521e7468583768c80 (patch)
tree561c1430d6a246d08b312b4fa5cdb40107afdd51
parent60ee0e5084df87cab232aa6f4835bf23f6cfce8a (diff)
downloadlinux-08d3a4c050a1af7956cc251521e7468583768c80.tar.gz
linux-08d3a4c050a1af7956cc251521e7468583768c80.tar.bz2
linux-08d3a4c050a1af7956cc251521e7468583768c80.zip
ath9k: fix OOB read ar9300_eeprom_restore_internal
[ Upstream commit 23151b9ae79e3bc4f6a0c4cd3a7f355f68dad128 ] Bad header can have large length field which can cause OOB. cptr is the last bytes for read, and the eeprom is parsed from high to low address. The OOB, triggered by the condition length > cptr could cause memory error with a read on negative index. There are some sanity check around length, but it is not compared with cptr (the remaining bytes). Here, the corrupted/bad EEPROM can cause panic. I was able to reproduce the crash, but I cannot find the log and the reproducer now. After I applied the patch, the bug is no longer reproducible. Signed-off-by: Zekun Shen <bruceshenzk@gmail.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org> Link: https://lore.kernel.org/r/YM3xKsQJ0Hw2hjrc@Zekuns-MBP-16.fios-router.home Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_eeprom.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
index 7eff6f8023d8..969a2a581b0c 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
@@ -3346,7 +3346,8 @@ found:
"Found block at %x: code=%d ref=%d length=%d major=%d minor=%d\n",
cptr, code, reference, length, major, minor);
if ((!AR_SREV_9485(ah) && length >= 1024) ||
- (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485)) {
+ (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485) ||
+ (length > cptr)) {
ath_dbg(common, EEPROM, "Skipping bad header\n");
cptr -= COMP_HDR_LEN;
continue;