Hey, I have a rather simple question about the MAP_SHARED_VALIDATE flag in mmap. When used without a file pointer, EINVAL is returned. Is there a reason for this? I researched a bit but could not find anything. I attached a simple patch that adds MAP_SHARE_VALIDATE to the flags switch and checks for invalid flags. Signed-off-by: Nils Hartmann <nils1hartmann@xxxxxxxxx> --- mm/mmap.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mm/mmap.c b/mm/mmap.c index 740b54be3..fd7db51af 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1196,6 +1196,7 @@ unsigned long do_mmap(struct file *file, unsigned long addr, { struct mm_struct *mm = current->mm; vm_flags_t vm_flags; + unsigned long flags_mask; int pkey = 0; validate_mm(mm); @@ -1266,14 +1267,14 @@ unsigned long do_mmap(struct file *file, unsigned long addr, if (mlock_future_check(mm, vm_flags, len)) return -EAGAIN; + flags_mask = LEGACY_MAP_MASK; if (file) { struct inode *inode = file_inode(file); - unsigned long flags_mask; if (!file_mmap_ok(file, inode, pgoff, len)) return -EOVERFLOW; - flags_mask = LEGACY_MAP_MASK | file->f_op->mmap_supported_flags; + flags_mask |= file->f_op->mmap_supported_flags; switch (flags & MAP_TYPE) { case MAP_SHARED: @@ -1327,6 +1328,10 @@ unsigned long do_mmap(struct file *file, unsigned long addr, } } else { switch (flags & MAP_TYPE) { + case MAP_SHARED_VALIDATE: + if (flags & ~flags_mask) + return -EOPNOTSUPP; + fallthrough; case MAP_SHARED: if (vm_flags & (VM_GROWSDOWN|VM_GROWSUP)) return -EINVAL; -- 2.39.2