uevent: don't pass envp_ext[] as format string in kobject_uevent_env()
[safe/jmp/linux-2.6] / lib / kobject.c
index ae6bb90..0487d1f 100644 (file)
@@ -397,6 +397,7 @@ int kobject_rename(struct kobject *kobj, const char *new_name)
 {
        int error = 0;
        const char *devpath = NULL;
+       const char *dup_name = NULL, *name;
        char *devpath_string = NULL;
        char *envp[2];
 
@@ -420,15 +421,27 @@ int kobject_rename(struct kobject *kobj, const char *new_name)
        envp[0] = devpath_string;
        envp[1] = NULL;
 
+       name = dup_name = kstrdup(new_name, GFP_KERNEL);
+       if (!name) {
+               error = -ENOMEM;
+               goto out;
+       }
+
        error = sysfs_rename_dir(kobj, new_name);
+       if (error)
+               goto out;
+
+       /* Install the new kobject name */
+       dup_name = kobj->name;
+       kobj->name = name;
 
        /* This function is mostly/only used for network interface.
         * Some hotplug package track interfaces by their name and
         * therefore want to know when the name is changed by the user. */
-       if (!error)
-               kobject_uevent_env(kobj, KOBJ_MOVE, envp);
+       kobject_uevent_env(kobj, KOBJ_MOVE, envp);
 
 out:
+       kfree(dup_name);
        kfree(devpath_string);
        kfree(devpath);
        kobject_put(kobj);