]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: Fix memory leak due to multiple rx_stats allocation
authorSidhanta Sahu <sidhanta.sahu@oss.qualcomm.com>
Wed, 26 Mar 2025 21:35:38 +0000 (14:35 -0700)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Wed, 2 Apr 2025 15:04:31 +0000 (08:04 -0700)
rx_stats for each arsta is allocated when adding a station.
arsta->rx_stats will be freed when a station is removed.

Redundant allocations are occurring when the same station is added
multiple times. This causes ath12k_mac_station_add() to be called
multiple times, and rx_stats is allocated each time. As a result there
is memory leaks.

Prevent multiple allocations of rx_stats when ath12k_mac_station_add()
is called repeatedly by checking if rx_stats is already allocated
before allocating again. Allocate arsta->rx_stats if arsta->rx_stats
is NULL respectively.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Sidhanta Sahu <sidhanta.sahu@oss.qualcomm.com>
Signed-off-by: Muna Sinada <muna.sinada@oss.qualcomm.com>
Reviewed-by: Mahendran P <quic_mahep@quicinc.com>
Link: https://patch.msgid.link/20250326213538.2214194-1-muna.sinada@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/mac.c

index f2fddf213afb9cd8681d3d94a7863c8a25be2bb6..f4152f5d4987cf1b62f6b959646562d1fef8fd51 100644 (file)
@@ -5557,10 +5557,13 @@ static int ath12k_mac_station_add(struct ath12k *ar,
                            ar->max_num_stations);
                goto exit;
        }
-       arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
+
        if (!arsta->rx_stats) {
-               ret = -ENOMEM;
-               goto dec_num_station;
+               arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
+               if (!arsta->rx_stats) {
+                       ret = -ENOMEM;
+                       goto dec_num_station;
+               }
        }
 
        peer_param.vdev_id = arvif->vdev_id;