[newlib-cygwin] Cygwin: dll_list: query dll file id at load time

Corinna Vinschen corinna@sourceware.org
Tue Apr 30 16:35:00 GMT 2019


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

commit e33db96a14b85d2a2a414de784013637bc4e1fcc
Author: Michael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
Date:   Tue Apr 30 16:15:30 2019 +0200

    Cygwin: dll_list: query dll file id at load time
    
    NtQueryVirtualMemory for MemorySectionName does not reliable return the
    changed dll file name when another process does move the file around,
    and we may end up creating forkable hardlinks to wrong dll files.
    So query the file id when loading the dll rather than before fork.

Diff:
---
 winsup/cygwin/dll_init.cc | 2 ++
 winsup/cygwin/forkable.cc | 4 ----
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc
index 28f4e53..4ba1bd2 100644
--- a/winsup/cygwin/dll_init.cc
+++ b/winsup/cygwin/dll_init.cc
@@ -380,6 +380,8 @@ dll_list::alloc (HINSTANCE h, per_process *p, dll_type type)
 	  d->forkable_ntname = d->ntname + ntnamelen + 1;
 	  *d->forkable_ntname = L'\0';
 	}
+      if (forkables_supported ())
+	d->stat_real_file_once (); /* uses nt_max_path_buf () */
       append (d);
       if (type == DLL_LOAD)
 	loaded_dlls++;
diff --git a/winsup/cygwin/forkable.cc b/winsup/cygwin/forkable.cc
index 912a9ac..e78784c 100644
--- a/winsup/cygwin/forkable.cc
+++ b/winsup/cygwin/forkable.cc
@@ -605,10 +605,6 @@ dll_list::forkable_ntnamesize (dll_type type, PCWCHAR fullntname, PCWCHAR modnam
 void
 dll_list::prepare_forkables_nomination ()
 {
-  dll *d = &dlls.start;
-  while ((d = d->next))
-    d->stat_real_file_once (); /* uses nt_max_path_buf () */
-
   PWCHAR pbuf = nt_max_path_buf ();
 
   bool needsep = false;



More information about the Cygwin-cvs mailing list