From: Cornelia Huck Make make_class_name() return NULL on error and fixup callers in the driver core. Signed-off-by: Cornelia Huck Cc: Greg KH Signed-off-by: Andrew Morton --- drivers/base/class.c | 21 +++++++++++++-------- drivers/base/core.c | 14 ++++++++++---- 2 files changed, 23 insertions(+), 12 deletions(-) diff -puN drivers/base/class.c~driver-core-fixes-make_class_name-retval-check drivers/base/class.c --- a/drivers/base/class.c~driver-core-fixes-make_class_name-retval-check +++ a/drivers/base/class.c @@ -515,7 +515,7 @@ char *make_class_name(const char *name, class_name = kmalloc(size, GFP_KERNEL); if (!class_name) - return ERR_PTR(-ENOMEM); + return NULL; strcpy(class_name, name); strcat(class_name, ":"); @@ -601,8 +601,11 @@ int class_device_add(struct class_device if (class_dev->dev) { class_name = make_class_name(class_dev->class->name, &class_dev->kobj); - error = sysfs_create_link(&class_dev->kobj, - &class_dev->dev->kobj, "device"); + if (class_name) + error = sysfs_create_link(&class_dev->kobj, + &class_dev->dev->kobj, "device"); + else + error = -ENOMEM; if (error) goto out6; error = sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj, @@ -726,7 +729,6 @@ void class_device_del(struct class_devic struct class *parent_class = class_dev->class; struct class_device *parent_device = class_dev->parent; struct class_interface *class_intf; - char *class_name = NULL; if (parent_class) { down(&parent_class->sem); @@ -738,10 +740,12 @@ void class_device_del(struct class_devic } if (class_dev->dev) { - class_name = make_class_name(class_dev->class->name, + char *class_name = make_class_name(class_dev->class->name, &class_dev->kobj); sysfs_remove_link(&class_dev->kobj, "device"); - sysfs_remove_link(&class_dev->dev->kobj, class_name); + if (class_name) + sysfs_remove_link(&class_dev->dev->kobj, class_name); + kfree(class_name); } sysfs_remove_link(&class_dev->kobj, "subsystem"); class_device_remove_file(class_dev, &class_dev->uevent_attr); @@ -755,7 +759,6 @@ void class_device_del(struct class_devic class_device_put(parent_device); class_put(parent_class); - kfree(class_name); } void class_device_unregister(struct class_device *class_dev) @@ -817,7 +820,9 @@ int class_device_rename(struct class_dev &class_dev->kobj); sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj, new_class_name); - sysfs_remove_link(&class_dev->dev->kobj, old_class_name); + if (old_class_name) + sysfs_remove_link(&class_dev->dev->kobj, + old_class_name); } class_device_put(class_dev); diff -puN drivers/base/core.c~driver-core-fixes-make_class_name-retval-check drivers/base/core.c --- a/drivers/base/core.c~driver-core-fixes-make_class_name-retval-check +++ a/drivers/base/core.c @@ -464,9 +464,13 @@ int device_add(struct device *dev) sysfs_create_link(&dev->class->subsys.kset.kobj, &dev->kobj, dev->bus_id); if (parent) { - sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device"); - class_name = make_class_name(dev->class->name, &dev->kobj); - sysfs_create_link(&dev->parent->kobj, &dev->kobj, class_name); + sysfs_create_link(&dev->kobj, &dev->parent->kobj, + "device"); + class_name = make_class_name(dev->class->name, + &dev->kobj); + if (class_name) + sysfs_create_link(&dev->parent->kobj, + &dev->kobj, class_name); } } @@ -600,7 +604,9 @@ void device_del(struct device * dev) class_name = make_class_name(dev->class->name, &dev->kobj); if (parent) { sysfs_remove_link(&dev->kobj, "device"); - sysfs_remove_link(&dev->parent->kobj, class_name); + if (class_name) + sysfs_remove_link(&dev->parent->kobj, + class_name); } kfree(class_name); down(&dev->class->sem); _