diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-01-04 20:22:59 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-01-04 20:22:59 +0100 |
commit | b47b07c92d82df497ad4e3abebfdab51be5d0546 (patch) | |
tree | 8aaa9a1520d1c11effa0c99876172b94e86d089b | |
parent | 3ec5d83d2a237d39e7fd6ef7a0bc8ac4c171a4a5 (diff) | |
download | glibc-b47b07c92d82df497ad4e3abebfdab51be5d0546.zip glibc-b47b07c92d82df497ad4e3abebfdab51be5d0546.tar.gz glibc-b47b07c92d82df497ad4e3abebfdab51be5d0546.tar.bz2 |
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.
-rw-r--r-- | sysdeps/mach/hurd/mmap.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/sysdeps/mach/hurd/mmap.c b/sysdeps/mach/hurd/mmap.c index ed8faad..ea0e61d 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, |