Commit 8d7ba71e authored by Kery Qi's avatar Kery Qi Committed by Jakub Kicinski
Browse files

rocker: fix memory leak in rocker_world_port_post_fini()



In rocker_world_port_pre_init(), rocker_port->wpriv is allocated with
kzalloc(wops->port_priv_size, GFP_KERNEL). However, in
rocker_world_port_post_fini(), the memory is only freed when
wops->port_post_fini callback is set:

    if (!wops->port_post_fini)
        return;
    wops->port_post_fini(rocker_port);
    kfree(rocker_port->wpriv);

Since rocker_ofdpa_ops does not implement port_post_fini callback
(it is NULL), the wpriv memory allocated for each port is never freed
when ports are removed. This leads to a memory leak of
sizeof(struct ofdpa_port) bytes per port on every device removal.

Fix this by always calling kfree(rocker_port->wpriv) regardless of
whether the port_post_fini callback exists.

Fixes: e420114e ("rocker: introduce worlds infrastructure")
Signed-off-by: default avatarKery Qi <qikeyu2017@gmail.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260123211030.2109-2-qikeyu2017@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 709bbb01
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -1524,8 +1524,7 @@ static void rocker_world_port_post_fini(struct rocker_port *rocker_port)
{
	struct rocker_world_ops *wops = rocker_port->rocker->wops;

	if (!wops->port_post_fini)
		return;
	if (wops->port_post_fini)
		wops->port_post_fini(rocker_port);
	kfree(rocker_port->wpriv);
}