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,14 +369,21 @@ static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp
|
||||||
dp->proc_iops = &proc_file_inode_operations;
|
dp->proc_iops = &proc_file_inode_operations;
|
||||||
} else {
|
} else {
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
|
proc_free_inum(dp->low_ino);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock(&proc_subdir_lock);
|
spin_lock(&proc_subdir_lock);
|
||||||
dp->parent = dir;
|
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",
|
WARN(1, "proc_dir_entry '%s/%s' already registered\n",
|
||||||
dir->name, dp->name);
|
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);
|
spin_unlock(&proc_subdir_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue