mmap with MAP_FIXED
Hi,
Sending this dump bad map_fixed one that can be combined with other flags MAP_ANONYMOUS... be useful on Linux ? Adrian asked.
$ ./a.out
0x7f2995bb9000 0x70000000000 0x6fffffff000 0x6ffffffe000 0x6ffffffd000 0x6ffffffc000 0x7f29955fc000
#include <errno.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
/* MAP_FIXED is bad... map a big ANONYMOUS and let MAP_FIXED reclame it... */
/* This is wrong and was written quickly it ignores linux mmap_min_addr
* addresses and plenty of bugs ... */
static void *mmap_hint(void *base_addr) {
unsigned offset = 0;
static void *addr = NULL;
static void *up = NULL;
static unsigned long psize = 0;
if (!psize)
psize = getpagesize();
if ((void *)base_addr != NULL) {
if (!addr) {
addr = base_addr;
offset = 0;
up = base_addr;
} else if (up) {
if ((unsigned long)base_addr > (unsigned long)up) {
errno = -EINVAL;
return MAP_FAILED;
}
offset += psize;
} else {
errno = -EINVAL;
return MAP_FAILED;
}
addr -= offset;
addr = (void *)((unsigned long)addr & ~(psize - 1));
goto mmap_call;
}
addr = NULL;
/* MAP_FIXED is bad... */
mmap_call:
return mmap(addr, psize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
}
int main(void)
{
void *ptr1, *ptr2, *ptr3, *ptr4, *ptr5, *ptr6, *ptr7;
ptr1 = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
ptr2 = mmap_hint((void *)0x0000070000000000ULL);
ptr3 = mmap_hint((void *)0x0000070000000000ULL);
ptr4 = mmap_hint((void *)0x0000070000000000ULL);
ptr5 = mmap_hint((void *)0x0000070000000000ULL);
ptr6 = mmap_hint((void *)0x0000070000000000ULL);
ptr7 = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
printf("%p %p %p %p %p %p %p\n", ptr1, ptr2, ptr3, ptr4, ptr5, ptr6, ptr7);
}
Reply to: