Kaynağa Gözat

qcacld-3.0: Acquire mutex before accessing tdls context

peer_list is a parameter for tdls_ctx, so every access to
peer_list should be protected with mutex lock.

This change refactors the code for function __wlan_hdd
_cfg80211_configure_tdls_mode(), wlan_hdd_tdls_set_params()
and wlan_hdd_update_tdls_info().

Change-Id: I03d4d74356ff6401772c69a7686352783cf22b6b
CRs-Fixed: 1106726
Nitesh Shah 8 yıl önce
ebeveyn
işleme
4ea2715f34
1 değiştirilmiş dosya ile 29 ekleme ve 19 silme
  1. 29 19
      core/hdd/src/wlan_hdd_tdls.c

+ 29 - 19
core/hdd/src/wlan_hdd_tdls.c

@@ -1791,16 +1791,11 @@ int wlan_hdd_tdls_set_params(struct net_device *dev,
 {
 	hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
 	hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
-	tdlsCtx_t *pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
+	tdlsCtx_t *pHddTdlsCtx;
 	eTDLSSupportMode req_tdls_mode;
 	tdlsInfo_t *tdlsParams;
 	QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
 
-	if (NULL == pHddTdlsCtx) {
-		hdd_err("TDLS not enabled!");
-		return -EINVAL;
-	}
-
 	if (wlan_hdd_tdls_check_config(config) != 0) {
 		return -EINVAL;
 	}
@@ -1812,6 +1807,15 @@ int wlan_hdd_tdls_set_params(struct net_device *dev,
 		return -EINVAL;
 	}
 
+	mutex_lock(&pHddCtx->tdls_lock);
+
+	pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
+	if (NULL == pHddTdlsCtx) {
+		mutex_unlock(&pHddCtx->tdls_lock);
+		hdd_err("pHddTdlsCtx is NULL");
+			return -EINVAL;
+	}
+
 	/* copy the configuration only when given tdls mode is implicit trigger enable */
 	if (eTDLS_SUPPORT_ENABLED == req_tdls_mode ||
 	    eTDLS_SUPPORT_EXTERNAL_CONTROL == req_tdls_mode) {
@@ -1819,6 +1823,8 @@ int wlan_hdd_tdls_set_params(struct net_device *dev,
 		       sizeof(tdls_config_params_t));
 	}
 
+	mutex_unlock(&pHddCtx->tdls_lock);
+
 	hdd_err("iw set tdls params: %d %d %d %d %d %d %d",
 		config->tdls,
 		config->tx_period_t,
@@ -1921,16 +1927,10 @@ void wlan_hdd_update_tdls_info(hdd_adapter_t *adapter, bool tdls_prohibited,
 				bool tdls_chan_swit_prohibited)
 {
 	hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
-	tdlsCtx_t *hdd_tdls_ctx = WLAN_HDD_GET_TDLS_CTX_PTR(adapter);
+	tdlsCtx_t *hdd_tdls_ctx;
 	tdlsInfo_t *tdls_param;
 	QDF_STATUS qdf_ret_status = QDF_STATUS_E_FAILURE;
 
-	if (!hdd_tdls_ctx) {
-		/* may be TDLS is not applicable for this adapter */
-		hdd_err("HDD TDLS context is null");
-		goto done;
-	}
-
 	/* If TDLS support is disabled then no need to update target */
 	if (false == hdd_ctx->config->fEnableTDLSSupport) {
 		hdd_err("TDLS not enabled");
@@ -1942,6 +1942,14 @@ void wlan_hdd_update_tdls_info(hdd_adapter_t *adapter, bool tdls_prohibited,
 
 	mutex_lock(&hdd_ctx->tdls_lock);
 
+	hdd_tdls_ctx = WLAN_HDD_GET_TDLS_CTX_PTR(adapter);
+	if (!hdd_tdls_ctx) {
+		mutex_unlock(&hdd_ctx->tdls_lock);
+		/* may be TDLS is not applicable for this adapter */
+		hdd_err("HDD TDLS context is null");
+		goto done;
+	}
+
 	if (hdd_ctx->set_state_info.set_state_cnt == 0 &&
 	    tdls_prohibited) {
 		mutex_unlock(&hdd_ctx->tdls_lock);
@@ -1991,8 +1999,6 @@ void wlan_hdd_update_tdls_info(hdd_adapter_t *adapter, bool tdls_prohibited,
 		tdls_param->vdev_id = adapter->sessionId;
 	}
 
-	mutex_unlock(&hdd_ctx->tdls_lock);
-
 	tdls_param->tdls_state = hdd_ctx->tdls_mode;
 	tdls_param->notification_interval_ms =
 	hdd_tdls_ctx->threshold_config.tx_period_t;
@@ -2006,6 +2012,8 @@ void wlan_hdd_update_tdls_info(hdd_adapter_t *adapter, bool tdls_prohibited,
 
 	tdls_param->tdls_options = 0;
 
+	mutex_unlock(&hdd_ctx->tdls_lock);
+
 	/* Do not enable TDLS offchannel, if AP prohibited TDLS channel switch */
 	if ((hdd_ctx->config->fEnableTDLSOffChannel) &&
 	    (!tdls_chan_swit_prohibited)) {
@@ -3435,10 +3443,6 @@ __wlan_hdd_cfg80211_configure_tdls_mode(struct wiphy *wiphy,
 	if (NULL == adapter)
 		return -EINVAL;
 
-	hdd_tdls_ctx = adapter->sessionCtx.station.pHddTdlsCtx;
-	if (NULL == hdd_tdls_ctx)
-		return -EINVAL;
-
 	if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TDLS_CONFIG_MAX,
 		      data, data_len,
 		      wlan_hdd_tdls_mode_configuration_policy)) {
@@ -3472,6 +3476,12 @@ __wlan_hdd_cfg80211_configure_tdls_mode(struct wiphy *wiphy,
 
 	mutex_lock(&hdd_ctx->tdls_lock);
 
+	hdd_tdls_ctx = adapter->sessionCtx.station.pHddTdlsCtx;
+	if (NULL == hdd_tdls_ctx) {
+		mutex_unlock(&hdd_ctx->tdls_lock);
+		return -EINVAL;
+	}
+
 	if (tb[QCA_WLAN_VENDOR_ATTR_TDLS_CONFIG_TX_STATS_PERIOD]) {
 		hdd_tdls_ctx->threshold_config.tx_period_t = nla_get_u32(
 			tb[QCA_WLAN_VENDOR_ATTR_TDLS_CONFIG_TX_STATS_PERIOD]);