Преглед изворни кода

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
Abhishek Singh пре 8 година
родитељ
комит
673bd512f3
1 измењених фајлова са 16 додато и 2 уклоњено
  1. 16 2
      os_if/linux/scan/src/wlan_cfg80211_scan.c

+ 16 - 2
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;
 }