procfs: fix error handling of proc_register()
proc_register() error paths are leaking inodes and directory refcounts. Signed-off-by: Debabrata Banerjee <dbanerje@akamai.com> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
710585d492
commit
b208d54b75
|
@ -369,15 +369,22 @@ static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp
|
|||
dp->proc_iops = &proc_file_inode_operations;
|
||||
} else {
|
||||
WARN_ON(1);
|
||||
proc_free_inum(dp->low_ino);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
spin_lock(&proc_subdir_lock);
|
||||
dp->parent = dir;
|
||||
if (pde_subdir_insert(dir, dp) == false)
|
||||
if (pde_subdir_insert(dir, dp) == false) {
|
||||
WARN(1, "proc_dir_entry '%s/%s' already registered\n",
|
||||
dir->name, dp->name);
|
||||
spin_unlock(&proc_subdir_lock);
|
||||
if (S_ISDIR(dp->mode))
|
||||
dir->nlink--;
|
||||
proc_free_inum(dp->low_ino);
|
||||
return -EEXIST;
|
||||
}
|
||||
spin_unlock(&proc_subdir_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue