diff --git a/winsup/cygwin/local_includes/memory_layout.h b/winsup/cygwin/local_includes/memory_layout.h index 21e00c1bc..c763442a9 100644 --- a/winsup/cygwin/local_includes/memory_layout.h +++ b/winsup/cygwin/local_includes/memory_layout.h @@ -16,16 +16,9 @@ details. */ dynamicbase is accidentally not set in the PE/COFF header of the DLL. */ #define CYGWIN_DLL_ADDRESS 0x180040000UL -/* Default addresses of required standard shared regions (Cygwin shared, - user shared, myself, shared console). */ -#define CYGWIN_REGION_ADDRESS 0x1a0000000UL -#define USER_REGION_ADDRESS 0x1a1000000UL -#define MYSELF_REGION_ADDRESS 0x1a2000000UL -#define SHARED_CONSOLE_REGION_ADDRESS 0x1a3000000UL - /* Area for non-fixed-address Cygwin-specific shared memory regions. Fallback for standard shared regions if the can't load at their default address. */ -#define SHARED_REGIONS_ADDRESS_LOW 0x1a4000000UL +#define SHARED_REGIONS_ADDRESS_LOW 0x1a0000000UL #define SHARED_REGIONS_ADDRESS_HIGH 0x200000000UL /* Rebased DLLs are located in this 16 Gigs arena. Will be kept for diff --git a/winsup/cygwin/mm/shared.cc b/winsup/cygwin/mm/shared.cc index d7d6547ec..eb798c2dd 100644 --- a/winsup/cygwin/mm/shared.cc +++ b/winsup/cygwin/mm/shared.cc @@ -113,15 +113,6 @@ shared_name (WCHAR *ret_buf, const WCHAR *str, int num) #define page_const ((ptrdiff_t) 65535) #define pround(n) ((ptrdiff_t)(((n) + page_const) & ~page_const)) -/* FIXME: With ASLR, maybe we should ASLR the shared regions, too? */ -static uintptr_t region_address[] = -{ - CYGWIN_REGION_ADDRESS, /* SH_CYGWIN_SHARED */ - USER_REGION_ADDRESS, /* SH_USER_SHARED */ - MYSELF_REGION_ADDRESS, /* SH_MYSELF */ - SHARED_CONSOLE_REGION_ADDRESS, /* SH_SHARED_CONSOLE */ - 0 -}; static NO_COPY uintptr_t next_address = SHARED_REGIONS_ADDRESS_LOW; void * @@ -139,7 +130,7 @@ open_shared (const WCHAR *name, int n, HANDLE& shared_h, DWORD size, { WCHAR map_buf[MAX_PATH]; WCHAR *mapname = NULL; - void *shared = NULL; + void *shared; void *addr; created = false; @@ -166,47 +157,30 @@ open_shared (const WCHAR *name, int n, HANDLE& shared_h, DWORD size, return NULL; } - if (m < SH_TOTAL_SIZE && !dynamically_loaded) - { - /* Fixed regions. Don't do that if Cygwin gets dynamically loaded. - The process loading the DLL might be configured with High-Entropy - ASLR. Chances for collisions are pretty high. + /* Locate shared regions in the area between SHARED_REGIONS_ADDRESS_LOW + and SHARED_REGIONS_ADDRESS_HIGH, retrying until we have a slot. + Don't use MapViewOfFile3 (loader deadlock during fork. */ + bool loop = false; - Note that we don't actually *need* fixed addresses. The only - advantage is reproducibility to help /proc//maps along. */ - addr = (void *) region_address[m]; + addr = (void *) next_address; + do + { shared = MapViewOfFileEx (shared_h, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0, addr); - } - /* Also catch the unlikely case that a fixed region can't be mapped at the - fixed address. */ - if (!shared) - { - /* Locate shared regions in the area between SHARED_REGIONS_ADDRESS_LOW - and SHARED_REGIONS_ADDRESS_HIGH, retrying until we have a slot. - Don't use MapViewOfFile3 (loader deadlock during fork. */ - bool loop = false; - - addr = (void *) next_address; - do + if (!shared) { - shared = MapViewOfFileEx (shared_h, FILE_MAP_READ | FILE_MAP_WRITE, - 0, 0, 0, addr); - if (!shared) + next_address += wincap.allocation_granularity (); + if (next_address >= SHARED_REGIONS_ADDRESS_HIGH) { - next_address += wincap.allocation_granularity (); - if (next_address >= SHARED_REGIONS_ADDRESS_HIGH) - { - if (loop) - break; - next_address = SHARED_REGIONS_ADDRESS_LOW; - loop = true; - } - addr = (void *) next_address; + if (loop) + break; + next_address = SHARED_REGIONS_ADDRESS_LOW; + loop = true; } + addr = (void *) next_address; } - while (!shared); } + while (!shared); if (!shared) api_fatal ("MapViewOfFileEx '%W'(%p, size %u, m %d, created %d), %E. "