Thread (4 messages) 4 messages, 4 authors, 12d ago

Re: [PATCH net v2] net: ipa: fix SMEM state handle leaks in SMP2P init

From: Alex Elder <hidden>
Date: 2026-06-26 15:31:14
Also in: lkml, stable

On 6/24/26 1:59 AM, Haoxiang Li wrote:
ipa_smp2p_init() acquires two Qualcomm SMEM state handles with
qcom_smem_state_get(). However, neither the init error paths
nor ipa_smp2p_exit() release them.

Release both handles with qcom_smem_state_put() in the init
error paths and in ipa_smp2p_exit().

Fixes: 530f9216a953 ("soc: qcom: ipa: AP/modem communications")
Cc: stable@vger.kernel.org
Signed-off-by: Haoxiang Li <redacted>
This looks good.  Thank you for the fix.

Reviewed-by: Alex Elder <redacted>
quoted hunk ↗ jump to hunk
---
Changes in v2:
  - Use explicit qcom_smem_state_put() calls instead of devm helpers.
    Thanks, Alex! Thanks, Jakub!
---
  drivers/net/ipa/ipa_smp2p.c | 30 ++++++++++++++++++++++--------
  1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/drivers/net/ipa/ipa_smp2p.c b/drivers/net/ipa/ipa_smp2p.c
index 2f0ccdd937cc..331c00ad02c0 100644
--- a/drivers/net/ipa/ipa_smp2p.c
+++ b/drivers/net/ipa/ipa_smp2p.c
@@ -232,19 +232,27 @@ ipa_smp2p_init(struct ipa *ipa, struct platform_device *pdev, bool modem_init)
  					  &valid_bit);
  	if (IS_ERR(valid_state))
  		return PTR_ERR(valid_state);
-	if (valid_bit >= 32)		/* BITS_PER_U32 */
-		return -EINVAL;
+	if (valid_bit >= 32) {		/* BITS_PER_U32 */
+		ret = -EINVAL;
+		goto err_valid_state_put;
+	}
  
  	enabled_state = qcom_smem_state_get(dev, "ipa-clock-enabled",
  					    &enabled_bit);
-	if (IS_ERR(enabled_state))
-		return PTR_ERR(enabled_state);
-	if (enabled_bit >= 32)		/* BITS_PER_U32 */
-		return -EINVAL;
+	if (IS_ERR(enabled_state)) {
+		ret = PTR_ERR(enabled_state);
+		goto err_valid_state_put;
+	}
+	if (enabled_bit >= 32) {		/* BITS_PER_U32 */
+		ret = -EINVAL;
+		goto err_enabled_state_put;
+	}
  
  	smp2p = kzalloc_obj(*smp2p);
-	if (!smp2p)
-		return -ENOMEM;
+	if (!smp2p) {
+		ret = -ENOMEM;
+		goto err_enabled_state_put;
+	}
  
  	smp2p->ipa = ipa;
  
@@ -289,6 +297,10 @@ ipa_smp2p_init(struct ipa *ipa, struct platform_device *pdev, bool modem_init)
  	ipa->smp2p = NULL;
  	mutex_destroy(&smp2p->mutex);
  	kfree(smp2p);
+err_enabled_state_put:
+	qcom_smem_state_put(enabled_state);
+err_valid_state_put:
+	qcom_smem_state_put(valid_state);
  
  	return ret;
  }
@@ -305,6 +317,8 @@ void ipa_smp2p_exit(struct ipa *ipa)
  	ipa_smp2p_power_release(ipa);
  	ipa->smp2p = NULL;
  	mutex_destroy(&smp2p->mutex);
+	qcom_smem_state_put(smp2p->enabled_state);
+	qcom_smem_state_put(smp2p->valid_state);
  	kfree(smp2p);
  }
  
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help