提交 f4af638d 编写于 作者: D dcherepanov

7003962: AWT: securely load DLLs and launch executables using fully qualified path

Reviewed-by: art, bae, alanb
上级 8b25a59f
...@@ -117,7 +117,7 @@ HRESULT D3DPipelineManager::InitD3D(void) ...@@ -117,7 +117,7 @@ HRESULT D3DPipelineManager::InitD3D(void)
{ {
typedef IDirect3D9 * WINAPI FnDirect3DCreate9(UINT SDKVersion); typedef IDirect3D9 * WINAPI FnDirect3DCreate9(UINT SDKVersion);
hLibD3D9 = ::LoadLibrary(TEXT("d3d9.dll")); hLibD3D9 = JDK_LoadSystemLibrary("d3d9.dll");
if (hLibD3D9 == NULL) { if (hLibD3D9 == NULL) {
J2dRlsTraceLn(J2D_TRACE_ERROR, "InitD3D: no d3d9.dll"); J2dRlsTraceLn(J2D_TRACE_ERROR, "InitD3D: no d3d9.dll");
return E_FAIL; return E_FAIL;
......
...@@ -60,7 +60,7 @@ typedef const char *(GLAPIENTRY *wglGetExtensionsStringARBType)(HDC hdc); ...@@ -60,7 +60,7 @@ typedef const char *(GLAPIENTRY *wglGetExtensionsStringARBType)(HDC hdc);
#define OGL_LIB_IS_UNINITIALIZED() \ #define OGL_LIB_IS_UNINITIALIZED() \
(OGL_LIB_HANDLE == 0) (OGL_LIB_HANDLE == 0)
#define OGL_OPEN_LIB() \ #define OGL_OPEN_LIB() \
OGL_LIB_HANDLE = LoadLibrary(L"opengl32.dll") OGL_LIB_HANDLE = JDK_LoadSystemLibrary("opengl32.dll")
#define OGL_CLOSE_LIB() \ #define OGL_CLOSE_LIB() \
FreeLibrary(OGL_LIB_HANDLE) FreeLibrary(OGL_LIB_HANDLE)
#define OGL_GET_PROC_ADDRESS(f) \ #define OGL_GET_PROC_ADDRESS(f) \
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "DllUtil.h" #include "DllUtil.h"
#include <jdk_util_md.h>
// Disable warning about using this in the initializer list. // Disable warning about using this in the initializer list.
#pragma warning( disable : 4355) #pragma warning( disable : 4355)
...@@ -40,7 +41,7 @@ DllUtil::~DllUtil() ...@@ -40,7 +41,7 @@ DllUtil::~DllUtil()
HMODULE DllUtil::GetModule() HMODULE DllUtil::GetModule()
{ {
if (!module) { if (!module) {
module = ::LoadLibrary(name); module = JDK_LoadSystemLibrary(name);
} }
return module; return module;
} }
...@@ -60,7 +61,7 @@ DwmAPI & DwmAPI::GetInstance() ...@@ -60,7 +61,7 @@ DwmAPI & DwmAPI::GetInstance()
} }
DwmAPI::DwmAPI() : DwmAPI::DwmAPI() :
DllUtil(_T("DWMAPI.DLL")), DllUtil("DWMAPI.DLL"),
DwmIsCompositionEnabledFunction((DllUtil*)this, "DwmIsCompositionEnabled"), DwmIsCompositionEnabledFunction((DllUtil*)this, "DwmIsCompositionEnabled"),
DwmGetWindowAttributeFunction((DllUtil*)this, "DwmGetWindowAttribute") DwmGetWindowAttributeFunction((DllUtil*)this, "DwmGetWindowAttribute")
{ {
......
...@@ -43,7 +43,7 @@ class DllUtil { ...@@ -43,7 +43,7 @@ class DllUtil {
FARPROC GetProcAddress(LPCSTR name); FARPROC GetProcAddress(LPCSTR name);
protected: protected:
DllUtil(const TCHAR * name) : name(name), module(NULL) {} DllUtil(const char * name) : name(name), module(NULL) {}
virtual ~DllUtil(); virtual ~DllUtil();
HMODULE GetModule(); HMODULE GetModule();
...@@ -68,7 +68,7 @@ class DllUtil { ...@@ -68,7 +68,7 @@ class DllUtil {
}; };
private: private:
const TCHAR * const name; const char * const name;
HMODULE module; HMODULE module;
}; };
......
...@@ -120,15 +120,15 @@ static BOOL initShellProcs() ...@@ -120,15 +120,15 @@ static BOOL initShellProcs()
return TRUE; return TRUE;
} }
// Load libraries // Load libraries
libShell32 = LoadLibrary(TEXT("shell32.dll")); libShell32 = JDK_LoadSystemLibrary("shell32.dll");
if (libShell32 == NULL) { if (libShell32 == NULL) {
return FALSE; return FALSE;
} }
libUser32 = LoadLibrary(TEXT("user32.dll")); libUser32 = JDK_LoadSystemLibrary("user32.dll");
if (libUser32 == NULL) { if (libUser32 == NULL) {
return FALSE; return FALSE;
} }
libComCtl32 = LoadLibrary(TEXT("comctl32.dll")); libComCtl32 = JDK_LoadSystemLibrary("comctl32.dll");
if (libComCtl32 == NULL) { if (libComCtl32 == NULL) {
return FALSE; return FALSE;
} }
...@@ -1021,7 +1021,8 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconResource ...@@ -1021,7 +1021,8 @@ JNIEXPORT jlong JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconResource
(JNIEnv* env, jclass cls, jstring libName, jint iconID, (JNIEnv* env, jclass cls, jstring libName, jint iconID,
jint cxDesired, jint cyDesired, jboolean useVGAColors) jint cxDesired, jint cyDesired, jboolean useVGAColors)
{ {
HINSTANCE libHandle = LoadLibrary(JNU_GetStringPlatformChars(env, libName, NULL)); const char *pLibName = env->GetStringUTFChars(libName, NULL);
HINSTANCE libHandle = (HINSTANCE)JDK_LoadSystemLibrary(pLibName);
if (libHandle != NULL) { if (libHandle != NULL) {
UINT fuLoad = (useVGAColors && !IS_WINXP) ? LR_VGACOLOR : 0; UINT fuLoad = (useVGAColors && !IS_WINXP) ? LR_VGACOLOR : 0;
return ptr_to_jlong(LoadImage(libHandle, MAKEINTRESOURCE(iconID), return ptr_to_jlong(LoadImage(libHandle, MAKEINTRESOURCE(iconID),
......
...@@ -150,7 +150,7 @@ static PFNGETTHEMETRANSITIONDURATION GetThemeTransitionDuration = NULL; ...@@ -150,7 +150,7 @@ static PFNGETTHEMETRANSITIONDURATION GetThemeTransitionDuration = NULL;
BOOL InitThemes() { BOOL InitThemes() {
static HMODULE hModThemes = NULL; static HMODULE hModThemes = NULL;
hModThemes = LoadLibrary(TEXT("UXTHEME.DLL")); hModThemes = JDK_LoadSystemLibrary("UXTHEME.DLL");
DTRACE_PRINTLN1("InitThemes hModThemes = %x\n", hModThemes); DTRACE_PRINTLN1("InitThemes hModThemes = %x\n", hModThemes);
if(hModThemes) { if(hModThemes) {
DTRACE_PRINTLN("Loaded UxTheme.dll\n"); DTRACE_PRINTLN("Loaded UxTheme.dll\n");
......
...@@ -43,12 +43,13 @@ extern "C" ...@@ -43,12 +43,13 @@ extern "C"
mlibSysFnS_t tempSysFns; mlibSysFnS_t tempSysFns;
mlib_status ret = MLIB_SUCCESS; mlib_status ret = MLIB_SUCCESS;
/* Try to load library. Routine should find the library successfully /* Try to receive handle for the library. Routine should find
* because this library is already loaded to the process space by * the library successfully because this library is already
* the System.loadLibrary() call. Here we just need to get handle to * loaded to the process space by the System.loadLibrary() call.
* initialize the pointers to required mlib routines. * Here we just need to get handle to initialize the pointers to
* required mlib routines.
*/ */
hDLL = ::LoadLibrary(TEXT("mlib_image.dll")); hDLL = ::GetModuleHandle(TEXT("mlib_image.dll"));
if (hDLL == NULL) { if (hDLL == NULL) {
return MLIB_FAILURE; return MLIB_FAILURE;
...@@ -94,9 +95,6 @@ extern "C" ...@@ -94,9 +95,6 @@ extern "C"
i++; i++;
} }
if (ret != MLIB_SUCCESS) {
::FreeLibrary(hDLL);
}
return ret; return ret;
} }
......
...@@ -77,7 +77,7 @@ void AwtTextArea::Dispose() ...@@ -77,7 +77,7 @@ void AwtTextArea::Dispose()
LPCTSTR AwtTextArea::GetClassName() { LPCTSTR AwtTextArea::GetClassName() {
static BOOL richedLibraryLoaded = FALSE; static BOOL richedLibraryLoaded = FALSE;
if (!richedLibraryLoaded) { if (!richedLibraryLoaded) {
::LoadLibrary(TEXT("RICHED20.DLL")); JDK_LoadSystemLibrary("RICHED20.DLL");
richedLibraryLoaded = TRUE; richedLibraryLoaded = TRUE;
} }
return RICHEDIT_CLASS; return RICHEDIT_CLASS;
......
...@@ -185,7 +185,7 @@ void AwtTrayIcon::InitNID(UINT uID) ...@@ -185,7 +185,7 @@ void AwtTrayIcon::InitNID(UINT uID)
int shellVersion = 5; // WIN_2000 int shellVersion = 5; // WIN_2000
// MSDN: DllGetVersion should not be implicitly called, but rather // MSDN: DllGetVersion should not be implicitly called, but rather
// loaded using GetProcAddress // loaded using GetProcAddress
HMODULE hShell = LoadLibrary(TEXT("Shell32.dll")); HMODULE hShell = JDK_LoadSystemLibrary("Shell32.dll");
if (hShell != NULL) { if (hShell != NULL) {
DLLGETVERSIONPROC proc = (DLLGETVERSIONPROC)GetProcAddress(hShell, "DllGetVersion"); DLLGETVERSIONPROC proc = (DLLGETVERSIONPROC)GetProcAddress(hShell, "DllGetVersion");
if (proc != NULL) { if (proc != NULL) {
......
...@@ -63,7 +63,7 @@ SetProcessDPIAwareProperty() ...@@ -63,7 +63,7 @@ SetProcessDPIAwareProperty()
bAlreadySet = TRUE; bAlreadySet = TRUE;
HMODULE hLibUser32Dll = ::LoadLibrary(TEXT("user32.dll")); HMODULE hLibUser32Dll = JDK_LoadSystemLibrary("user32.dll");
if (hLibUser32Dll != NULL) { if (hLibUser32Dll != NULL) {
SetProcessDPIAwareFunc *lpSetProcessDPIAware = SetProcessDPIAwareFunc *lpSetProcessDPIAware =
......
...@@ -47,6 +47,7 @@ extern "C" { ...@@ -47,6 +47,7 @@ extern "C" {
// standard Java headers // standard Java headers
#include <jni.h> #include <jni.h>
#include <jni_util.h> #include <jni_util.h>
#include <jdk_util.h>
} // extern "C" } // extern "C"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册