This is the mail archive of the
cygwin-cvs@cygwin.com
mailing list for the Cygwin project.
[newlib-cygwin/topic/posix_acl_funcs] Don't use LoadLibraryEx(..., LOAD_LIBRARY_SEARCH_SYSTEM32). It hangs
- From: Corinna Vinschen <corinna at sourceware dot org>
- To: cygwin-cvs at sourceware dot org
- Date: 27 Jan 2016 14:55:56 -0000
- Subject: [newlib-cygwin/topic/posix_acl_funcs] Don't use LoadLibraryEx(..., LOAD_LIBRARY_SEARCH_SYSTEM32). It hangs
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
};