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

staging: pi433: fix memory leak with using debugfs_lookup()

When calling debugfs_lookup() the result must have dput() called on it,
otherwise the memory will leak over time. To make things simpler, just
call debugfs_lookup_and_remove() instead which handles all of the logic
at once. This requires saving off the root directory dentry to make
creation of individual device subdirectories easier.

Cc: Paulo Miguel Almeida <paulo.miguel.almeida.rodenas@gmail.com>
Cc: Dan Carpenter <error27@gmail.com>
Cc: Sidong Yang <realwakka@gmail.com>
Cc: Liu Shixin <liushixin2@huawei.com>
Cc: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Link: https://lore.kernel.org/r/20230202141138.2291946-1-gregkh@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

+5 -6
+5 -6
drivers/staging/pi433/pi433_if.c
··· 55 55 static dev_t pi433_dev; 56 56 static DEFINE_IDR(pi433_idr); 57 57 static DEFINE_MUTEX(minor_lock); /* Protect idr accesses */ 58 + static struct dentry *root_dir; /* debugfs root directory for the driver */ 58 59 59 60 static struct class *pi433_class; /* mainly for udev to create /dev/pi433 */ 60 61 ··· 1307 1306 /* spi setup */ 1308 1307 spi_set_drvdata(spi, device); 1309 1308 1310 - entry = debugfs_create_dir(dev_name(device->dev), 1311 - debugfs_lookup(KBUILD_MODNAME, NULL)); 1309 + entry = debugfs_create_dir(dev_name(device->dev), root_dir); 1312 1310 debugfs_create_file("regs", 0400, entry, device, &pi433_debugfs_regs_fops); 1313 1311 1314 1312 return 0; ··· 1333 1333 static void pi433_remove(struct spi_device *spi) 1334 1334 { 1335 1335 struct pi433_device *device = spi_get_drvdata(spi); 1336 - struct dentry *mod_entry = debugfs_lookup(KBUILD_MODNAME, NULL); 1337 1336 1338 - debugfs_remove(debugfs_lookup(dev_name(device->dev), mod_entry)); 1337 + debugfs_lookup_and_remove(dev_name(device->dev), root_dir); 1339 1338 1340 1339 /* free GPIOs */ 1341 1340 free_gpio(device); ··· 1407 1408 return PTR_ERR(pi433_class); 1408 1409 } 1409 1410 1410 - debugfs_create_dir(KBUILD_MODNAME, NULL); 1411 + root_dir = debugfs_create_dir(KBUILD_MODNAME, NULL); 1411 1412 1412 1413 status = spi_register_driver(&pi433_spi_driver); 1413 1414 if (status < 0) { ··· 1426 1427 spi_unregister_driver(&pi433_spi_driver); 1427 1428 class_destroy(pi433_class); 1428 1429 unregister_chrdev(MAJOR(pi433_dev), pi433_spi_driver.driver.name); 1429 - debugfs_remove_recursive(debugfs_lookup(KBUILD_MODNAME, NULL)); 1430 + debugfs_remove(root_dir); 1430 1431 } 1431 1432 module_exit(pi433_exit); 1432 1433