diff -Nru a/net/core/dev.c b/net/core/dev.c --- a/net/core/dev.c Tue Jan 13 14:20:51 2004 +++ b/net/core/dev.c Tue Jan 13 14:20:51 2004 @@ -621,6 +621,21 @@ } /** + * dev_valid_name - check if name is okay for network device + * @name: name string + * + * Network device names need to be valid file names to + * to allow sysfs to work + */ +int dev_valid_name(const char *name) +{ + return !(*name == '\0' + || !strcmp(name, ".") + || !strcmp(name, "..") + || strchr(name, '/')); +} + +/** * dev_alloc_name - allocate a name for a device * @dev: device * @name: name format string @@ -2685,6 +2723,11 @@ ret = -EIO; goto out_err; } + } + + if (!dev_valid_name(dev->name)) { + ret = -EINVAL; + goto out_err; } dev->ifindex = dev_new_index(); diff -Nru a/net/core/dev.c b/net/core/dev.c --- a/net/core/dev.c Wed Jan 14 16:09:02 2004 +++ b/net/core/dev.c Wed Jan 14 16:09:02 2004 @@ -718,7 +718,7 @@ if (strchr(newname, '%')) { int err = dev_alloc_name(dev, newname); - if (err) + if (err < 0) return err; strcpy(newname, dev->name); }