From b47b07c92d82df497ad4e3abebfdab51be5d0546 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Mon, 4 Jan 2021 20:22:59 +0100 Subject: hurd: Fix mmap(!MAP_FIXED) on bogus address In the !MAP_FIXED case, when a bogus address is given mmap should pick up a valide address rather than returning EINVAL: Posix only talks about EINVAL for the MAP_FIXED case. This fixes long-running ghc processes. --- sysdeps/mach/hurd/mmap.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'sysdeps') diff --git a/sysdeps/mach/hurd/mmap.c b/sysdeps/mach/hurd/mmap.c index ed8faadee8..ea0e61d571 100644 --- a/sysdeps/mach/hurd/mmap.c +++ b/sysdeps/mach/hurd/mmap.c @@ -127,9 +127,9 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset) vmprot, VM_PROT_ALL, (flags & MAP_SHARED) ? VM_INHERIT_SHARE : VM_INHERIT_COPY); - if (err == KERN_NO_SPACE) + if (flags & MAP_FIXED) { - if (flags & MAP_FIXED) + if (err == KERN_NO_SPACE) { /* XXX this is not atomic as it is in unix! */ /* The region is already allocated; deallocate it first. */ @@ -143,7 +143,10 @@ __mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset) (flags & MAP_SHARED) ? VM_INHERIT_SHARE : VM_INHERIT_COPY); } - else if (mapaddr != 0) + } + else + { + if (mapaddr != 0 && (err == KERN_NO_SPACE || err == KERN_INVALID_ADDRESS)) err = __vm_map (__mach_task_self (), &mapaddr, (vm_size_t) len, (vm_address_t) 0, 1, memobj, (vm_offset_t) offset, -- cgit 1.4.1