ソースを参照

qcacmn: Handle mem leak when ipa_register_ready_cb() fails

Currently g_instances_added is not decremented correctly
in scenarios where IPA callback fails. This prevents
freeing the g_ipa_config memory during deinit, causing a
memory leak. This change will ensure that the instance
count is decremented correctly as part of deinit
in both success and failure scenarios.

Change-Id: I40fd14f6f441d1314eebf8c5d33616c824398a6f
CRs-Fixed: 3472760
Namita Nair 2 年 前
コミット
e8dd9fd84a

+ 0 - 7
ipa/core/src/wlan_ipa_core.c

@@ -4374,13 +4374,6 @@ QDF_STATUS wlan_ipa_cleanup(struct wlan_ipa_priv *ipa_ctx)
 
 	gp_ipa = NULL;
 
-	/* Acquire lock */
-	ipa_init_deinit_lock();
-	if (g_instances_added)
-		g_instances_added--;
-	/* Unlock */
-	ipa_init_deinit_unlock();
-
 	ipa_ctx->handle_initialized = false;
 
 	return QDF_STATUS_SUCCESS;

+ 5 - 1
ipa/core/src/wlan_ipa_main.c

@@ -654,10 +654,14 @@ QDF_STATUS ipa_uc_ol_deinit(struct wlan_objmgr_pdev *pdev)
 
 	status = wlan_ipa_uc_ol_deinit(ipa_obj);
 	ipa_obj_cleanup(ipa_obj);
+
+out:
+	if (g_instances_added)
+		g_instances_added--;
+
 	if (!g_instances_added)
 		ipa_disable_register_cb();
 
-out:
 	ipa_init_deinit_unlock();
 	return status;
 }

+ 8 - 7
ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c

@@ -247,13 +247,6 @@ QDF_STATUS ipa_register_is_ipa_ready(struct wlan_objmgr_pdev *pdev)
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	/* Acquire lock */
-	ipa_init_deinit_lock();
-	g_instances_added++;
-	ipa_info("No. of instances added for IPA is %d", g_instances_added);
-	/* Unlock */
-	ipa_init_deinit_unlock();
-
 	ret = qdf_ipa_register_ipa_ready_cb(ipa_register_ready_cb,
 					    (void *)ipa_obj);
 	if (ret == -EEXIST) {
@@ -263,6 +256,14 @@ QDF_STATUS ipa_register_is_ipa_ready(struct wlan_objmgr_pdev *pdev)
 		ipa_err("Failed to check IPA readiness %d", ret);
 		return QDF_STATUS_E_FAILURE;
 	}
+
+	/* Acquire lock */
+	ipa_init_deinit_lock();
+	g_instances_added++;
+	ipa_info("No. of instances added for IPA is %d", g_instances_added);
+	/* Unlock */
+	ipa_init_deinit_unlock();
+
 	return QDF_STATUS_SUCCESS;
 }