mirror of
https://github.com/fluencelabs/musl
synced 2025-04-25 07:12:15 +00:00
work around incorrect EPERM from mmap syscall
under some conditions, the mmap syscall wrongly fails with EPERM instead of ENOMEM when memory is exhausted; this is probably the result of the kernel trying to fit the allocation somewhere that crosses into the kernel range or below mmap_min_addr. in any case it's a conformance bug, so work around it. for now, only handle the case of anonymous mappings with no requested address; in other cases EPERM may be a legitimate error. this indirectly fixes the possibility of malloc failing with the wrong errno value.
This commit is contained in:
parent
8c4be3e220
commit
da438ee1fc
@ -14,6 +14,7 @@ weak_alias(dummy, __vm_wait);
|
|||||||
|
|
||||||
void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off)
|
void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off)
|
||||||
{
|
{
|
||||||
|
long ret;
|
||||||
if (off & OFF_MASK) {
|
if (off & OFF_MASK) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return MAP_FAILED;
|
return MAP_FAILED;
|
||||||
@ -26,10 +27,14 @@ void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off)
|
|||||||
__vm_wait();
|
__vm_wait();
|
||||||
}
|
}
|
||||||
#ifdef SYS_mmap2
|
#ifdef SYS_mmap2
|
||||||
return (void *)syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT);
|
ret = __syscall(SYS_mmap2, start, len, prot, flags, fd, off/UNIT);
|
||||||
#else
|
#else
|
||||||
return (void *)syscall(SYS_mmap, start, len, prot, flags, fd, off);
|
ret = __syscall(SYS_mmap, start, len, prot, flags, fd, off);
|
||||||
#endif
|
#endif
|
||||||
|
/* Fixup incorrect EPERM from kernel. */
|
||||||
|
if (ret == -EPERM && !start && (flags&MAP_ANON) && !(flags&MAP_FIXED))
|
||||||
|
ret = -ENOMEM;
|
||||||
|
return (void *)__syscall_ret(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
weak_alias(__mmap, mmap);
|
weak_alias(__mmap, mmap);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user