autoload.cc: Drop using full paths for system DLLs

System DLLs are always first in the DLL search order so
	http://www.microsoft.com/technet/security/advisory/2269637.mspx
	doesn't apply for them.

        * autoload.cc (std_dll_init): Revert using full paths to system DLLs.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2015-08-25 22:17:03 +02:00
parent 859c10beee
commit 4b104ce070
2 changed files with 7 additions and 11 deletions

View File

@ -1,3 +1,7 @@
2015-08-25 Corinna Vinschen <corinna@vinschen.de>
* autoload.cc (std_dll_init): Revert using full paths to system DLLs.
2015-08-25 Corinna Vinschen <corinna@vinschen.de> 2015-08-25 Corinna Vinschen <corinna@vinschen.de>
* autoload.cc (noload): i686 only: Save and restore $edx when calling * autoload.cc (noload): i686 only: Save and restore $edx when calling

View File

@ -420,18 +420,15 @@ std_dll_init ()
{ {
fenv_t fpuenv; fenv_t fpuenv;
fegetenv (&fpuenv); fegetenv (&fpuenv);
WCHAR dll_path[MAX_PATH];
DWORD err = ERROR_SUCCESS; DWORD err = ERROR_SUCCESS;
int i; int i;
/* http://www.microsoft.com/technet/security/advisory/2269637.mspx */
wcpcpy (wcpcpy (dll_path, windows_system_directory), dll->name);
/* MSDN seems to imply that LoadLibrary can fail mysteriously, so, /* MSDN seems to imply that LoadLibrary can fail mysteriously, so,
since there have been reports of this in the mailing list, retry since there have been reports of this in the mailing list, retry
several times before giving up. */ several times before giving up. */
for (i = 1; i <= RETRY_COUNT; i++) for (i = 1; i <= RETRY_COUNT; i++)
{ {
/* If loading the library succeeds, just leave the loop. */ /* If loading the library succeeds, just leave the loop. */
if (dll_load (dll->handle, dll_path)) if (dll_load (dll->handle, dll->name))
break; break;
/* Otherwise check error code returned by LoadLibrary. If the /* Otherwise check error code returned by LoadLibrary. If the
error code is neither NOACCESS nor DLL_INIT_FAILED, break out error code is neither NOACCESS nor DLL_INIT_FAILED, break out
@ -444,15 +441,10 @@ std_dll_init ()
} }
if ((uintptr_t) dll->handle <= 1) if ((uintptr_t) dll->handle <= 1)
{ {
/* If LoadLibrary with full path returns one of the weird errors if ((func->decoration & 1))
reported on the Cygwin mailing list, retry with only the DLL
name. Only do this when the above retry loop has been exhausted. */
if (i > RETRY_COUNT && dll_load (dll->handle, dll->name))
/* got it with the fallback */;
else if ((func->decoration & 1))
dll->handle = INVALID_HANDLE_VALUE; dll->handle = INVALID_HANDLE_VALUE;
else else
api_fatal ("unable to load %W, %E", dll_path); api_fatal ("unable to load %W, %E", dll->name);
} }
fesetenv (&fpuenv); fesetenv (&fpuenv);
} }