get_net_ns_by_fd() oopses if proc_ns_fget() returns an error
BTW, looking through the code related to struct net lifetime rules has caught something else: struct net *get_net_ns_by_fd(int fd) { ... file = proc_ns_fget(fd); if (!file) goto out; ei = PROC_I(file->f_dentry->d_inode); while in proc_ns_fget() we have two return ERR_PTR(...) and not a single path that would return NULL. The other caller of proc_ns_fget() treats ERR_PTR() correctly... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
23c79d31a3
commit
c316e6a308
@ -310,19 +310,17 @@ struct net *get_net_ns_by_fd(int fd)
|
||||
struct file *file;
|
||||
struct net *net;
|
||||
|
||||
net = ERR_PTR(-EINVAL);
|
||||
file = proc_ns_fget(fd);
|
||||
if (!file)
|
||||
goto out;
|
||||
if (IS_ERR(file))
|
||||
return ERR_CAST(file);
|
||||
|
||||
ei = PROC_I(file->f_dentry->d_inode);
|
||||
if (ei->ns_ops != &netns_operations)
|
||||
goto out;
|
||||
if (ei->ns_ops == &netns_operations)
|
||||
net = get_net(ei->ns);
|
||||
else
|
||||
net = ERR_PTR(-EINVAL);
|
||||
|
||||
net = get_net(ei->ns);
|
||||
out:
|
||||
if (file)
|
||||
fput(file);
|
||||
fput(file);
|
||||
return net;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user