[PATCH] eisa: virtual_root: fix reference leak on platform_device_register() failure

Guangshuo Li posted 1 patch 2 months ago
drivers/eisa/virtual_root.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
[PATCH] eisa: virtual_root: fix reference leak on platform_device_register() failure
Posted by Guangshuo Li 2 months ago
virtual_eisa_root_init() returns immediately when
platform_device_register(&eisa_root_dev) fails.

The call flow is:

  virtual_eisa_root_init()
    -> platform_device_register(&eisa_root_dev)
         -> device_initialize(&eisa_root_dev.dev)
         -> platform_device_add(&eisa_root_dev)

If platform_device_add() fails, virtual_eisa_root_init() returns the
error directly without dropping the device reference acquired by
device_initialize(), leading to a reference leak.

The issue was identified by a static analysis tool I developed and
confirmed by manual review. Fix this by calling platform_device_put()
when platform_device_register() fails.

Cc: stable@vger.kernel.org
Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
---
 drivers/eisa/virtual_root.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/eisa/virtual_root.c b/drivers/eisa/virtual_root.c
index cd9515d9d8f0..93261d2e3532 100644
--- a/drivers/eisa/virtual_root.c
+++ b/drivers/eisa/virtual_root.c
@@ -50,8 +50,11 @@ static int __init virtual_eisa_root_init (void)
 {
 	int r;
 
-	if ((r = platform_device_register (&eisa_root_dev)))
+	r = platform_device_register(&eisa_root_dev);
+	if (r) {
+		platform_device_put(&eisa_root_dev);
 		return r;
+	}
 
 	eisa_bus_root.force_probe = force_probe;
 
-- 
2.43.0