Regression: mmap rejects shared, read-only mappings of write-sealed memfds

From: Julian Orth
Date: Wed Nov 27 2024 - 15:49:49 EST


Since around

5de19506 mm: resolve faulty mmap_region() error path behaviour

mmap rejects shared, read-only mapping of memfds that have a write-seal applied.

Before the commit, the code in mmap_region was

if (file) {
vma->vm_file = get_file(file);
error = mmap_file(file, vma);
if (error)
goto unmap_and_free_vma;

if (vma_is_shared_maywrite(vma)) {
error = mapping_map_writable(file->f_mapping);

where mmap_file would clear the VM_MAYWRITE flag for write-sealed memfds.

After the commit, the code in mmap_region is simply

if (file && is_shared_maywrite(vm_flags)) {
int error = mapping_map_writable(file->f_mapping);

with mmap_file not being called until much later.

This regression seems to have been first released in 6.12 and is still
present on master.