]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
octeontx2-pf: fix double free in rvu_rep_rsrc_init()
authorDawei Feng <dawei.feng@seu.edu.cn>
Wed, 13 May 2026 15:13:20 +0000 (23:13 +0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 15 May 2026 01:18:09 +0000 (18:18 -0700)
rvu_rep_rsrc_init() allocates queue memory before calling
otx2_init_hw_resources(). When hardware resource setup fails,
otx2_init_hw_resources() already unwinds the partially initialized
SQ, CQ, and aura state before returning an error. The representor
error path then calls otx2_free_hw_resources() again and can free
the same resources a second time.

Fix this by splitting the cleanup labels so that a failure from
otx2_init_hw_resources() only releases queue memory. Keep the
otx2_free_hw_resources() call for failures that happen after
hardware resource initialization completed successfully.

The bug was first flagged by an experimental analysis tool we are
developing for kernel memory-management bugs while analyzing
v6.13-rc1. The tool is still under development and is not yet publicly
available. Manual inspection confirms that the bug is still
present in v7.1-rc3.

Runtime validation was not performed because reproducing this path
requires OcteonTX2 representor hardware.

Fixes: 3937b7308d4f ("octeontx2-pf: Create representor netdev")
Cc: stable@vger.kernel.org # v6.13+
Signed-off-by: Zilin Guan <zilin@seu.edu.cn>
Signed-off-by: Dawei Feng <dawei.feng@seu.edu.cn>
Reviewed-by: Geetha sowjanya <gakula@marvell.com>
Link: https://patch.msgid.link/20260513151320.213260-1-dawei.feng@seu.edu.cn
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeontx2/nic/rep.c

index 94f155ffb17f0060e1d1fbba3916948e5578e3a1..0f5d5642d3f7a1350a278ac14e6e7f50eb902934 100644 (file)
@@ -609,7 +609,7 @@ static int rvu_rep_rsrc_init(struct otx2_nic *priv)
 
        err = otx2_init_hw_resources(priv);
        if (err)
-               goto err_free_rsrc;
+               goto err_free_mem;
 
        /* Set maximum frame size allowed in HW */
        err = otx2_hw_set_mtu(priv, priv->hw.max_mtu);
@@ -621,6 +621,7 @@ static int rvu_rep_rsrc_init(struct otx2_nic *priv)
 
 err_free_rsrc:
        otx2_free_hw_resources(priv);
+err_free_mem:
        otx2_free_queue_mem(qset);
        return err;
 }