Commit 4b7ca501 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

init: add an init_chroot helper



Add a simple helper to chroot with a kernel space file name and switch
the early init code over to it.  Remove the now unused ksys_chroot.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent db63f1e3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -413,7 +413,7 @@ static int __init devtmpfs_setup(void *p)
	if (err)
		goto out;
	init_chdir("/.."); /* will traverse into overmounted root */
	ksys_chroot(".");
	init_chroot(".");
out:
	*(int *)p = err;
	complete(&setup_done);
+24 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
#include <linux/fs.h>
#include <linux/fs_struct.h>
#include <linux/init_syscalls.h>
#include <linux/security.h>
#include "internal.h"

int __init init_mount(const char *dev_name, const char *dir_name,
@@ -54,6 +55,29 @@ int __init init_chdir(const char *filename)
	return error;
}

int __init init_chroot(const char *filename)
{
	struct path path;
	int error;

	error = kern_path(filename, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path);
	if (error)
		return error;
	error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR);
	if (error)
		goto dput_and_out;
	error = -EPERM;
	if (!ns_capable(current_user_ns(), CAP_SYS_CHROOT))
		goto dput_and_out;
	error = security_path_chroot(&path);
	if (error)
		goto dput_and_out;
	set_fs_root(current->fs, &path);
dput_and_out:
	path_put(&path);
	return error;
}

int __init init_unlink(const char *pathname)
{
	return do_unlinkat(AT_FDCWD, getname_kernel(pathname));
+1 −6
Original line number Diff line number Diff line
@@ -530,7 +530,7 @@ out:
	return error;
}

int ksys_chroot(const char __user *filename)
SYSCALL_DEFINE1(chroot, const char __user *, filename)
{
	struct path path;
	int error;
@@ -563,11 +563,6 @@ out:
	return error;
}

SYSCALL_DEFINE1(chroot, const char __user *, filename)
{
	return ksys_chroot(filename);
}

static int chmod_common(const struct path *path, umode_t mode)
{
	struct inode *inode = path->dentry->d_inode;
+1 −0
Original line number Diff line number Diff line
@@ -4,5 +4,6 @@ int __init init_mount(const char *dev_name, const char *dir_name,
		const char *type_page, unsigned long flags, void *data_page);
int __init init_umount(const char *name, int flags);
int __init init_chdir(const char *filename);
int __init init_chroot(const char *filename);
int __init init_unlink(const char *pathname);
int __init init_rmdir(const char *pathname);
+0 −2
Original line number Diff line number Diff line
@@ -1235,8 +1235,6 @@ asmlinkage long sys_ni_syscall(void);
 * Instead, use one of the functions which work equivalently, such as
 * the ksys_xyzyyz() functions prototyped below.
 */

int ksys_chroot(const char __user *filename);
ssize_t ksys_write(unsigned int fd, const char __user *buf, size_t count);
int ksys_fchown(unsigned int fd, uid_t user, gid_t group);
ssize_t ksys_read(unsigned int fd, char __user *buf, size_t count);
Loading