--- a/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c Mon Mar 02 15:10:55 2009 -0800
+++ b/jdk/src/share/native/sun/security/pkcs11/wrapper/p11_objmgmt.c Tue Mar 03 19:50:59 2009 -0800
@@ -1,5 +1,5 @@
/*
- * Portions Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * Portions Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
*/
/* Copyright (c) 2002 Graz University of Technology. All rights reserved.
@@ -81,16 +81,14 @@
ckSessionHandle = jLongToCKULong(jSessionHandle);
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
+ if ((*env)->ExceptionCheck(env)) { return 0L; }
rv = (*ckpFunctions->C_CreateObject)(ckSessionHandle, ckpAttributes, ckAttributesLength, &ckObjectHandle);
jObjectHandle = ckULongToJLong(ckObjectHandle);
- for(i=0; i<ckAttributesLength; i++)
- if(ckpAttributes[i].pValue != NULL_PTR)
- free(ckpAttributes[i].pValue);
- free(ckpAttributes);
+ freeCKAttributeArray(ckpAttributes, ckAttributesLength);
- if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
+ if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
return jObjectHandle ;
}
@@ -126,14 +124,12 @@
ckSessionHandle = jLongToCKULong(jSessionHandle);
ckObjectHandle = jLongToCKULong(jObjectHandle);
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
+ if ((*env)->ExceptionCheck(env)) { return 0L; }
rv = (*ckpFunctions->C_CopyObject)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength, &ckNewObjectHandle);
jNewObjectHandle = ckULongToJLong(ckNewObjectHandle);
- for(i=0; i<ckAttributesLength; i++)
- if(ckpAttributes[i].pValue != NULL_PTR)
- free(ckpAttributes[i].pValue);
- free(ckpAttributes);
+ freeCKAttributeArray(ckpAttributes, ckAttributesLength);
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
@@ -164,7 +160,7 @@
ckObjectHandle = jLongToCKULong(jObjectHandle);
rv = (*ckpFunctions->C_DestroyObject)(ckSessionHandle, ckObjectHandle);
- if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
+ if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
}
#endif
@@ -194,7 +190,7 @@
ckObjectHandle = jLongToCKULong(jObjectHandle);
rv = (*ckpFunctions->C_GetObjectSize)(ckSessionHandle, ckObjectHandle, &ckObjectSize);
- if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
+ if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return 0L ; }
jObjectSize = ckULongToJLong(ckObjectSize);
@@ -221,7 +217,7 @@
CK_ATTRIBUTE_PTR ckpAttributes = NULL_PTR;
CK_ULONG ckAttributesLength;
CK_ULONG ckBufferLength;
- CK_ULONG i;
+ CK_ULONG i, j;
jobject jAttribute;
CK_RV rv;
@@ -238,19 +234,20 @@
ckObjectHandle = jLongToCKULong(jObjectHandle);
TRACE1("jAttributeArrayToCKAttributeArray now with jTemplate = %d", jTemplate);
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
+ if ((*env)->ExceptionCheck(env)) { return; }
+
TRACE2("DEBUG: jAttributeArrayToCKAttributeArray finished with ckpAttribute = %d, Length = %d\n", ckpAttributes, ckAttributesLength);
/* first set all pValue to NULL, to get the needed buffer length */
for(i = 0; i < ckAttributesLength; i++) {
- if(ckpAttributes[i].pValue != NULL_PTR) {
+ if (ckpAttributes[i].pValue != NULL_PTR) {
free(ckpAttributes[i].pValue);
+ ckpAttributes[i].pValue = NULL_PTR;
}
}
- for (i = 0; i < ckAttributesLength; i++) {
- ckpAttributes[i].pValue = NULL_PTR;
- }
+
rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
- if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
+ if (ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) {
free(ckpAttributes);
return ;
}
@@ -261,27 +258,34 @@
for (i = 0; i < ckAttributesLength; i++) {
ckBufferLength = sizeof(CK_BYTE) * ckpAttributes[i].ulValueLen;
ckpAttributes[i].pValue = (void *) malloc(ckBufferLength);
+ if (ckpAttributes[i].pValue == NULL) {
+ freeCKAttributeArray(ckpAttributes, i);
+ JNU_ThrowOutOfMemoryError(env, 0);
+ return;
+ }
ckpAttributes[i].ulValueLen = ckBufferLength;
}
/* now get the attributes with all values */
rv = (*ckpFunctions->C_GetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
- /* copy back the values to the Java attributes */
- for (i = 0; i < ckAttributesLength; i++) {
- jAttribute = ckAttributePtrToJAttribute(env, &(ckpAttributes[i]));
- (*env)->SetObjectArrayElement(env, jTemplate, i, jAttribute);
- }
-
- for(i=0; i<ckAttributesLength; i++) {
- if(ckpAttributes[i].pValue != NULL_PTR) {
- free(ckpAttributes[i].pValue);
+ if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
+ /* copy back the values to the Java attributes */
+ for (i = 0; i < ckAttributesLength; i++) {
+ jAttribute = ckAttributePtrToJAttribute(env, &(ckpAttributes[i]));
+ if (jAttribute == NULL) {
+ freeCKAttributeArray(ckpAttributes, ckAttributesLength);
+ return;
+ }
+ (*env)->SetObjectArrayElement(env, jTemplate, i, jAttribute);
+ if ((*env)->ExceptionCheck(env)) {
+ freeCKAttributeArray(ckpAttributes, ckAttributesLength);
+ return;
+ }
}
}
- free(ckpAttributes);
+ freeCKAttributeArray(ckpAttributes, ckAttributesLength);
TRACE0("FINISHED\n");
-
- if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return ; }
}
#endif
@@ -312,15 +316,11 @@
ckSessionHandle = jLongToCKULong(jSessionHandle);
ckObjectHandle = jLongToCKULong(jObjectHandle);
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
+ if ((*env)->ExceptionCheck(env)) { return; }
rv = (*ckpFunctions->C_SetAttributeValue)(ckSessionHandle, ckObjectHandle, ckpAttributes, ckAttributesLength);
- for(i=0; i<ckAttributesLength; i++) {
- if(ckpAttributes[i].pValue != NULL_PTR) {
- free(ckpAttributes[i].pValue);
- }
- }
- free(ckpAttributes);
+ freeCKAttributeArray(ckpAttributes, ckAttributesLength);
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
}
@@ -355,15 +355,11 @@
ckSessionHandle = jLongToCKULong(jSessionHandle);
jAttributeArrayToCKAttributeArray(env, jTemplate, &ckpAttributes, &ckAttributesLength);
+ if ((*env)->ExceptionCheck(env)) { return; }
rv = (*ckpFunctions->C_FindObjectsInit)(ckSessionHandle, ckpAttributes, ckAttributesLength);
- for(i=0; i<ckAttributesLength; i++) {
- if(ckpAttributes[i].pValue != NULL_PTR) {
- free(ckpAttributes[i].pValue);
- }
- }
- free(ckpAttributes);
+ freeCKAttributeArray(ckpAttributes, ckAttributesLength);
TRACE0("FINISHED\n");
if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return; }
@@ -397,14 +393,18 @@
ckSessionHandle = jLongToCKULong(jSessionHandle);
ckMaxObjectLength = jLongToCKULong(jMaxObjectCount);
ckpObjectHandleArray = (CK_OBJECT_HANDLE_PTR) malloc(sizeof(CK_OBJECT_HANDLE) * ckMaxObjectLength);
+ if (ckpObjectHandleArray == NULL) {
+ JNU_ThrowOutOfMemoryError(env, 0);
+ return NULL;
+ }
rv = (*ckpFunctions->C_FindObjects)(ckSessionHandle, ckpObjectHandleArray, ckMaxObjectLength, &ckActualObjectCount);
+ if (ckAssertReturnValueOK(env, rv) == CK_ASSERT_OK) {
+ jObjectHandleArray = ckULongArrayToJLongArray(env, ckpObjectHandleArray, ckActualObjectCount);
+ }
- jObjectHandleArray = ckULongArrayToJLongArray(env, ckpObjectHandleArray, ckActualObjectCount);
free(ckpObjectHandleArray);
- if(ckAssertReturnValueOK(env, rv) != CK_ASSERT_OK) { return NULL ; }
-
return jObjectHandleArray ;
}
#endif