driver core: Use kasprintf() instead of fixed buffer formatting
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 21 Aug 2024 15:48:20 +0000 (18:48 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 22 Aug 2024 07:37:38 +0000 (15:37 +0800)
Improve readability and maintainability by replacing a hardcoded string
allocation and formatting by the use of the kasprintf() helper.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20240821154839.604259-3-andriy.shevchenko@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/core.c

index 54f10a8325f82ab599f7662d5168ac88ae8b5977..67f3da47f63cddbc2145132575c5dcebcbcf9e6f 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <linux/acpi.h>
 #include <linux/blkdev.h>
+#include <linux/cleanup.h>
 #include <linux/cpufreq.h>
 #include <linux/device.h>
 #include <linux/dma-map-ops.h> /* for dma_default_coherent */
@@ -563,24 +564,11 @@ static struct class devlink_class = {
 
 static int devlink_add_symlinks(struct device *dev)
 {
+       char *buf_con __free(kfree) = NULL, *buf_sup __free(kfree) = NULL;
        int ret;
-       size_t len;
        struct device_link *link = to_devlink(dev);
        struct device *sup = link->supplier;
        struct device *con = link->consumer;
-       char *buf;
-
-       len = max(strlen(dev_bus_name(sup)) + strlen(dev_name(sup)),
-                 strlen(dev_bus_name(con)) + strlen(dev_name(con)));
-       len += strlen(":");
-       /*
-        * we kzalloc() memory for symlink name of both supplier and
-        * consumer, so explicitly take into account both prefix.
-        */
-       len += max(strlen("supplier:"), strlen("consumer:")) + 1;
-       buf = kzalloc(len, GFP_KERNEL);
-       if (!buf)
-               return -ENOMEM;
 
        ret = sysfs_create_link(&link->link_dev.kobj, &sup->kobj, "supplier");
        if (ret)
@@ -590,58 +578,64 @@ static int devlink_add_symlinks(struct device *dev)
        if (ret)
                goto err_con;
 
-       snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
-       ret = sysfs_create_link(&sup->kobj, &link->link_dev.kobj, buf);
+       buf_con = kasprintf(GFP_KERNEL, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
+       if (!buf_con) {
+               ret = -ENOMEM;
+               goto err_con_dev;
+       }
+
+       ret = sysfs_create_link(&sup->kobj, &link->link_dev.kobj, buf_con);
        if (ret)
                goto err_con_dev;
 
-       snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
-       ret = sysfs_create_link(&con->kobj, &link->link_dev.kobj, buf);
+       buf_sup = kasprintf(GFP_KERNEL, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
+       if (!buf_sup) {
+               ret = -ENOMEM;
+               goto err_sup_dev;
+       }
+
+       ret = sysfs_create_link(&con->kobj, &link->link_dev.kobj, buf_sup);
        if (ret)
                goto err_sup_dev;
 
        goto out;
 
 err_sup_dev:
-       snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
-       sysfs_remove_link(&sup->kobj, buf);
+       sysfs_remove_link(&sup->kobj, buf_con);
 err_con_dev:
        sysfs_remove_link(&link->link_dev.kobj, "consumer");
 err_con:
        sysfs_remove_link(&link->link_dev.kobj, "supplier");
 out:
-       kfree(buf);
        return ret;
 }
 
 static void devlink_remove_symlinks(struct device *dev)
 {
+       char *buf_con __free(kfree) = NULL, *buf_sup __free(kfree) = NULL;
        struct device_link *link = to_devlink(dev);
-       size_t len;
        struct device *sup = link->supplier;
        struct device *con = link->consumer;
-       char *buf;
 
        sysfs_remove_link(&link->link_dev.kobj, "consumer");
        sysfs_remove_link(&link->link_dev.kobj, "supplier");
 
-       len = max(strlen(dev_bus_name(sup)) + strlen(dev_name(sup)),
-                 strlen(dev_bus_name(con)) + strlen(dev_name(con)));
-       len += strlen(":");
-       len += max(strlen("supplier:"), strlen("consumer:")) + 1;
-       buf = kzalloc(len, GFP_KERNEL);
-       if (!buf) {
-               WARN(1, "Unable to properly free device link symlinks!\n");
-               return;
-       }
-
        if (device_is_registered(con)) {
-               snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
-               sysfs_remove_link(&con->kobj, buf);
+               buf_sup = kasprintf(GFP_KERNEL, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
+               if (!buf_sup)
+                       goto out;
+               sysfs_remove_link(&con->kobj, buf_sup);
        }
-       snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
-       sysfs_remove_link(&sup->kobj, buf);
-       kfree(buf);
+
+       buf_con = kasprintf(GFP_KERNEL, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
+       if (!buf_con)
+               goto out;
+       sysfs_remove_link(&sup->kobj, buf_con);
+
+       return;
+
+out:
+       WARN(1, "Unable to properly free device link symlinks!\n");
 }
 
 static struct class_interface devlink_class_intf = {