diff --git a/fs/open.c b/fs/open.c index a6c6244f4993..f1deb36ee1b7 100644 --- a/fs/open.c +++ b/fs/open.c @@ -717,6 +717,12 @@ static int do_dentry_open(struct file *f, return 0; } + /* Any file opened for execve()/uselib() has to be a regular file. */ + if (unlikely(f->f_flags & FMODE_EXEC && !S_ISREG(inode->i_mode))) { + error = -EACCES; + goto cleanup_file; + } + if (f->f_mode & FMODE_WRITE && !special_file(inode->i_mode)) { error = get_write_access(inode); if (unlikely(error))