Parcourir la source

qcacld-3.0: Fix array out of bound access during fisa flush

Fisa flow entry napi id is initialized to invalid value,
which will cause out of bound access during fisa flush by vdev id.

Fix this by validating array index before access.

Change-Id: Ic7b1b1448194b75777f9dc392043275235caa7f7
CRs-Fixed: 2873033
Karthik Kantamneni il y a 4 ans
Parent
commit
24bd39e7fc
1 fichiers modifiés avec 6 ajouts et 2 suppressions
  1. 6 2
      core/dp/txrx3.0/dp_fisa_rx.c

+ 6 - 2
core/dp/txrx3.0/dp_fisa_rx.c

@@ -1958,6 +1958,7 @@ QDF_STATUS dp_rx_fisa_flush_by_vdev_id(struct dp_soc *soc, uint8_t vdev_id)
 	int ft_size = fisa_hdl->max_entries;
 	int i;
 	struct dp_vdev *vdev;
+	uint8_t reo_id;
 
 	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_RX);
 	if (qdf_unlikely(!vdev)) {
@@ -1966,14 +1967,17 @@ QDF_STATUS dp_rx_fisa_flush_by_vdev_id(struct dp_soc *soc, uint8_t vdev_id)
 	}
 
 	for (i = 0; i < ft_size; i++) {
-		dp_rx_fisa_acquire_ft_lock(fisa_hdl, sw_ft_entry[i].napi_id);
+		reo_id = sw_ft_entry[i].napi_id;
+		if (reo_id >= MAX_REO_DEST_RINGS)
+			continue;
+		dp_rx_fisa_acquire_ft_lock(fisa_hdl, reo_id);
 		if (vdev == sw_ft_entry[i].vdev) {
 			dp_fisa_debug("flushing %d %pk vdev %pK", i,
 				      &sw_ft_entry[i], vdev);
 
 			dp_rx_fisa_flush_flow_wrap(&sw_ft_entry[i]);
 		}
-		dp_rx_fisa_release_ft_lock(fisa_hdl, sw_ft_entry[i].napi_id);
+		dp_rx_fisa_release_ft_lock(fisa_hdl, reo_id);
 	}
 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_RX);