public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
From: Corinna Vinschen <corinna@sourceware.org>
To: cygwin-cvs@sourceware.org
Subject: [newlib-cygwin/main] Cygwin: drop fixed addresses for standard shared regions
Date: Wed, 18 Jan 2023 12:38:30 +0000 (GMT)	[thread overview]
Message-ID: <20230118123830.E21133858D28@sourceware.org> (raw)

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=31302b267b86a9e9190dd260f2ff4f0c74410bf3

commit 31302b267b86a9e9190dd260f2ff4f0c74410bf3
Author:     Corinna Vinschen <corinna@vinschen.de>
AuthorDate: Wed Jan 18 13:16:50 2023 +0100
Commit:     Corinna Vinschen <corinna@vinschen.de>
CommitDate: Wed Jan 18 13:16:50 2023 +0100

    Cygwin: drop fixed addresses for standard shared regions
    
    With the previous commit 9ddd48ee1b8d ("Cygwin: /proc/<PID>/maps:
    print real shared region addresses"), the real addresses of
    the standard shared regions (cygwin, user, myself, shared console)
    are read from the printed process itself.  We don't need fixed
    addresses anymore, so drop the definitions and simplify open_shared.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/local_includes/memory_layout.h |  9 +----
 winsup/cygwin/mm/shared.cc                   | 60 ++++++++--------------------
 2 files changed, 18 insertions(+), 51 deletions(-)

diff --git a/winsup/cygwin/local_includes/memory_layout.h b/winsup/cygwin/local_includes/memory_layout.h
index 21e00c1bcf55..c763442a9ef4 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 d7d6547ec3bb..eb798c2ddb5f 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/<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.  "

                 reply	other threads:[~2023-01-18 12:38 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230118123830.E21133858D28@sourceware.org \
    --to=corinna@sourceware.org \
    --cc=cygwin-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).