[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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.

link: https://gist.github.com/tixxdz/301158c64cdcdd0b976891579ce52609


$ ./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: