diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index f61fa5cb643a0d67518636446e0b049457553ace..64d4ff065d29a73b10f9ea7e98f443db4a952863 100644 --- a/dlls/ntdll/virtual.c +++ b/dlls/ntdll/virtual.c @@ -266,6 +266,8 @@ static void add_reserved_area( void *addr, size_t size ) size -= (char *)USER_SPACE_LIMIT - (char *)addr; addr = USER_SPACE_LIMIT; } + /* blow away existing mappings */ + wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE | MAP_FIXED ); wine_mmap_add_reserved_area( addr, size ); } diff --git a/libs/wine/mmap.c b/libs/wine/mmap.c index b3edee0e793b87398b0bf3123636e63ca99e74f3..e52d0e36d558bda7fbdcc17652c6905e4eb4edc7 100644 --- a/libs/wine/mmap.c +++ b/libs/wine/mmap.c @@ -201,32 +201,13 @@ static void reserve_area( void *addr, void *end ) { void *ptr; size_t size = (char *)end - (char *)addr; - struct list *prev; - struct reserved_area *area; if ((ptr = wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE )) != (void *)-1) { if (ptr == addr) { - if (!end) size--; /* avoid wrap-around */ - /* try to merge it with the previous one */ - if ((prev = list_tail( &reserved_areas ))) - { - area = LIST_ENTRY( prev, struct reserved_area, entry ); - if (area && (char *)area->base + area->size == (char *)ptr) - { - area->size += size; - return; - } - } - /* create a new area */ - if ((area = malloc( sizeof(*area) ))) - { - area->base = addr; - area->size = size; - list_add_tail( &reserved_areas, &area->entry ); - return; - } + wine_mmap_add_reserved_area( addr, size ); + return; } else munmap( ptr, size ); } @@ -287,11 +268,6 @@ void wine_mmap_add_reserved_area( void *addr, size_t size ) if (!((char *)addr + size)) size--; /* avoid wrap-around */ -#ifdef HAVE_MMAP - /* blow away existing mappings */ - wine_anon_mmap( addr, size, PROT_NONE, MAP_NORESERVE | MAP_FIXED ); -#endif - LIST_FOR_EACH( ptr, &reserved_areas ) { area = LIST_ENTRY( ptr, struct reserved_area, entry );