Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: e420114eef4a ("rocker: introduce worlds infrastructure")
Signed-off-by: Kery Qi <qikeyu2017@gmail.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260123211030.2109-2-qikeyu2017@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Kery Qi and committed by
Jakub Kicinski
8d7ba71e 709bbb01

+2 -3
+2 -3
drivers/net/ethernet/rocker/rocker_main.c
··· 1524 1524 { 1525 1525 struct rocker_world_ops *wops = rocker_port->rocker->wops; 1526 1526 1527 - if (!wops->port_post_fini) 1528 - return; 1529 - wops->port_post_fini(rocker_port); 1527 + if (wops->port_post_fini) 1528 + wops->port_post_fini(rocker_port); 1530 1529 kfree(rocker_port->wpriv); 1531 1530 } 1532 1531