Loading drivers/base/devtmpfs.c +1 −1 Original line number Diff line number Diff line Loading @@ -412,7 +412,7 @@ static int __init devtmpfs_setup(void *p) err = init_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL); if (err) goto out; ksys_chdir("/.."); /* will traverse into overmounted root */ init_chdir("/.."); /* will traverse into overmounted root */ ksys_chroot("."); out: *(int *)p = err; Loading fs/init.c +16 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ #include <linux/mount.h> #include <linux/namei.h> #include <linux/fs.h> #include <linux/fs_struct.h> #include <linux/init_syscalls.h> #include "internal.h" Loading Loading @@ -38,6 +39,21 @@ int __init init_umount(const char *name, int flags) return path_umount(&path, flags); } int __init init_chdir(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) set_fs_pwd(current->fs, &path); 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 @@ -482,7 +482,7 @@ SYSCALL_DEFINE2(access, const char __user *, filename, int, mode) return do_faccessat(AT_FDCWD, filename, mode, 0); } int ksys_chdir(const char __user *filename) SYSCALL_DEFINE1(chdir, const char __user *, filename) { struct path path; int error; Loading @@ -508,11 +508,6 @@ int ksys_chdir(const char __user *filename) return error; } SYSCALL_DEFINE1(chdir, const char __user *, filename) { return ksys_chdir(filename); } SYSCALL_DEFINE1(fchdir, unsigned int, fd) { struct fd f = fdget_raw(fd); Loading include/linux/init_syscalls.h +1 −0 Original line number Diff line number Diff line Loading @@ -3,5 +3,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_unlink(const char *pathname); int __init init_rmdir(const char *pathname); include/linux/syscalls.h +0 −1 Original line number Diff line number Diff line Loading @@ -1238,7 +1238,6 @@ asmlinkage long sys_ni_syscall(void); int ksys_chroot(const char __user *filename); ssize_t ksys_write(unsigned int fd, const char __user *buf, size_t count); int ksys_chdir(const char __user *filename); 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); void ksys_sync(void); Loading Loading
drivers/base/devtmpfs.c +1 −1 Original line number Diff line number Diff line Loading @@ -412,7 +412,7 @@ static int __init devtmpfs_setup(void *p) err = init_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL); if (err) goto out; ksys_chdir("/.."); /* will traverse into overmounted root */ init_chdir("/.."); /* will traverse into overmounted root */ ksys_chroot("."); out: *(int *)p = err; Loading
fs/init.c +16 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ #include <linux/mount.h> #include <linux/namei.h> #include <linux/fs.h> #include <linux/fs_struct.h> #include <linux/init_syscalls.h> #include "internal.h" Loading Loading @@ -38,6 +39,21 @@ int __init init_umount(const char *name, int flags) return path_umount(&path, flags); } int __init init_chdir(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) set_fs_pwd(current->fs, &path); 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 @@ -482,7 +482,7 @@ SYSCALL_DEFINE2(access, const char __user *, filename, int, mode) return do_faccessat(AT_FDCWD, filename, mode, 0); } int ksys_chdir(const char __user *filename) SYSCALL_DEFINE1(chdir, const char __user *, filename) { struct path path; int error; Loading @@ -508,11 +508,6 @@ int ksys_chdir(const char __user *filename) return error; } SYSCALL_DEFINE1(chdir, const char __user *, filename) { return ksys_chdir(filename); } SYSCALL_DEFINE1(fchdir, unsigned int, fd) { struct fd f = fdget_raw(fd); Loading
include/linux/init_syscalls.h +1 −0 Original line number Diff line number Diff line Loading @@ -3,5 +3,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_unlink(const char *pathname); int __init init_rmdir(const char *pathname);
include/linux/syscalls.h +0 −1 Original line number Diff line number Diff line Loading @@ -1238,7 +1238,6 @@ asmlinkage long sys_ni_syscall(void); int ksys_chroot(const char __user *filename); ssize_t ksys_write(unsigned int fd, const char __user *buf, size_t count); int ksys_chdir(const char __user *filename); 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); void ksys_sync(void); Loading