diff options
Diffstat (limited to 'fs/exec.c')
| -rw-r--r-- | fs/exec.c | 14 |
1 files changed, 8 insertions, 6 deletions
| @@ -105,7 +105,7 @@ static inline void put_binfmt(struct linux_binfmt * fmt) | |||
| 105 | SYSCALL_DEFINE1(uselib, const char __user *, library) | 105 | SYSCALL_DEFINE1(uselib, const char __user *, library) |
| 106 | { | 106 | { |
| 107 | struct file *file; | 107 | struct file *file; |
| 108 | char *tmp = getname(library); | 108 | struct filename *tmp = getname(library); |
| 109 | int error = PTR_ERR(tmp); | 109 | int error = PTR_ERR(tmp); |
| 110 | static const struct open_flags uselib_flags = { | 110 | static const struct open_flags uselib_flags = { |
| 111 | .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, | 111 | .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, |
| @@ -751,13 +751,14 @@ struct file *open_exec(const char *name) | |||
| 751 | { | 751 | { |
| 752 | struct file *file; | 752 | struct file *file; |
| 753 | int err; | 753 | int err; |
| 754 | struct filename tmp = { .name = name }; | ||
| 754 | static const struct open_flags open_exec_flags = { | 755 | static const struct open_flags open_exec_flags = { |
| 755 | .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, | 756 | .open_flag = O_LARGEFILE | O_RDONLY | __FMODE_EXEC, |
| 756 | .acc_mode = MAY_EXEC | MAY_OPEN, | 757 | .acc_mode = MAY_EXEC | MAY_OPEN, |
| 757 | .intent = LOOKUP_OPEN | 758 | .intent = LOOKUP_OPEN |
| 758 | }; | 759 | }; |
| 759 | 760 | ||
| 760 | file = do_filp_open(AT_FDCWD, name, &open_exec_flags, LOOKUP_FOLLOW); | 761 | file = do_filp_open(AT_FDCWD, &tmp, &open_exec_flags, LOOKUP_FOLLOW); |
| 761 | if (IS_ERR(file)) | 762 | if (IS_ERR(file)) |
| 762 | goto out; | 763 | goto out; |
| 763 | 764 | ||
| @@ -1664,10 +1665,10 @@ SYSCALL_DEFINE3(execve, | |||
| 1664 | const char __user *const __user *, argv, | 1665 | const char __user *const __user *, argv, |
| 1665 | const char __user *const __user *, envp) | 1666 | const char __user *const __user *, envp) |
| 1666 | { | 1667 | { |
| 1667 | const char *path = getname(filename); | 1668 | struct filename *path = getname(filename); |
| 1668 | int error = PTR_ERR(path); | 1669 | int error = PTR_ERR(path); |
| 1669 | if (!IS_ERR(path)) { | 1670 | if (!IS_ERR(path)) { |
| 1670 | error = do_execve(path, argv, envp, current_pt_regs()); | 1671 | error = do_execve(path->name, argv, envp, current_pt_regs()); |
| 1671 | putname(path); | 1672 | putname(path); |
| 1672 | } | 1673 | } |
| 1673 | return error; | 1674 | return error; |
| @@ -1677,10 +1678,11 @@ asmlinkage long compat_sys_execve(const char __user * filename, | |||
| 1677 | const compat_uptr_t __user * argv, | 1678 | const compat_uptr_t __user * argv, |
| 1678 | const compat_uptr_t __user * envp) | 1679 | const compat_uptr_t __user * envp) |
| 1679 | { | 1680 | { |
| 1680 | const char *path = getname(filename); | 1681 | struct filename *path = getname(filename); |
| 1681 | int error = PTR_ERR(path); | 1682 | int error = PTR_ERR(path); |
| 1682 | if (!IS_ERR(path)) { | 1683 | if (!IS_ERR(path)) { |
| 1683 | error = compat_do_execve(path, argv, envp, current_pt_regs()); | 1684 | error = compat_do_execve(path->name, argv, envp, |
| 1685 | current_pt_regs()); | ||
| 1684 | putname(path); | 1686 | putname(path); |
| 1685 | } | 1687 | } |
| 1686 | return error; | 1688 | return error; |
