Commit 281117cc authored by Al Viro's avatar Al Viro
Browse files

convert setns(2) to fdget()/fdput()

parent fe15c26e
Loading
Loading
Loading
Loading
+8 −9
Original line number Original line Diff line number Diff line
@@ -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;
}
}