[newlib-cygwin/topic/posix_acl_funcs] Don't use LoadLibraryEx(..., LOAD_LIBRARY_SEARCH_SYSTEM32). It hangs

Corinna Vinschen corinna@sourceware.org
Wed Jan 27 14:55:00 GMT 2016


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

commit fcda8810a208b6b76ae95a88feea34ff0046ba1e
Author: Corinna Vinschen <corinna@vinschen.de>
Date:   Wed Jan 27 15:43:15 2016 +0100

    Don't use LoadLibraryEx(..., LOAD_LIBRARY_SEARCH_SYSTEM32).  It hangs
    
    	Observed running hexchat under X.  For some reason the call to
    	LoadLibraryEx(..., LOAD_LIBRARY_SEARCH_SYSTEM32) in dll_load
    	hangs when trying to autoload MsgWaitForMultipleObjectsEx in
    	select.cc after hexchat forks to run DNS calls.  Dropping the
    	call and just using full paths as in 2.3.1 fixes the issue.
    
    	* autoload.cc (dll_load): Drop call to LoadLibraryEx with
    	LOAD_LIBRARY_SEARCH_SYSTEM32 flag.
    	* wincap.h (wincaps::has_load_lib_search_flags): Remove.
    	* wincap.cc (wincaps::has_load_lib_search_flags): Drop handling
    	this flag.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 winsup/cygwin/autoload.cc | 35 +++++++++++++----------------------
 winsup/cygwin/wincap.cc   |  7 -------
 winsup/cygwin/wincap.h    |  2 --
 3 files changed, 13 insertions(+), 31 deletions(-)

diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index 8a337be..bc13e07 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -332,7 +332,6 @@ union retchain
   two_addr_t ll;
 };
 
-
 /* This function handles the problem described here:
 
   http://www.microsoft.com/technet/security/advisory/2269637.mspx
@@ -349,28 +348,20 @@ static __inline bool
 dll_load (HANDLE& handle, PWCHAR name)
 {
   HANDLE h = NULL;
-
-  /* On systems supporting LOAD_LIBRARY_SEARCH flags, try to load
-     explicitely from the system dir first. */
-  if (wincap.has_load_lib_search_flags ())
-    h = LoadLibraryExW (name, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
+  WCHAR dll_path[MAX_PATH];
+
+  /* If that failed, try loading with full path, which sometimes
+     fails for no good reason. */
+  wcpcpy (wcpcpy (dll_path, windows_system_directory), name);
+  h = LoadLibraryW (dll_path);
+  /* If that failed according to the second problem outlined in the
+     comment preceeding this function. */
+  if (!h && handle && wincap.use_dont_resolve_hack ()
+      && GetLastError () == ERROR_INVALID_ADDRESS)
+    h = LoadLibraryExW (dll_path, NULL, DONT_RESOLVE_DLL_REFERENCES);
+  /* Last resort: Try loading just by name. */
   if (!h)
-    {
-      WCHAR dll_path[MAX_PATH];
-
-      /* If that failed, try loading with full path, which sometimes
-	 fails for no good reason. */
-      wcpcpy (wcpcpy (dll_path, windows_system_directory), name);
-      h = LoadLibraryW (dll_path);
-      /* If that failed according to the second problem outlined in the
-	 comment preceeding this function. */
-      if (!h && handle && wincap.use_dont_resolve_hack ()
-	  && GetLastError () == ERROR_INVALID_ADDRESS)
-	h = LoadLibraryExW (dll_path, NULL, DONT_RESOLVE_DLL_REFERENCES);
-      /* Last resort: Try loading just by name. */
-      if (!h)
-	h = LoadLibraryW (name);
-    }
+    h = LoadLibraryW (name);
   if (!h)
     return false;
   handle = h;
diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc
index f06f8f6..201bd25 100644
--- a/winsup/cygwin/wincap.cc
+++ b/winsup/cygwin/wincap.cc
@@ -52,7 +52,6 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = {
   has_processor_groups:false,
   has_broken_prefetchvm:false,
   has_new_pebteb_region:false,
-  has_load_lib_search_flags:false,
 };
 
 wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -87,7 +86,6 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = {
   has_processor_groups:false,
   has_broken_prefetchvm:false,
   has_new_pebteb_region:false,
-  has_load_lib_search_flags:false,
 };
 
 wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -122,7 +120,6 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = {
   has_processor_groups:false,
   has_broken_prefetchvm:false,
   has_new_pebteb_region:false,
-  has_load_lib_search_flags:true,
 };
 
 wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -157,7 +154,6 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = {
   has_processor_groups:true,
   has_broken_prefetchvm:false,
   has_new_pebteb_region:false,
-  has_load_lib_search_flags:true,
 };
 
 wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -192,7 +188,6 @@ wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = {
   has_processor_groups:true,
   has_broken_prefetchvm:false,
   has_new_pebteb_region:false,
-  has_load_lib_search_flags:true,
 };
 
 wincaps wincap_10 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -227,7 +222,6 @@ wincaps wincap_10 __attribute__((section (".cygwin_dll_common"), shared)) = {
   has_processor_groups:true,
   has_broken_prefetchvm:true,
   has_new_pebteb_region:false,
-  has_load_lib_search_flags:true,
 };
 
 wincaps wincap_10_1511 __attribute__((section (".cygwin_dll_common"), shared)) = {
@@ -262,7 +256,6 @@ wincaps wincap_10_1511 __attribute__((section (".cygwin_dll_common"), shared)) =
   has_processor_groups:true,
   has_broken_prefetchvm:false,
   has_new_pebteb_region:true,
-  has_load_lib_search_flags:true,
 };
 
 wincapc wincap __attribute__((section (".cygwin_dll_common"), shared));
diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h
index ebebd83..4508974 100644
--- a/winsup/cygwin/wincap.h
+++ b/winsup/cygwin/wincap.h
@@ -45,7 +45,6 @@ struct wincaps
   unsigned has_processor_groups				: 1;
   unsigned has_broken_prefetchvm			: 1;
   unsigned has_new_pebteb_region			: 1;
-  unsigned has_load_lib_search_flags			: 1;
 };
 
 class wincapc
@@ -105,7 +104,6 @@ public:
   bool	IMPLEMENT (has_processor_groups)
   bool	IMPLEMENT (has_broken_prefetchvm)
   bool	IMPLEMENT (has_new_pebteb_region)
-  bool	IMPLEMENT (has_load_lib_search_flags)
 
 #undef IMPLEMENT
 };



More information about the Cygwin-cvs mailing list