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>
This commit is contained in:
parent
78549742de
commit
fcda8810a2
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue