Patch series "Relocate execve() sanity checks", v2. While looking at the code paths for the proposed O_MAYEXEC flag, I saw some things that looked like they should be fixed up. exec: Change uselib(2) IS_SREG() failure to EACCES This just regularizes the return code on uselib(2). exec: Move S_ISREG() check earlier This moves the S_ISREG() check even earlier than it was already. exec: Move path_noexec() check earlier This adds the path_noexec() check to the same place as the S_ISREG() check. This patch (of 3): Change uselib(2)' S_ISREG() error return to EACCES instead of EINVAL so the behavior matches execve(2), and the seemingly documented value. The "not a regular file" failure mode of execve(2) is explicitly documented[1], but it is not mentioned in uselib(2)[2] which does, however, say that open(2) and mmap(2) errors may apply. The documentation for open(2) does not include a "not a regular file" error[3], but mmap(2) does[4], and it is EACCES. [1] http://man7.org/linux/man-pages/man2/execve.2.html#ERRORS [2] http://man7.org/linux/man-pages/man2/uselib.2.html#ERRORS [3] http://man7.org/linux/man-pages/man2/open.2.html#ERRORS [4] http://man7.org/linux/man-pages/man2/mmap.2.html#ERRORS
Unified · Split
| @@ -141,11 +141,10 @@ SYSCALL_DEFINE1(uselib, const char __user *, library) · 140 unmodified lines | ||
| 141 | 141 | if (IS_ERR(file)) |
| 142 | 142 | goto out; |
| 143 | 143 | |
| 144 | − error = -EINVAL; | |
| 144 | + error = -EACCES; | |
| 145 | 145 | if (!S_ISREG(file_inode(file)->i_mode)) |
| 146 | 146 | goto exit; |
| 147 | 147 | |
| 148 | − error = -EACCES; | |
| 149 | 148 | if (path_noexec(&file->f_path)) |
| 150 | 149 | goto exit; |
| 151 | 150 | |