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 );