From e1b8602571d4e004c2699b81f72fa4c21d87dda5 Mon Sep 17 00:00:00 2001 From: Mohit Khanna Date: Fri, 12 Apr 2019 10:04:57 -0700 Subject: [PATCH] qcacld-3.0: Check vdev from CDP vdev_id API Check for validity of vdev obtained from the CDP cdp_get_vdev_from_vdev_id API. Change-Id: Ie7fb99a0e08135bd3f2cc6b63070a4bd72df943a CRs-Fixed: 2434583 --- components/ipa/core/src/wlan_ipa_core.c | 12 +++++++++--- core/hdd/src/wlan_hdd_assoc.c | 16 ++++++++++------ core/hdd/src/wlan_hdd_cfg80211.c | 16 ++++++++++------ core/hdd/src/wlan_hdd_ocb.c | 18 +++++++++++------- core/hdd/src/wlan_hdd_softap_tx_rx.c | 15 +++++++++++---- 5 files changed, 51 insertions(+), 26 deletions(-) diff --git a/components/ipa/core/src/wlan_ipa_core.c b/components/ipa/core/src/wlan_ipa_core.c index 71532f8a4126..5dda91238377 100644 --- a/components/ipa/core/src/wlan_ipa_core.c +++ b/components/ipa/core/src/wlan_ipa_core.c @@ -354,13 +354,15 @@ static enum wlan_ipa_forward_type wlan_ipa_intrabss_forward( if ((desc & FW_RX_DESC_FORWARD_M)) { void *vdev = cdp_get_vdev_from_vdev_id(soc, pdev, iface_ctx->session_id); + if (!vdev) + goto drop_pkt; + if (cdp_tx_desc_thresh_reached(soc, vdev)) { /* Drop the packet*/ ipa_ctx->stats.num_tx_fwd_err++; - dev_kfree_skb_any(skb); - ret = WLAN_IPA_FORWARD_PKT_DISCARD; - return ret; + goto drop_pkt; } + ipa_debug_rl("Forward packet to Tx (fw_desc=%d)", desc); ipa_ctx->ipa_tx_forward++; @@ -380,7 +382,11 @@ static enum wlan_ipa_forward_type wlan_ipa_intrabss_forward( ret = WLAN_IPA_FORWARD_PKT_LOCAL_STACK; } } + return ret; +drop_pkt: + dev_kfree_skb_any(skb); + ret = WLAN_IPA_FORWARD_PKT_DISCARD; return ret; } diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index c943d4488b0c..5d980cb6a4eb 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -2126,7 +2126,6 @@ QDF_STATUS hdd_roam_register_sta(struct hdd_adapter *adapter, (struct cdp_pdev *)pdev, adapter->vdev_id); if (!adapter->txrx_vdev) { - hdd_err("%s find vdev fail", __func__); return QDF_STATUS_E_FAILURE; } @@ -4020,6 +4019,7 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter, struct ol_txrx_ops txrx_ops; void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + struct cdp_vdev *txrx_vdev; /* * TDLS sta in BSS should be set as STA type TDLS and STA MAC should @@ -4039,12 +4039,16 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter, txrx_ops.rx.rx = hdd_rx_packet_cbk; txrx_ops.rx.rx_stack = NULL; } + txrx_vdev = cdp_get_vdev_from_vdev_id(soc, + (struct cdp_pdev *)pdev, + adapter->vdev_id); + if (!txrx_vdev) + return QDF_STATUS_E_FAILURE; - cdp_vdev_register(soc, - (struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc, - (struct cdp_pdev *)pdev, adapter->vdev_id), - adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev, - &txrx_ops); + cdp_vdev_register(soc, txrx_vdev, + adapter, + (struct cdp_ctrl_objmgr_vdev *)adapter->vdev, + &txrx_ops); adapter->tx_fn = txrx_ops.tx.tx; txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info; diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 96b3bf1dfa97..0a8df1b12f5c 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -4470,6 +4470,7 @@ static int __wlan_hdd_cfg80211_handle_wisa_cmd(struct wiphy *wiphy, void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *pdev = cds_get_context(QDF_MODULE_ID_TXRX); mac_handle_t mac_handle; + struct cdp_vdev *txrx_vdev = NULL; hdd_enter_dev(dev); ret_val = wlan_hdd_validate_context(hdd_ctx); @@ -4503,12 +4504,15 @@ static int __wlan_hdd_cfg80211_handle_wisa_cmd(struct wiphy *wiphy, hdd_err("Unable to set WISA mode: %d to FW", wisa_mode); ret_val = -EINVAL; } - if (QDF_IS_STATUS_SUCCESS(status) || wisa_mode == false) - cdp_set_wisa_mode(soc, - (struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc, - (struct cdp_pdev *)pdev, - adapter->vdev_id), - wisa_mode); + if (QDF_IS_STATUS_SUCCESS(status) || !wisa_mode) { + txrx_vdev = cdp_get_vdev_from_vdev_id(soc, + (struct cdp_pdev *)pdev, + adapter->vdev_id); + if (!txrx_vdev) + ret_val = -EINVAL; + else + cdp_set_wisa_mode(soc, txrx_vdev, wisa_mode); + } err: hdd_exit(); return ret_val; diff --git a/core/hdd/src/wlan_hdd_ocb.c b/core/hdd/src/wlan_hdd_ocb.c index 5e2896a425cf..215dd288caf0 100644 --- a/core/hdd/src/wlan_hdd_ocb.c +++ b/core/hdd/src/wlan_hdd_ocb.c @@ -222,6 +222,7 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter) struct ol_txrx_ops txrx_ops; void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + struct cdp_vdev *vdev; qdf_status = cdp_peer_register_ocb_peer(soc, adapter->mac_addr.bytes, @@ -239,16 +240,19 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter) /* Register the vdev transmit and receive functions */ qdf_mem_zero(&txrx_ops, sizeof(txrx_ops)); txrx_ops.rx.rx = hdd_rx_packet_cbk; - cdp_vdev_register(soc, - (struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc, - (struct cdp_pdev *)pdev, adapter->vdev_id), - adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev, - &txrx_ops); + vdev = cdp_get_vdev_from_vdev_id(soc, + (struct cdp_pdev *)pdev, + adapter->vdev_id); + if (!vdev) + return -EINVAL; + + cdp_vdev_register(soc, vdev, adapter, + (struct cdp_ctrl_objmgr_vdev *)adapter->vdev, + &txrx_ops); txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info; adapter->tx_fn = txrx_ops.tx.tx; - qdf_status = cdp_peer_register(soc, - (struct cdp_pdev *)pdev, &sta_desc); + qdf_status = cdp_peer_register(soc, (struct cdp_pdev *)pdev, &sta_desc); if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { hdd_err("Failed to register. Status= %d [0x%08X]", qdf_status, qdf_status); diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c index 4526e221c4f1..8b1339802ef5 100644 --- a/core/hdd/src/wlan_hdd_softap_tx_rx.c +++ b/core/hdd/src/wlan_hdd_softap_tx_rx.c @@ -1013,6 +1013,7 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter, struct ol_txrx_ops txrx_ops; void *soc = cds_get_context(QDF_MODULE_ID_SOC); void *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + struct cdp_vdev *txrx_vdev = NULL; hdd_info("STA:%u, Auth:%u, Priv:%u, WMM:%u", sta_id, auth_required, privacy_required, wmm_enabled); @@ -1048,11 +1049,17 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter, txrx_ops.rx.rx_stack = NULL; } + txrx_vdev = cdp_get_vdev_from_vdev_id(soc, + (struct cdp_pdev *)pdev, + adapter->vdev_id); + if (!txrx_vdev) + return QDF_STATUS_E_FAILURE; + cdp_vdev_register(soc, - (struct cdp_vdev *)cdp_get_vdev_from_vdev_id(soc, - (struct cdp_pdev *)pdev, adapter->vdev_id), - adapter, (struct cdp_ctrl_objmgr_vdev *)adapter->vdev, - &txrx_ops); + txrx_vdev, + adapter, + (struct cdp_ctrl_objmgr_vdev *)adapter->vdev, + &txrx_ops); adapter->txrx_vdev = (void *)cdp_get_vdev_from_vdev_id(soc, (struct cdp_pdev *)pdev, adapter->vdev_id);