Loading drivers/base/devtmpfs.c +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading fs/init.c +24 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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)); Loading fs/open.c +1 −6 Original line number Diff line number Diff line Loading @@ -530,7 +530,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) return error; } int ksys_chroot(const char __user *filename) SYSCALL_DEFINE1(chroot, const char __user *, filename) { struct path path; int error; Loading Loading @@ -563,11 +563,6 @@ int ksys_chroot(const char __user *filename) 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; Loading include/linux/init_syscalls.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); include/linux/syscalls.h +0 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
drivers/base/devtmpfs.c +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
fs/init.c +24 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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)); Loading
fs/open.c +1 −6 Original line number Diff line number Diff line Loading @@ -530,7 +530,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) return error; } int ksys_chroot(const char __user *filename) SYSCALL_DEFINE1(chroot, const char __user *, filename) { struct path path; int error; Loading Loading @@ -563,11 +563,6 @@ int ksys_chroot(const char __user *filename) 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; Loading
include/linux/init_syscalls.h +1 −0 Original line number Diff line number Diff line Loading @@ -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);
include/linux/syscalls.h +0 −2 Original line number Diff line number Diff line Loading @@ -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