Ver código fonte

qcacmn: Add null checks in Rx TLV recording APIs

Add null checks in Rx TLV recording APIs for updating index,
clearing buffer and init deinit.

Change-Id: Iab40bd3130c335924a4849516b71ebaaa88e84bb
CRs-Fixed: 3416657
Aniruddha Mishra 2 anos atrás
pai
commit
cb82f44a0d

+ 11 - 2
dp/wifi3.0/monitor/2.0/dp_mon_2.0.c

@@ -1320,10 +1320,14 @@ static void dp_mon_register_intr_ops_2_0(struct dp_soc *soc)
 static
 QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev)
 {
-	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+	struct dp_mon_pdev *mon_pdev = NULL;
 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
 	struct dp_mon_tlv_logger *tlv_log = NULL;
 
+	if (!pdev)
+		return QDF_STATUS_E_INVAL;
+
+	mon_pdev = pdev->monitor_pdev;
 	if (!mon_pdev)
 		return QDF_STATUS_E_INVAL;
 
@@ -1370,10 +1374,14 @@ QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev)
 static
 QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_pdev *pdev)
 {
-	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+	struct dp_mon_pdev *mon_pdev = NULL;
 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
 	struct dp_mon_tlv_logger *tlv_log = NULL;
 
+	if (!pdev)
+		return QDF_STATUS_E_INVAL;
+
+	mon_pdev = pdev->monitor_pdev;
 	if (!mon_pdev)
 		return QDF_STATUS_E_INVAL;
 
@@ -1387,6 +1395,7 @@ QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_pdev *pdev)
 	qdf_mem_free(tlv_log->buff);
 	tlv_log->buff = NULL;
 	qdf_mem_free(tlv_log);
+	tlv_log = NULL;
 
 	return QDF_STATUS_SUCCESS;
 }

+ 16 - 4
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -376,7 +376,13 @@ dp_mon_record_index_update(struct dp_mon_pdev_be *mon_pdev_be) {
 	struct dp_mon_tlv_logger *tlv_log = NULL;
 	struct dp_mon_tlv_info *tlv_info = NULL;
 
+	if (!mon_pdev_be || !(mon_pdev_be->rx_tlv_log))
+		return;
+
 	tlv_log = mon_pdev_be->rx_tlv_log;
+	if (!tlv_log->tlv_logging_enable || !(tlv_log->buff))
+		return;
+
 	tlv_info = (struct dp_mon_tlv_info *)tlv_log->buff;
 
 	(tlv_log->curr_ppdu_pos + 1 == MAX_NUM_PPDU_RECORD) ?
@@ -552,12 +558,18 @@ dp_mon_record_tlv(struct dp_mon_pdev_be *mon_pdev_be,
  */
 void
 dp_mon_record_clear_buffer(struct dp_mon_pdev_be *mon_pdev_be) {
-	struct dp_mon_tlv_logger *rx_tlv_log = NULL;
+	struct dp_mon_tlv_logger *tlv_log = NULL;
 	struct dp_mon_tlv_info *tlv_info = NULL;
 
-	rx_tlv_log = mon_pdev_be->rx_tlv_log;
-	tlv_info = (struct dp_mon_tlv_info *)rx_tlv_log->buff;
-	qdf_mem_zero(&tlv_info[rx_tlv_log->ppdu_start_idx],
+	if (!mon_pdev_be || !(mon_pdev_be->rx_tlv_log))
+		return;
+
+	tlv_log = mon_pdev_be->rx_tlv_log;
+	if (!tlv_log->tlv_logging_enable || !(tlv_log->buff))
+		return;
+
+	tlv_info = (struct dp_mon_tlv_info *)tlv_log->buff;
+	qdf_mem_zero(&tlv_info[tlv_log->ppdu_start_idx],
 		     MAX_TLVS_PER_PPDU * sizeof(struct dp_mon_tlv_info));
 }