From: Eric Rannaud add_uevent_var() is used w/o checking for its return value, even though it is possible for those calls to return -ENOMEM. Signed-off-by: Eric Rannaud Cc: Greg KH Signed-off-by: Andrew Morton --- drivers/base/core.c | 89 ++++++++++++++++++++++++++---------------- 1 files changed, 57 insertions(+), 32 deletions(-) diff -puN drivers/base/core.c~uevent-improve-error-checking-and-handling drivers/base/core.c --- a/drivers/base/core.c~uevent-improve-error-checking-and-handling +++ a/drivers/base/core.c @@ -162,18 +162,25 @@ static int dev_uevent(struct kset *kset, /* add the major/minor if present */ if (MAJOR(dev->devt)) { - add_uevent_var(envp, num_envp, &i, - buffer, buffer_size, &length, - "MAJOR=%u", MAJOR(dev->devt)); - add_uevent_var(envp, num_envp, &i, - buffer, buffer_size, &length, - "MINOR=%u", MINOR(dev->devt)); + retval = add_uevent_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "MAJOR=%u", MAJOR(dev->devt)); + if (retval) + return retval; + retval = add_uevent_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "MINOR=%u", MINOR(dev->devt)); + if (retval) + return retval; } - if (dev->driver) - add_uevent_var(envp, num_envp, &i, - buffer, buffer_size, &length, - "DRIVER=%s", dev->driver->name); + if (dev->driver) { + retval = add_uevent_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "DRIVER=%s", dev->driver->name); + if (retval) + return retval; + } #ifdef CONFIG_SYSFS_DEPRECATED if (dev->class) { @@ -186,29 +193,41 @@ static int dev_uevent(struct kset *kset, const char *path; path = kobject_get_path(&parent->kobj, GFP_KERNEL); - add_uevent_var(envp, num_envp, &i, - buffer, buffer_size, &length, - "PHYSDEVPATH=%s", path); + retval = add_uevent_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "PHYSDEVPATH=%s", path); kfree(path); + if (retval) + return retval; - add_uevent_var(envp, num_envp, &i, - buffer, buffer_size, &length, - "PHYSDEVBUS=%s", parent->bus->name); - - if (parent->driver) - add_uevent_var(envp, num_envp, &i, - buffer, buffer_size, &length, - "PHYSDEVDRIVER=%s", parent->driver->name); + retval = add_uevent_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "PHYSDEVBUS=%s", parent->bus->name); + if (retval) + return retval; + + if (parent->driver) { + retval = add_uevent_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "PHYSDEVDRIVER=%s", parent->driver->name); + if (retval) + return retval; + } } } else if (dev->bus) { - add_uevent_var(envp, num_envp, &i, - buffer, buffer_size, &length, - "PHYSDEVBUS=%s", dev->bus->name); + retval = add_uevent_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "PHYSDEVBUS=%s", dev->bus->name); + if (retval) + return retval; - if (dev->driver) - add_uevent_var(envp, num_envp, &i, - buffer, buffer_size, &length, - "PHYSDEVDRIVER=%s", dev->driver->name); + if (dev->driver) { + retval = add_uevent_var(envp, num_envp, &i, + buffer, buffer_size, &length, + "PHYSDEVDRIVER=%s", dev->driver->name); + if (retval) + return retval; + } } #endif @@ -222,27 +241,33 @@ static int dev_uevent(struct kset *kset, if (dev->bus && dev->bus->uevent) { /* have the bus specific function add its stuff */ retval = dev->bus->uevent(dev, envp, num_envp, buffer, buffer_size); - if (retval) + if (retval) { pr_debug ("%s: bus uevent() returned %d\n", __FUNCTION__, retval); + goto out; + } } if (dev->class && dev->class->dev_uevent) { /* have the class specific function add its stuff */ retval = dev->class->dev_uevent(dev, envp, num_envp, buffer, buffer_size); - if (retval) + if (retval) { pr_debug("%s: class uevent() returned %d\n", __FUNCTION__, retval); + goto out; + } } if (dev->type && dev->type->uevent) { /* have the device type specific fuction add its stuff */ retval = dev->type->uevent(dev, envp, num_envp, buffer, buffer_size); - if (retval) + if (retval) { pr_debug("%s: dev_type uevent() returned %d\n", __FUNCTION__, retval); + goto out; + } } - +out: return retval; } _