* loadlib.h: New header implementing safe LoadLibrary calls.
Include throughout files using LoadLibrary function. * cygcheck.cc (dump_sysinfo): Retrieve kernel32.dll handle via GetModuleHandle, rather than using LoadLibrary. * cygpath.cc (get_long_name): Ditto. (do_sysfolders): Append .dll suffix in LoadLibrary call. * ldh.cc (WinMain): Use LoadLibraryExW with DONT_RESOLVE_DLL_REFERENCES to avoid loading malicious library code. * locale.cc (print_locale_with_codeset): Change way to retrieve kernel32.dll path.
This commit is contained in:
59
winsup/utils/loadlib.h
Normal file
59
winsup/utils/loadlib.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/* loadlib.h
|
||||
|
||||
Copyright 2010 Red Hat, Inc.
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
This software is a copyrighted work licensed under the terms of the
|
||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||
details. */
|
||||
|
||||
#ifndef _LOADLIB_H
|
||||
#define _LOADLIB_H
|
||||
|
||||
#include <windows.h>
|
||||
#include <wchar.h>
|
||||
|
||||
/* Load all system libs from the windows system directory by prepending the
|
||||
full path. This doesn't work for loadling cygwin1.dll. For this case,
|
||||
instead of prepending the path, make sure that the CWD is removed from
|
||||
the DLL search path, if possible (XP SP1++, Vista++). */
|
||||
static HMODULE
|
||||
_load_sys_library (const wchar_t *dll)
|
||||
{
|
||||
static BOOL (*set_dll_directory)(LPCWSTR);
|
||||
static WCHAR sysdir[MAX_PATH];
|
||||
static UINT sysdir_len;
|
||||
|
||||
WCHAR dllpath[MAX_PATH];
|
||||
|
||||
if (!sysdir_len)
|
||||
{
|
||||
sysdir_len = GetSystemDirectoryW (sysdir, MAX_PATH);
|
||||
sysdir[sysdir_len++] = L'\\';
|
||||
sysdir[sysdir_len] = L'\0';
|
||||
}
|
||||
if (!set_dll_directory)
|
||||
{
|
||||
HMODULE k32 = GetModuleHandleW (L"kernel32.dll");
|
||||
if (k32)
|
||||
set_dll_directory = (BOOL (*)(LPCWSTR))
|
||||
GetProcAddress (k32, "SetDllDirectoryW");
|
||||
if (!set_dll_directory)
|
||||
set_dll_directory = (BOOL (*)(LPCWSTR)) -1;
|
||||
else
|
||||
set_dll_directory (L"");
|
||||
}
|
||||
|
||||
if (wcscmp (dll, L"cygwin1.dll") == 0)
|
||||
return LoadLibraryExW (L"cygwin1.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||
|
||||
wcscpy (dllpath, sysdir);
|
||||
wcscpy (dllpath + sysdir_len, dll);
|
||||
return LoadLibraryExW (dllpath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||
}
|
||||
|
||||
#define LoadLibraryW(d) _load_sys_library(d)
|
||||
#define LoadLibraryA(d) _load_sys_library(L##d)
|
||||
|
||||
#endif /* _LOADLIB_H */
|
Reference in New Issue
Block a user