From fcda8810a208b6b76ae95a88feea34ff0046ba1e Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 27 Jan 2016 15:43:15 +0100 Subject: [PATCH] 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 --- winsup/cygwin/autoload.cc | 33 ++++++++++++--------------------- winsup/cygwin/wincap.cc | 7 ------- winsup/cygwin/wincap.h | 2 -- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc index 8a337be23..bc13e07df 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; + WCHAR dll_path[MAX_PATH]; - /* 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); + /* 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 f06f8f6ca..201bd2594 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 ebebd831d..4508974f5 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 };