diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index cb67e59bffb5..0b4bbaeb714e 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -5805,6 +5805,12 @@ QDF_STATUS hdd_reset_all_adapters(struct hdd_context *hdd_ctx) WLAN_HDD_GET_SAP_CTX_PTR(adapter)); } + /* Release vdev ref count to avoid vdev object leak */ + if (adapter->device_mode == QDF_P2P_GO_MODE || + adapter->device_mode == QDF_SAP_MODE) + wlansap_release_vdev_ref( + WLAN_HDD_GET_SAP_CTX_PTR(adapter)); + /* Delete connection peers if any to avoid peer object leaks */ if (adapter->device_mode == QDF_STA_MODE || adapter->device_mode == QDF_P2P_CLIENT_MODE) { diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h index 1695559c7d43..dcdb60883444 100644 --- a/core/sap/inc/sap_api.h +++ b/core/sap/inc/sap_api.h @@ -1303,6 +1303,14 @@ uint32_t wlansap_get_chan_width(struct sap_context *sap_ctx); */ QDF_STATUS wlansap_set_invalid_session(struct sap_context *sap_ctx); +/* + * wlansap_set_invalid_session() - Release vdev ref taken by sap context + * @sap_ctx: pointer to the SAP context + * + * Return: QDF_STATUS + */ +QDF_STATUS wlansap_release_vdev_ref(struct sap_context *sap_ctx); + /** * sap_get_cac_dur_dfs_region() - get cac duration and dfs region. * @sap_ctxt: sap context diff --git a/core/sap/src/sap_module.c b/core/sap/src/sap_module.c index 8c7035d8428c..faadb489fab8 100644 --- a/core/sap/src/sap_module.c +++ b/core/sap/src/sap_module.c @@ -2441,13 +2441,24 @@ QDF_STATUS wlansap_set_invalid_session(struct sap_context *sap_ctx) return QDF_STATUS_E_FAILURE; } - sap_release_vdev_ref(sap_ctx); - sap_ctx->sessionId = CSR_SESSION_ID_INVALID; return QDF_STATUS_SUCCESS; } +QDF_STATUS wlansap_release_vdev_ref(struct sap_context *sap_ctx) +{ + if (!sap_ctx) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid SAP pointer")); + return QDF_STATUS_E_FAILURE; + } + + sap_release_vdev_ref(sap_ctx); + + return QDF_STATUS_SUCCESS; +} + void wlansap_cleanup_cac_timer(struct sap_context *sap_ctx) { struct mac_context *mac;