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
#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 *
{
WCHAR map_buf[MAX_PATH];
WCHAR *mapname = NULL;
- void *shared = NULL;
+ void *shared;
void *addr;
created = false;
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/<PID>/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. "