diff --git a/jdk/src/windows/native/com/sun/security/auth/module/nt.c b/jdk/src/windows/native/com/sun/security/auth/module/nt.c index 038ceb14f95..72c0ef84f33 100644 --- a/jdk/src/windows/native/com/sun/security/auth/module/nt.c +++ b/jdk/src/windows/native/com/sun/security/auth/module/nt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,12 +43,6 @@ BOOL getImpersonationToken(PHANDLE impersonationToken); BOOL getTextualSid(PSID pSid, LPTSTR TextualSid, LPDWORD lpdwBufferLen); void DisplayErrorText(DWORD dwLastError); -static void throwIllegalArgumentException(JNIEnv *env, const char *msg) { - jclass clazz = (*env)->FindClass(env, "java/lang/IllegalArgumentException"); - if (clazz != NULL) - (*env)->ThrowNew(env, clazz, msg); -} - JNIEXPORT jlong JNICALL Java_com_sun_security_auth_module_NTSystem_getImpersonationToken0 (JNIEnv *env, jobject obj) { @@ -68,6 +62,7 @@ Java_com_sun_security_auth_module_NTSystem_getCurrent long i, j = 0; HANDLE tokenHandle = INVALID_HANDLE_VALUE; + BOOL systemError = FALSE; LPTSTR userName = NULL; // user name LPTSTR userSid = NULL; // user sid @@ -121,59 +116,70 @@ Java_com_sun_security_auth_module_NTSystem_getCurrent fid = (*env)->GetFieldID(env, cls, "userName", "Ljava/lang/String;"); if (fid == 0) { - (*env)->ExceptionClear(env); - throwIllegalArgumentException(env, "invalid field: userName"); - goto cleanup; + jclass newExcCls = + (*env)->FindClass(env, "java/lang/IllegalArgumentException"); + if (newExcCls == 0) { + // Unable to find exception class + systemError = TRUE; + goto out; + } + (*env)->ThrowNew(env, newExcCls, "invalid field: userName"); } jstr = (*env)->NewStringUTF(env, userName); - if (jstr == NULL) - goto cleanup; (*env)->SetObjectField(env, obj, fid, jstr); fid = (*env)->GetFieldID(env, cls, "userSID", "Ljava/lang/String;"); if (fid == 0) { - (*env)->ExceptionClear(env); - throwIllegalArgumentException(env, "invalid field: userSID"); - goto cleanup; + jclass newExcCls = + (*env)->FindClass(env, "java/lang/IllegalArgumentException"); + if (newExcCls == 0) { + systemError = TRUE; + goto out; + } + (*env)->ThrowNew(env, newExcCls, "invalid field: userSID"); } jstr = (*env)->NewStringUTF(env, userSid); - if (jstr == NULL) - goto cleanup; (*env)->SetObjectField(env, obj, fid, jstr); fid = (*env)->GetFieldID(env, cls, "domain", "Ljava/lang/String;"); if (fid == 0) { - (*env)->ExceptionClear(env); - throwIllegalArgumentException(env, "invalid field: domain"); - goto cleanup; + jclass newExcCls = + (*env)->FindClass(env, "java/lang/IllegalArgumentException"); + if (newExcCls == 0) { + systemError = TRUE; + goto out; + } + (*env)->ThrowNew(env, newExcCls, "invalid field: domain"); } jstr = (*env)->NewStringUTF(env, domainName); - if (jstr == NULL) - goto cleanup; (*env)->SetObjectField(env, obj, fid, jstr); if (domainSid != NULL) { fid = (*env)->GetFieldID(env, cls, "domainSID", "Ljava/lang/String;"); if (fid == 0) { - (*env)->ExceptionClear(env); - throwIllegalArgumentException(env, "invalid field: domainSID"); - goto cleanup; + jclass newExcCls = + (*env)->FindClass(env, "java/lang/IllegalArgumentException"); + if (newExcCls == 0) { + systemError = TRUE; + goto out; + } + (*env)->ThrowNew(env, newExcCls, "invalid field: domainSID"); } jstr = (*env)->NewStringUTF(env, domainSid); - if (jstr == NULL) - goto cleanup; (*env)->SetObjectField(env, obj, fid, jstr); } fid = (*env)->GetFieldID(env, cls, "primaryGroupID", "Ljava/lang/String;"); if (fid == 0) { - (*env)->ExceptionClear(env); - throwIllegalArgumentException(env, "invalid field: PrimaryGroupID"); - goto cleanup; + jclass newExcCls = + (*env)->FindClass(env, "java/lang/IllegalArgumentException"); + if (newExcCls == 0) { + systemError = TRUE; + goto out; + } + (*env)->ThrowNew(env, newExcCls, "invalid field: PrimaryGroupID"); } jstr = (*env)->NewStringUTF(env, primaryGroup); - if (jstr == NULL) - goto cleanup; (*env)->SetObjectField(env, obj, fid, jstr); // primary group may or may not be part of supplementary groups @@ -198,14 +204,19 @@ Java_com_sun_security_auth_module_NTSystem_getCurrent fid = (*env)->GetFieldID(env, cls, "groupIDs", "[Ljava/lang/String;"); if (fid == 0) { - (*env)->ExceptionClear(env); - throwIllegalArgumentException(env, "groupIDs"); - goto cleanup; + jclass newExcCls = + (*env)->FindClass(env, "java/lang/IllegalArgumentException"); + if (newExcCls == 0) { + systemError = TRUE; + goto out; + } + (*env)->ThrowNew(env, newExcCls, "invalid field: groupIDs"); } stringClass = (*env)->FindClass(env, "java/lang/String"); - if (stringClass == NULL) - goto cleanup; + if (stringClass == 0) { + goto out; + } if (pIndex == -1) { // primary group not in groups array @@ -215,8 +226,6 @@ Java_com_sun_security_auth_module_NTSystem_getCurrent // allocate one less array entry and do not add into new array jgroups = (*env)->NewObjectArray(env, numGroups-1, stringClass, 0); } - if (jgroups == NULL) - goto cleanup; for (i = 0, j = 0; i < (long)numGroups; i++) { if (pIndex == i) { @@ -224,14 +233,12 @@ Java_com_sun_security_auth_module_NTSystem_getCurrent continue; } jstr = (*env)->NewStringUTF(env, groups[i]); - if (jstr == NULL) - goto cleanup; (*env)->SetObjectArrayElement(env, jgroups, j++, jstr); } (*env)->SetObjectField(env, obj, fid, jgroups); } -cleanup: +out: if (userName != NULL) { HeapFree(GetProcessHeap(), 0, userName); } @@ -257,6 +264,11 @@ cleanup: } CloseHandle(tokenHandle); + if (systemError && debug) { + printf(" [getCurrent] System Error: "); + printf("unable to find IllegalArgumentException class\n"); + } + return; } @@ -324,7 +336,7 @@ BOOL getUser(HANDLE tokenHandle, LPTSTR *userName, DisplayErrorText(GetLastError()); } error = TRUE; - goto cleanup; + goto out; } if (debug) { @@ -357,7 +369,7 @@ BOOL getUser(HANDLE tokenHandle, LPTSTR *userName, DisplayErrorText(GetLastError()); } error = TRUE; - goto cleanup; + goto out; } if (debug) { @@ -399,7 +411,7 @@ BOOL getUser(HANDLE tokenHandle, LPTSTR *userName, DisplayErrorText(GetLastError()); } // ok not to have a domain SID (no error) - goto cleanup; + goto out; } bufSize = 0; @@ -410,7 +422,7 @@ BOOL getUser(HANDLE tokenHandle, LPTSTR *userName, printf(" [getUser] domainSid: %s\n", *domainSid); } -cleanup: +out: if (tokenUserInfo != NULL) { HeapFree(GetProcessHeap(), 0, tokenUserInfo); } @@ -454,7 +466,7 @@ BOOL getPrimaryGroup(HANDLE tokenHandle, LPTSTR *primaryGroup) { DisplayErrorText(GetLastError()); } error = TRUE; - goto cleanup; + goto out; } if (debug) { @@ -469,7 +481,7 @@ BOOL getPrimaryGroup(HANDLE tokenHandle, LPTSTR *primaryGroup) { printf(" [getPrimaryGroup] primaryGroup: %s\n", *primaryGroup); } -cleanup: +out: if (tokenGroupInfo != NULL) { HeapFree(GetProcessHeap(), 0, tokenGroupInfo); } @@ -507,7 +519,7 @@ BOOL getGroups(HANDLE tokenHandle, PDWORD numGroups, LPTSTR **groups) { DisplayErrorText(GetLastError()); } error = TRUE; - goto cleanup; + goto out; } if (debug) { @@ -516,7 +528,7 @@ BOOL getGroups(HANDLE tokenHandle, PDWORD numGroups, LPTSTR **groups) { if (tokenGroupInfo->GroupCount == 0) { // no groups - goto cleanup; + goto out; } // return group info @@ -533,7 +545,7 @@ BOOL getGroups(HANDLE tokenHandle, PDWORD numGroups, LPTSTR **groups) { } } -cleanup: +out: if (tokenGroupInfo != NULL) { HeapFree(GetProcessHeap(), 0, tokenGroupInfo); } @@ -577,7 +589,8 @@ BOOL getImpersonationToken(PHANDLE impersonationToken) { CloseHandle(dupToken); if (debug) { - printf(" [getImpersonationToken] token = %d\n", *impersonationToken); + printf(" [getImpersonationToken] token = %p\n", + (void *)*impersonationToken); } return TRUE; }