From 673bd512f3e355ad40af549b6d4cf29f7b325fee Mon Sep 17 00:00:00 2001 From: Abhishek Singh Date: Tue, 14 Mar 2017 18:01:43 +0530 Subject: [PATCH] qcacmn: Fix QDF assert in wlan_abort_scan if vdev is NULL If vdev is NULL calling calling wlan_objmgr_vdev_release_ref cause assert. To fix avoid calling wlan_objmgr_vdev_release_ref if vdev is NULL. Change-Id: I8bd40ac27a6733177ac55c791c7c3ddfe5bbba30 CRs-Fixed: 1095299 --- os_if/linux/scan/src/wlan_cfg80211_scan.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c index fc7ba082505b..cc6875af69e9 100644 --- a/os_if/linux/scan/src/wlan_cfg80211_scan.c +++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c @@ -650,6 +650,7 @@ QDF_STATUS wlan_abort_scan(struct wlan_objmgr_pdev *pdev, osif_ctx = wlan_pdev_get_ospriv(pdev); if (!osif_ctx) { cfg80211_err("Failed to retrieve osif context"); + qdf_mem_free(req); return QDF_STATUS_E_FAILURE; } if (vdev_id == INVAL_VDEV_ID) @@ -659,6 +660,11 @@ QDF_STATUS wlan_abort_scan(struct wlan_objmgr_pdev *pdev, vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, WLAN_OSIF_ID); + if (!vdev) { + cfg80211_err("Failed get vdev"); + qdf_mem_free(req); + return QDF_STATUS_E_INVAL; + } scan_priv = osif_ctx->osif_scan; req->cancel_req.requester = scan_priv->req_id; req->vdev = vdev; @@ -674,6 +680,7 @@ QDF_STATUS wlan_abort_scan(struct wlan_objmgr_pdev *pdev, status = ucfg_scan_cancel(req); if (QDF_IS_STATUS_ERROR(status)) cfg80211_err("Cancel scan request failed"); + wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID); return status; @@ -684,7 +691,11 @@ int wlan_cfg80211_abort_scan(struct wlan_objmgr_pdev *pdev) uint8_t pdev_id; pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); - wlan_abort_scan(pdev, pdev_id, INVAL_VDEV_ID, INVAL_SCAN_ID); + + if (ucfg_scan_get_pdev_status(pdev) != + SCAN_NOT_IN_PROGRESS) + wlan_abort_scan(pdev, pdev_id, + INVAL_VDEV_ID, INVAL_SCAN_ID); return 0; } @@ -711,7 +722,10 @@ int wlan_vendor_abort_scan(struct wlan_objmgr_pdev *pdev, ret = wlan_get_scanid(pdev, &scan_id, cookie); if (ret != 0) return ret; - wlan_abort_scan(pdev, pdev_id, INVAL_VDEV_ID, scan_id); + if (ucfg_scan_get_pdev_status(pdev) != + SCAN_NOT_IN_PROGRESS) + wlan_abort_scan(pdev, pdev_id, + INVAL_VDEV_ID, scan_id); } return 0; }