mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-22 20:30:58 +02:00
convert setns(2) to fdget()/fdput()
Reviewed-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -545,21 +545,20 @@ static void commit_nsset(struct nsset *nsset)
|
|||||||
|
|
||||||
SYSCALL_DEFINE2(setns, int, fd, int, flags)
|
SYSCALL_DEFINE2(setns, int, fd, int, flags)
|
||||||
{
|
{
|
||||||
struct file *file;
|
struct fd f = fdget(fd);
|
||||||
struct ns_common *ns = NULL;
|
struct ns_common *ns = NULL;
|
||||||
struct nsset nsset = {};
|
struct nsset nsset = {};
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
file = fget(fd);
|
if (!f.file)
|
||||||
if (!file)
|
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
if (proc_ns_file(file)) {
|
if (proc_ns_file(f.file)) {
|
||||||
ns = get_proc_ns(file_inode(file));
|
ns = get_proc_ns(file_inode(f.file));
|
||||||
if (flags && (ns->ops->type != flags))
|
if (flags && (ns->ops->type != flags))
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
flags = ns->ops->type;
|
flags = ns->ops->type;
|
||||||
} else if (!IS_ERR(pidfd_pid(file))) {
|
} else if (!IS_ERR(pidfd_pid(f.file))) {
|
||||||
err = check_setns_flags(flags);
|
err = check_setns_flags(flags);
|
||||||
} else {
|
} else {
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
@@ -571,17 +570,17 @@ SYSCALL_DEFINE2(setns, int, fd, int, flags)
|
|||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (proc_ns_file(file))
|
if (proc_ns_file(f.file))
|
||||||
err = validate_ns(&nsset, ns);
|
err = validate_ns(&nsset, ns);
|
||||||
else
|
else
|
||||||
err = validate_nsset(&nsset, file->private_data);
|
err = validate_nsset(&nsset, f.file->private_data);
|
||||||
if (!err) {
|
if (!err) {
|
||||||
commit_nsset(&nsset);
|
commit_nsset(&nsset);
|
||||||
perf_event_namespaces(current);
|
perf_event_namespaces(current);
|
||||||
}
|
}
|
||||||
put_nsset(&nsset);
|
put_nsset(&nsset);
|
||||||
out:
|
out:
|
||||||
fput(file);
|
fdput(f);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user