]> www.infradead.org Git - users/willy/xarray.git/commitdiff
net: don't use input buffer of __dev_alloc_name() as a scratch space
authorJakub Kicinski <kuba@kernel.org>
Mon, 23 Oct 2023 15:23:41 +0000 (08:23 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 24 Oct 2023 20:02:58 +0000 (13:02 -0700)
Callers of __dev_alloc_name() want to pass dev->name as
the output buffer. Make __dev_alloc_name() not clobber
that buffer on failure, and remove the workarounds
in callers.

dev_alloc_name_ns() is now completely unnecessary.

The extra strscpy() added here will be gone by the end
of the patch series.

Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Link: https://lore.kernel.org/r/20231023152346.3639749-2-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/dev.c

index 1025dc79bc49e1a46c7bdbded86438eb06c8e9fa..874c7daa81f54583a8faebfa06a0b9f61932216c 100644 (file)
@@ -1057,7 +1057,7 @@ EXPORT_SYMBOL(dev_valid_name);
  *     __dev_alloc_name - allocate a name for a device
  *     @net: network namespace to allocate the device name in
  *     @name: name format string
- *     @buf:  scratch buffer and result name string
+ *     @res: result name string
  *
  *     Passed a format string - eg "lt%d" it will try and find a suitable
  *     id. It scans list of devices to build up a free map, then chooses
@@ -1068,13 +1068,14 @@ EXPORT_SYMBOL(dev_valid_name);
  *     Returns the number of the unit assigned or a negative errno code.
  */
 
-static int __dev_alloc_name(struct net *net, const char *name, char *buf)
+static int __dev_alloc_name(struct net *net, const char *name, char *res)
 {
        int i = 0;
        const char *p;
        const int max_netdevices = 8*PAGE_SIZE;
        unsigned long *inuse;
        struct net_device *d;
+       char buf[IFNAMSIZ];
 
        if (!dev_valid_name(name))
                return -EINVAL;
@@ -1124,8 +1125,10 @@ static int __dev_alloc_name(struct net *net, const char *name, char *buf)
        }
 
        snprintf(buf, IFNAMSIZ, name, i);
-       if (!netdev_name_in_use(net, buf))
+       if (!netdev_name_in_use(net, buf)) {
+               strscpy(res, buf, IFNAMSIZ);
                return i;
+       }
 
        /* It is possible to run out of possible slots
         * when the name is long and there isn't enough space left
@@ -1154,20 +1157,6 @@ static int dev_prep_valid_name(struct net *net, struct net_device *dev,
        return 0;
 }
 
-static int dev_alloc_name_ns(struct net *net,
-                            struct net_device *dev,
-                            const char *name)
-{
-       char buf[IFNAMSIZ];
-       int ret;
-
-       BUG_ON(!net);
-       ret = __dev_alloc_name(net, name, buf);
-       if (ret >= 0)
-               strscpy(dev->name, buf, IFNAMSIZ);
-       return ret;
-}
-
 /**
  *     dev_alloc_name - allocate a name for a device
  *     @dev: device
@@ -1184,20 +1173,14 @@ static int dev_alloc_name_ns(struct net *net,
 
 int dev_alloc_name(struct net_device *dev, const char *name)
 {
-       return dev_alloc_name_ns(dev_net(dev), dev, name);
+       return __dev_alloc_name(dev_net(dev), name, dev->name);
 }
 EXPORT_SYMBOL(dev_alloc_name);
 
 static int dev_get_valid_name(struct net *net, struct net_device *dev,
                              const char *name)
 {
-       char buf[IFNAMSIZ];
-       int ret;
-
-       ret = dev_prep_valid_name(net, dev, name, buf);
-       if (ret >= 0)
-               strscpy(dev->name, buf, IFNAMSIZ);
-       return ret;
+       return dev_prep_valid_name(net, dev, name, dev->name);
 }
 
 /**