From: GNU Libc Maintainers Date: Wed, 19 Apr 2023 21:17:51 +0000 (+0100) Subject: git-mmap_addr X-Git-Tag: archive/raspbian/2.31-13+rpi1+deb11u6^2~53 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=2d7e00d6d7776a5b71815173d1fbbb0356f4d4b2;p=glibc.git git-mmap_addr commit b47b07c92d82df497ad4e3abebfdab51be5d0546 Author: Samuel Thibault Date: Mon Jan 4 20:22:59 2021 +0100 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. Gbp-Pq: Topic hurd-i386 Gbp-Pq: Name git-mmap_addr.diff --- diff --git a/sysdeps/mach/hurd/mmap.c b/sysdeps/mach/hurd/mmap.c index b00f9de16..21e16218d 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,