src/windows/native/java/util/prefs/WindowsPreferences.c

Print this page

        

*** 22,33 **** * or visit www.oracle.com if you need additional information or have any * questions. */ #include <stdlib.h> - #include <jni.h> #include <windows.h> #ifdef __cplusplus extern "C" { #endif JNIEXPORT jintArray JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegOpenKey (JNIEnv* env, jclass this_class, jint hKey, jbyteArray lpSubKey, jint securityMask) { --- 22,35 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ #include <stdlib.h> #include <windows.h> + #include "jni.h" + #include "jni_util.h" + #include "jvm.h" #ifdef __cplusplus extern "C" { #endif JNIEXPORT jintArray JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegOpenKey (JNIEnv* env, jclass this_class, jint hKey, jbyteArray lpSubKey, jint securityMask) {
*** 35,50 **** --- 37,55 ---- char* str; int tmp[2]; int errorCode=-1; jintArray result; str = (*env)->GetByteArrayElements(env, lpSubKey, NULL); + CHECK_NULL_RETURN(str, NULL); errorCode = RegOpenKeyEx((HKEY)hKey, str, 0, securityMask, &handle); (*env)->ReleaseByteArrayElements(env, lpSubKey, str, 0); tmp[0]= (int) handle; tmp[1]= errorCode; result = (*env)->NewIntArray(env,2); + if (result != NULL) { (*env)->SetIntArrayRegion(env, result, 0, 2, tmp); + } return result; } JNIEXPORT jint JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegCloseKey (JNIEnv* env, jclass this_class, jint hKey) {
*** 56,84 **** HKEY handle; char* str; int tmp[3]; DWORD lpdwDisposition; int errorCode; ! jintArray result; str = (*env)->GetByteArrayElements(env, lpSubKey, NULL); errorCode = RegCreateKeyEx((HKEY)hKey, str, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &handle, &lpdwDisposition); (*env)->ReleaseByteArrayElements(env, lpSubKey, str, 0); tmp[0]= (int) handle; tmp[1]= errorCode; tmp[2]= lpdwDisposition; result = (*env)->NewIntArray(env,3); (*env)->SetIntArrayRegion(env, result, 0, 3, tmp); return result; } JNIEXPORT jint JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegDeleteKey (JNIEnv* env, jclass this_class, jint hKey, jbyteArray lpSubKey) { char* str; int result; str = (*env)->GetByteArrayElements(env, lpSubKey, NULL); result = RegDeleteKey((HKEY)hKey, str); (*env)->ReleaseByteArrayElements(env, lpSubKey, str, 0); return result; }; --- 61,93 ---- HKEY handle; char* str; int tmp[3]; DWORD lpdwDisposition; int errorCode; ! jintArray result = NULL; str = (*env)->GetByteArrayElements(env, lpSubKey, NULL); + CHECK_NULL_RETURN(str, NULL); errorCode = RegCreateKeyEx((HKEY)hKey, str, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &handle, &lpdwDisposition); (*env)->ReleaseByteArrayElements(env, lpSubKey, str, 0); tmp[0]= (int) handle; tmp[1]= errorCode; tmp[2]= lpdwDisposition; result = (*env)->NewIntArray(env,3); + if (result != NULL) { (*env)->SetIntArrayRegion(env, result, 0, 3, tmp); + } return result; } JNIEXPORT jint JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegDeleteKey (JNIEnv* env, jclass this_class, jint hKey, jbyteArray lpSubKey) { char* str; int result; str = (*env)->GetByteArrayElements(env, lpSubKey, NULL); + CHECK_NULL_RETURN(str, -1); result = RegDeleteKey((HKEY)hKey, str); (*env)->ReleaseByteArrayElements(env, lpSubKey, str, 0); return result; };
*** 94,121 **** char* buffer; jbyteArray result; DWORD valueType; DWORD valueSize; valueNameStr = (*env)->GetByteArrayElements(env, valueName, NULL); if (RegQueryValueEx((HKEY)hKey, valueNameStr, NULL, &valueType, NULL, &valueSize) != ERROR_SUCCESS) { (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); return NULL; } buffer = (char*)malloc(valueSize); ! if (RegQueryValueEx((HKEY)hKey, valueNameStr, NULL, &valueType, buffer, &valueSize) != ERROR_SUCCESS) { free(buffer); (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); return NULL; } if (valueType == REG_SZ) { result = (*env)->NewByteArray(env, valueSize); (*env)->SetByteArrayRegion(env, result, 0, valueSize, buffer); } else { result = NULL; } free(buffer); (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); --- 103,138 ---- char* buffer; jbyteArray result; DWORD valueType; DWORD valueSize; valueNameStr = (*env)->GetByteArrayElements(env, valueName, NULL); + CHECK_NULL_RETURN(valueNameStr, NULL); if (RegQueryValueEx((HKEY)hKey, valueNameStr, NULL, &valueType, NULL, &valueSize) != ERROR_SUCCESS) { (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); return NULL; } buffer = (char*)malloc(valueSize); ! if (buffer != NULL) { if (RegQueryValueEx((HKEY)hKey, valueNameStr, NULL, &valueType, buffer, &valueSize) != ERROR_SUCCESS) { free(buffer); (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); return NULL; } + } else { + JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); + (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); + return NULL; + } if (valueType == REG_SZ) { result = (*env)->NewByteArray(env, valueSize); + if (result != NULL) { (*env)->SetByteArrayRegion(env, result, 0, valueSize, buffer); + } } else { result = NULL; } free(buffer); (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0);
*** 133,164 **** int nameSize = -1; int error_code = -1; if ((valueName == NULL)||(data == NULL)) {return -1;} size = (*env)->GetArrayLength(env, data); dataStr = (*env)->GetByteArrayElements(env, data, NULL); valueNameStr = (*env)->GetByteArrayElements(env, valueName, NULL); error_code = RegSetValueEx((HKEY)hKey, valueNameStr, 0, REG_SZ, dataStr, size); - (*env)->ReleaseByteArrayElements(env, data, dataStr, 0); (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); return error_code; } JNIEXPORT jint JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegDeleteValue (JNIEnv* env, jclass this_class, jint hKey, jbyteArray valueName) { char* valueNameStr; int error_code = -1; if (valueName == NULL) {return -1;} valueNameStr = (*env)->GetByteArrayElements(env, valueName, NULL); error_code = RegDeleteValue((HKEY)hKey, valueNameStr); (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); return error_code; } JNIEXPORT jintArray JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegQueryInfoKey (JNIEnv* env, jclass this_class, jint hKey) { ! jintArray result; int tmp[5]; int valuesNumber = -1; int maxValueNameLength = -1; int maxSubKeyLength = -1; int subKeysNumber = -1; --- 150,185 ---- int nameSize = -1; int error_code = -1; if ((valueName == NULL)||(data == NULL)) {return -1;} size = (*env)->GetArrayLength(env, data); dataStr = (*env)->GetByteArrayElements(env, data, NULL); + CHECK_NULL_RETURN(dataStr, -1); valueNameStr = (*env)->GetByteArrayElements(env, valueName, NULL); + if (valueNameStr != NULL) { error_code = RegSetValueEx((HKEY)hKey, valueNameStr, 0, REG_SZ, dataStr, size); (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); + } + (*env)->ReleaseByteArrayElements(env, data, dataStr, 0); return error_code; } JNIEXPORT jint JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegDeleteValue (JNIEnv* env, jclass this_class, jint hKey, jbyteArray valueName) { char* valueNameStr; int error_code = -1; if (valueName == NULL) {return -1;} valueNameStr = (*env)->GetByteArrayElements(env, valueName, NULL); + CHECK_NULL_RETURN(valueNameStr, -1); error_code = RegDeleteValue((HKEY)hKey, valueNameStr); (*env)->ReleaseByteArrayElements(env, valueName, valueNameStr, 0); return error_code; } JNIEXPORT jintArray JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegQueryInfoKey (JNIEnv* env, jclass this_class, jint hKey) { ! jintArray result = NULL; int tmp[5]; int valuesNumber = -1; int maxValueNameLength = -1; int maxSubKeyLength = -1; int subKeysNumber = -1;
*** 171,197 **** --- 192,226 ---- tmp[1]= (int)errorCode; tmp[2]= valuesNumber; tmp[3]= maxSubKeyLength; tmp[4]= maxValueNameLength; result = (*env)->NewIntArray(env,5); + if (result != NULL) { (*env)->SetIntArrayRegion(env, result, 0, 5, tmp); + } return result; } JNIEXPORT jbyteArray JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegEnumKeyEx (JNIEnv* env, jclass this_class, jint hKey , jint subKeyIndex, jint maxKeyLength) { int size = maxKeyLength; jbyteArray result; char* buffer = NULL; buffer = (char*)malloc(maxKeyLength); + if (buffer == NULL) { + JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); + return NULL; + } if (RegEnumKeyEx((HKEY) hKey, subKeyIndex, buffer, &size, NULL, NULL, NULL, NULL) != ERROR_SUCCESS){ free(buffer); return NULL; } result = (*env)->NewByteArray(env, size + 1); + if (result != NULL) { (*env)->SetByteArrayRegion(env, result, 0, size + 1, buffer); + } free(buffer); return result; } JNIEXPORT jbyteArray JNICALL Java_java_util_prefs_WindowsPreferences_WindowsRegEnumValue
*** 199,216 **** --- 228,251 ---- int size = maxValueNameLength; jbyteArray result; char* buffer = NULL; int error_code; buffer = (char*)malloc(maxValueNameLength); + if (buffer == NULL) { + JNU_ThrowOutOfMemoryError(env, "native memory allocation failed"); + return NULL; + } error_code = RegEnumValue((HKEY) hKey, valueIndex, buffer, &size, NULL, NULL, NULL, NULL); if (error_code!= ERROR_SUCCESS){ free(buffer); return NULL; } result = (*env)->NewByteArray(env, size + 1); + if (result != NULL) { (*env)->SetByteArrayRegion(env, result, 0, size + 1, buffer); + } free(buffer); return result; }