wifi: ath11k: fix writing to unintended memory region
authorP Praneesh <quic_ppranees@quicinc.com>
Fri, 24 Mar 2023 14:57:01 +0000 (16:57 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:03:21 +0000 (23:03 +0900)
[ Upstream commit 756a7f90878f0866fd2fe167ef37e90b47326b96 ]

While initializing spectral, the magic value is getting written to the
invalid memory address leading to random boot-up crash. This occurs
due to the incorrect index increment in ath11k_dbring_fill_magic_value
function. Fix it by replacing the existing logic with memset32 to ensure
there is no invalid memory access.

Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01838-QCAHKSWPL_SILICONZ-1

Fixes: d3d358efc553 ("ath11k: add spectral/CFR buffer validation support")
Signed-off-by: P Praneesh <quic_ppranees@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230321052900.16895-1-quic_ppranees@quicinc.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/ath/ath11k/dbring.c

index 2107ec0..5536e86 100644 (file)
@@ -26,13 +26,13 @@ int ath11k_dbring_validate_buffer(struct ath11k *ar, void *buffer, u32 size)
 static void ath11k_dbring_fill_magic_value(struct ath11k *ar,
                                           void *buffer, u32 size)
 {
-       u32 *temp;
-       int idx;
-
-       size = size >> 2;
+       /* memset32 function fills buffer payload with the ATH11K_DB_MAGIC_VALUE
+        * and the variable size is expected to be the number of u32 values
+        * to be stored, not the number of bytes.
+        */
+       size = size / sizeof(u32);
 
-       for (idx = 0, temp = buffer; idx < size; idx++, temp++)
-               *temp++ = ATH11K_DB_MAGIC_VALUE;
+       memset32(buffer, ATH11K_DB_MAGIC_VALUE, size);
 }
 
 static int ath11k_dbring_bufs_replenish(struct ath11k *ar,