1 diff -Nru a/net/core/dev.c b/net/core/dev.c
2 --- a/net/core/dev.c Tue Jan 13 14:20:51 2004
3 +++ b/net/core/dev.c Tue Jan 13 14:20:51 2004
8 + * dev_valid_name - check if name is okay for network device
11 + * Network device names need to be valid file names to
12 + * to allow sysfs to work
14 +int dev_valid_name(const char *name)
16 + return !(*name == '\0'
17 + || !strcmp(name, ".")
18 + || !strcmp(name, "..")
19 + || strchr(name, '/'));
23 * dev_alloc_name - allocate a name for a device
25 * @name: name format string
27 return -ENFILE; /* Over 100 of the things .. bail out! */
32 + * dev_change_name - change name of a device
34 + * @name: name (or format string) must be at least IFNAMSIZ
36 + * Change name of a device, can pass format strings "eth%d".
39 +int dev_change_name(struct net_device *dev, char *newname)
43 + if (dev->flags & IFF_UP)
46 + if (!dev_valid_name(newname))
49 + if (strchr(newname, '%')) {
50 + int err = dev_alloc_name(dev, newname);
53 + strcpy(newname, dev->name);
55 + else if (__dev_get_by_name(newname))
58 + strlcpy(dev->name, newname, IFNAMSIZ);
60 + class_device_rename(&dev->class_dev, dev->name);
61 + notifier_call_chain(&netdev_chain, NETDEV_CHANGENAME, dev);
66 * dev_alloc - allocate a network device and name
67 * @name: name format string
68 @@ -2359,20 +2409,8 @@
72 - if (dev->flags & IFF_UP)
74 ifr->ifr_newname[IFNAMSIZ-1] = '\0';
75 - if (__dev_get_by_name(ifr->ifr_newname))
77 - err = class_device_rename(&dev->class_dev,
80 - strlcpy(dev->name, ifr->ifr_newname, IFNAMSIZ);
82 - notifier_call_chain(&netdev_chain,
83 - NETDEV_CHANGENAME, dev);
86 + return dev_change_name(dev, ifr->ifr_newname);
89 * Unknown or private ioctl
95 if (!capable(CAP_NET_ADMIN))
97 dev_load(ifr.ifr_name);
100 case SIOCSIFHWBROADCAST:
104 case SIOCBONDENSLAVE:
105 case SIOCBONDRELEASE:
106 @@ -2685,6 +2723,11 @@
112 + if (!dev_valid_name(dev->name)) {
117 dev->ifindex = dev_new_index();