From 78e665d773cd539d0d97e747790c80a95979e92e Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 16 Jan 2005 11:12:57 +0000 Subject: [PATCH] Win32: hardened getAvailableDisplayModes --- platform_build/win32_ms_cmdline/build.bat | 2 +- src/native/win32/display.c | 87 ++++++++++------------- 2 files changed, 39 insertions(+), 50 deletions(-) diff --git a/platform_build/win32_ms_cmdline/build.bat b/platform_build/win32_ms_cmdline/build.bat index e3d47d53..2b3fd8b7 100644 --- a/platform_build/win32_ms_cmdline/build.bat +++ b/platform_build/win32_ms_cmdline/build.bat @@ -6,7 +6,7 @@ if "%CHOME%" == "" goto errorchome if "%ALHOME%" == "" goto erroralhome if "%EAXHOME%" == "" goto erroreaxhome if "%DXHOME%" == "" goto errordxhome -set COPTIONS=/I"%DXHOME%\include" /I"%CHOME%\include" /I"%PLTSDKHOME%\include" /I"%JAVA_HOME%\include" /I"%JAVA_HOME%\include\win32" /I"%ALHOME%\include" /I"%EAXHOME%\include" /I"..\..\src\native\common" /Ox /Ob2 /Oi /Ot /Oy /FD /EHsc /MT /Gy /W0 /nologo /c /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "LWJGL_EXPORTS" /D "_WINDLL" +set COPTIONS=/I"%DXHOME%\include" /I"%CHOME%\include" /I"%PLTSDKHOME%\include" /I"%JAVA_HOME%\include" /I"%JAVA_HOME%\include\win32" /I"%ALHOME%\include" /I"%EAXHOME%\include" /I"..\..\src\native\common" /Ox /Ob2 /Oi /Ot /Oy /FD /EHsc /MT /Gy /W2 /nologo /c /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" /D "LWJGL_EXPORTS" /D "_WINDLL" set LINKEROPTS=/link /LIBPATH:"%ALHOME%\libs" /LIBPATH:"%EAXHOME%\Libs" /LIBPATH:"%DXHOME%\Lib" /LIBPATH:"%PLTSDKHOME%\Lib" /LIBPATH:"%CHOME%\Lib" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /MACHINE:X86 /NOLOGO /DLL set LIBS=dinput.lib dxguid.lib eaxguid.lib OpenGL32.Lib Version.lib user32.lib Gdi32.lib Advapi32.lib diff --git a/src/native/win32/display.c b/src/native/win32/display.c index e8aa15d5..0f33e814 100644 --- a/src/native/win32/display.c +++ b/src/native/win32/display.c @@ -79,10 +79,11 @@ static jobjectArray GetAvailableDisplayModesEx(JNIEnv * env) { HMODULE lib_handle = LoadLibrary("user32.dll"); int i = 0, j = 0, n = 0; - int AvailableModes = 0; DISPLAY_DEVICE DisplayDevice; DEVMODE DevMode; + jobject *display_mode_objects = NULL; + int list_size = 0; jclass displayModeClass; @@ -106,33 +107,9 @@ static jobjectArray GetAvailableDisplayModesEx(JNIEnv * env) { DevMode.dmSize = sizeof(DEVMODE); DisplayDevice.cb = sizeof(DISPLAY_DEVICE); - //enumerate all displays, and all of their displaymodes - while(EnumDisplayDevicesA(NULL, i++, &DisplayDevice, 0) != 0) { - // continue if mirroring device - if((DisplayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) != 0) { - continue; - } - - // go ahead - printfDebug("Querying %s device\n", DisplayDevice.DeviceString); - j = 0; - while(EnumDisplaySettingsExA((const char *) DisplayDevice.DeviceName, j++, &DevMode, 0) != 0) { - if (DevMode.dmBitsPerPel > 8 && ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN | CDS_TEST) == DISP_CHANGE_SUCCESSFUL) { - AvailableModes++; - } - } - } - - printfDebug("Found %d displaymodes\n", AvailableModes); - - // now that we have the count create the classes, and add 'em all - we'll remove dups in Java - // Allocate an array of DisplayModes big enough - displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode"); - - ret = (*env)->NewObjectArray(env, AvailableModes, displayModeClass, NULL); - displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "", "(IIII)V"); - - i = 0, n = 0; + displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode"); + displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "", "(IIII)V"); + while(EnumDisplayDevicesA(NULL, i++, &DisplayDevice, 0) != 0) { // continue if mirroring device if((DisplayDevice.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER) != 0) { @@ -144,14 +121,26 @@ static jobjectArray GetAvailableDisplayModesEx(JNIEnv * env) { // Filter out indexed modes if (DevMode.dmBitsPerPel > 8 && ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN | CDS_TEST) == DISP_CHANGE_SUCCESSFUL) { jobject displayMode; - displayMode = (*env)->NewObject(env, displayModeClass, displayModeConstructor, + if (list_size <= n) { + list_size += 1; + display_mode_objects = (jobject *)realloc(display_mode_objects, sizeof(jobject)*list_size); + if (display_mode_objects == NULL) + return NULL; + } + displayMode = (*env)->NewObject(env, displayModeClass, displayModeConstructor, DevMode.dmPelsWidth, DevMode.dmPelsHeight, DevMode.dmBitsPerPel, DevMode.dmDisplayFrequency); - - (*env)->SetObjectArrayElement(env, ret, n++, displayMode); + display_mode_objects[n++] = displayMode; } } } + printfDebug("Found %d displaymodes\n", n); + + ret = (*env)->NewObjectArray(env, n, displayModeClass, NULL); + for (i = 0; i < n; i++) { + (*env)->SetObjectArrayElement(env, ret, i, display_mode_objects[i]); + } + free(display_mode_objects); FreeLibrary(lib_handle); return ret; } @@ -161,46 +150,46 @@ static jobjectArray GetAvailableDisplayModesEx(JNIEnv * env) { */ static jobjectArray GetAvailableDisplayModes(JNIEnv * env) { int i = 0, j = 0, n = 0; - int AvailableModes = 0; DEVMODE DevMode; - jclass displayModeClass; + jclass displayModeClass; - jobjectArray ret; - jmethodID displayModeConstructor; + jobjectArray ret; + jmethodID displayModeConstructor; + jobject *display_mode_objects = NULL; + int list_size = 0; ZeroMemory(&DevMode, sizeof(DEVMODE)); DevMode.dmSize = sizeof(DEVMODE); - //enumerate all displaymodes - while(EnumDisplaySettings(NULL, j++, &DevMode) != 0) { - if (DevMode.dmBitsPerPel > 8 && ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN | CDS_TEST) == DISP_CHANGE_SUCCESSFUL) { - AvailableModes++; - } - } - - printfDebug("Found %d displaymodes\n", AvailableModes); - - // now that we have the count create the classes, and add 'em all - we'll remove dups in Java - // Allocate an array of DisplayModes big enough displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode"); - ret = (*env)->NewObjectArray(env, AvailableModes, displayModeClass, NULL); displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "", "(IIII)V"); - i = 0, j = 0, n = 0; while(EnumDisplaySettings(NULL, j++, &DevMode) != 0) { // Filter out indexed modes if (DevMode.dmBitsPerPel > 8 && ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN | CDS_TEST) == DISP_CHANGE_SUCCESSFUL) { jobject displayMode; + if (list_size <= n) { + list_size += 1; + display_mode_objects = (jobject *)realloc(display_mode_objects, sizeof(jobject)*list_size); + if (display_mode_objects == NULL) + return NULL; + } displayMode = (*env)->NewObject(env, displayModeClass, displayModeConstructor, DevMode.dmPelsWidth, DevMode.dmPelsHeight, DevMode.dmBitsPerPel, DevMode.dmDisplayFrequency); - (*env)->SetObjectArrayElement(env, ret, n++, displayMode); + display_mode_objects[n++] = displayMode; } } + ret = (*env)->NewObjectArray(env, n, displayModeClass, NULL); + for (i = 0; i < n; i++) { + (*env)->SetObjectArrayElement(env, ret, i, display_mode_objects[i]); + } + free(display_mode_objects); + printfDebug("Found %d displaymodes\n", n); return ret; }