mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
fs: consistently use can_mmap_file() helper
Since commitc84bf6dd2b
("mm: introduce new .mmap_prepare() file callback"), the f_op->mmap() hook has been deprecated in favour of f_op->mmap_prepare(). Additionally, commitbb666b7c27
("mm: add mmap_prepare() compatibility layer for nested file systems") permits the use of the .mmap_prepare() hook even in nested filesystems like overlayfs. There are a number of places where we check only for f_op->mmap - this is incorrect now mmap_prepare exists, so update all of these to use the general helper can_mmap_file(). Most notably, this updates the elf logic to allow for the ability to execute binaries on filesystems which have the .mmap_prepare hook, but additionally we update nested filesystems. Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Link: https://lore.kernel.org/b68145b609532e62bab603dd9686faa6562046ec.1750099179.git.lorenzo.stoakes@oracle.com Acked-by: Kees Cook <kees@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
c6900f227f
commit
b013ed4031
@ -333,7 +333,7 @@ int backing_file_mmap(struct file *file, struct vm_area_struct *vma,
|
|||||||
if (WARN_ON_ONCE(!(file->f_mode & FMODE_BACKING)))
|
if (WARN_ON_ONCE(!(file->f_mode & FMODE_BACKING)))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
if (!file->f_op->mmap)
|
if (!can_mmap_file(file))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
vma_set_file(vma, file);
|
vma_set_file(vma, file);
|
||||||
|
@ -646,7 +646,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
|
|||||||
if (!elf_check_arch(interp_elf_ex) ||
|
if (!elf_check_arch(interp_elf_ex) ||
|
||||||
elf_check_fdpic(interp_elf_ex))
|
elf_check_fdpic(interp_elf_ex))
|
||||||
goto out;
|
goto out;
|
||||||
if (!interpreter->f_op->mmap)
|
if (!can_mmap_file(interpreter))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
total_size = total_mapping_size(interp_elf_phdata,
|
total_size = total_mapping_size(interp_elf_phdata,
|
||||||
@ -848,7 +848,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||||||
goto out;
|
goto out;
|
||||||
if (elf_check_fdpic(elf_ex))
|
if (elf_check_fdpic(elf_ex))
|
||||||
goto out;
|
goto out;
|
||||||
if (!bprm->file->f_op->mmap)
|
if (!can_mmap_file(bprm->file))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
elf_phdata = load_elf_phdrs(elf_ex, bprm->file);
|
elf_phdata = load_elf_phdrs(elf_ex, bprm->file);
|
||||||
|
@ -109,7 +109,7 @@ static int is_elf(struct elfhdr *hdr, struct file *file)
|
|||||||
return 0;
|
return 0;
|
||||||
if (!elf_check_arch(hdr))
|
if (!elf_check_arch(hdr))
|
||||||
return 0;
|
return 0;
|
||||||
if (!file->f_op->mmap)
|
if (!can_mmap_file(file))
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -160,7 +160,7 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma)
|
|||||||
size_t count;
|
size_t count;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!host_file->f_op->mmap)
|
if (!can_mmap_file(host_file))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (WARN_ON(coda_file != vma->vm_file))
|
if (WARN_ON(coda_file != vma->vm_file))
|
||||||
|
@ -193,7 +193,7 @@ static int ecryptfs_mmap(struct file *file, struct vm_area_struct *vma)
|
|||||||
* natively. If FILESYSTEM_MAX_STACK_DEPTH > 2 or ecryptfs
|
* natively. If FILESYSTEM_MAX_STACK_DEPTH > 2 or ecryptfs
|
||||||
* allows recursive mounting, this will need to be extended.
|
* allows recursive mounting, this will need to be extended.
|
||||||
*/
|
*/
|
||||||
if (!lower_file->f_op->mmap)
|
if (!can_mmap_file(lower_file))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
return generic_file_mmap(file, vma);
|
return generic_file_mmap(file, vma);
|
||||||
}
|
}
|
||||||
|
@ -2260,7 +2260,7 @@ struct inode_operations {
|
|||||||
} ____cacheline_aligned;
|
} ____cacheline_aligned;
|
||||||
|
|
||||||
/* Did the driver provide valid mmap hook configuration? */
|
/* Did the driver provide valid mmap hook configuration? */
|
||||||
static inline bool file_has_valid_mmap_hooks(struct file *file)
|
static inline bool can_mmap_file(struct file *file)
|
||||||
{
|
{
|
||||||
bool has_mmap = file->f_op->mmap;
|
bool has_mmap = file->f_op->mmap;
|
||||||
bool has_mmap_prepare = file->f_op->mmap_prepare;
|
bool has_mmap_prepare = file->f_op->mmap_prepare;
|
||||||
|
@ -475,7 +475,7 @@ unsigned long do_mmap(struct file *file, unsigned long addr,
|
|||||||
vm_flags &= ~VM_MAYEXEC;
|
vm_flags &= ~VM_MAYEXEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_has_valid_mmap_hooks(file))
|
if (!can_mmap_file(file))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
if (vm_flags & (VM_GROWSDOWN|VM_GROWSUP))
|
if (vm_flags & (VM_GROWSDOWN|VM_GROWSUP))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -719,7 +719,7 @@ static int validate_mmap_request(struct file *file,
|
|||||||
|
|
||||||
if (file) {
|
if (file) {
|
||||||
/* files must support mmap */
|
/* files must support mmap */
|
||||||
if (!file_has_valid_mmap_hooks(file))
|
if (!can_mmap_file(file))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
/* work out if what we've got could possibly be shared
|
/* work out if what we've got could possibly be shared
|
||||||
|
@ -1464,7 +1464,7 @@ static int compat_vma_mmap_prepare(struct file *file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Did the driver provide valid mmap hook configuration? */
|
/* Did the driver provide valid mmap hook configuration? */
|
||||||
static inline bool file_has_valid_mmap_hooks(struct file *file)
|
static inline bool can_mmap_file(struct file *file)
|
||||||
{
|
{
|
||||||
bool has_mmap = file->f_op->mmap;
|
bool has_mmap = file->f_op->mmap;
|
||||||
bool has_mmap_prepare = file->f_op->mmap_prepare;
|
bool has_mmap_prepare = file->f_op->mmap_prepare;
|
||||||
|
Loading…
Reference in New Issue
Block a user