sysfs: kill an extra put in sysfs_create_link() failure path
authorTejun Heo <htejun@gmail.com>
Wed, 18 Jul 2007 07:14:45 +0000 (16:14 +0900)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 18 Jul 2007 22:49:50 +0000 (15:49 -0700)
There is a subtle bug in sysfs_create_link() failure path.  When
symlink creation fails because there's already a node with the same
name, the target sysfs_dirent is put twice - once by failure path of
sysfs_create_link() and once more when the symlink is released.

Fix it by making only the symlink node responsible for putting
target_sd.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Cc: Gabriel C <nix.or.die@googlemail.com>
Cc: Miles Lane <miles.lane@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fs/sysfs/symlink.c

index 2f86e04222907b2c19aab03adf6d2f2cabe092d1..d056e9695cd69d43c24ef47759ece7ecd27c8fce 100644 (file)
@@ -86,7 +86,9 @@ int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char
        sd = sysfs_new_dirent(name, S_IFLNK|S_IRWXUGO, SYSFS_KOBJ_LINK);
        if (!sd)
                goto out_put;
+
        sd->s_elem.symlink.target_sd = target_sd;
+       target_sd = NULL;       /* reference is now owned by the symlink */
 
        sysfs_addrm_start(&acxt, parent_sd);