Don't rely on the reserved area list being empty in reserve_area, since the preloader will need to add things to the list before startup.
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index f61fa5c..64d4ff0 100644 --- a/dlls/ntdll/virtual.c +++ b/dlls/ntdll/virtual.c
@@ -266,6 +266,8 @@ 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 b3edee0..e52d0e3 100644 --- a/libs/wine/mmap.c +++ b/libs/wine/mmap.c
@@ -201,32 +201,13 @@ { 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 @@ 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 );