Re: [PATCH] watchdog: ixp4xx: fix reference leak on platform_device_register() failure

From: Guenter Roeck

Date: Sun Apr 19 2026 - 17:08:14 EST


On 4/19/26 13:22, Linus Walleij wrote:
Hi Guangshuo,

thanks for your patch!

On Mon, Apr 13, 2026 at 5:47 PM Guangshuo Li <lgs201920130244@xxxxxxxxx> wrote:

ixp4xx_timer_probe() directly returns the result of
platform_device_register(&ixp4xx_watchdog_device). When registration
fails, the embedded struct device in ixp4xx_watchdog_device has already
been initialized by device_initialize(), but the failure path does not
drop the device reference, leading to a reference leak.
(...)

- return platform_device_register(&ixp4xx_watchdog_device);
+ ret = platform_device_register(&ixp4xx_watchdog_device);
+ if (ret)
+ platform_device_put(&ixp4xx_watchdog_device);

If the problem in the description is indeed there, it seems the bug
is inside platform_device_register(), surely a function returning an
error code is supposed to clean up any resources it takes before
returning an error. It seems wrong to try to fix this in all the
consumers.


From platform_device_register():

/**
* platform_device_register - add a platform-level device
* @pdev: platform device we're adding
*
* NOTE: _Never_ directly free @pdev after calling this function, even if it
* returned an error! Always use platform_device_put() to give up the
* reference initialised in this function instead.
*/

Not that any code actually does that as far as I can see, but isn't
the above doing exactly what the comment suggests ?

Thanks,
Guenter