--- a/jdk/src/share/native/sun/security/smartcardio/pcsc.c Tue Apr 01 17:25:55 2014 -0700
+++ b/jdk/src/share/native/sun/security/smartcardio/pcsc.c Wed Apr 02 12:19:11 2014 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -64,17 +64,30 @@
#define J2PCSC_EXCEPTION_NAME "sun/security/smartcardio/PCSCException"
+extern void throwByName(JNIEnv *, const char *, const char *);
+
+void throwOutOfMemoryError(JNIEnv *env, const char *msg) {
+ throwByName(env, "java/lang/OutOfMemoryError", msg);
+}
+
void throwPCSCException(JNIEnv* env, LONG code) {
jclass pcscClass;
jmethodID constructor;
jthrowable pcscException;
pcscClass = (*env)->FindClass(env, J2PCSC_EXCEPTION_NAME);
- assert(pcscClass != NULL);
+ if (pcscClass == NULL) {
+ return;
+ }
constructor = (*env)->GetMethodID(env, pcscClass, "<init>", "(I)V");
- assert(constructor != NULL);
- pcscException = (jthrowable) (*env)->NewObject(env, pcscClass, constructor, (jint)code);
- (*env)->Throw(env, pcscException);
+ if (constructor == NULL) {
+ return;
+ }
+ pcscException = (jthrowable) (*env)->NewObject(env, pcscClass,
+ constructor, (jint)code);
+ if (pcscException != NULL) {
+ (*env)->Throw(env, pcscException);
+ }
}
jboolean handleRV(JNIEnv* env, LONG code) {
@@ -121,6 +134,10 @@
}
tab = (char **)malloc(cnt * sizeof(char *));
+ if (tab == NULL) {
+ throwOutOfMemoryError(env, NULL);
+ return NULL;
+ }
cnt = 0;
cp = spec;
@@ -130,12 +147,26 @@
}
stringClass = (*env)->FindClass(env, "java/lang/String");
- assert(stringClass != NULL);
+ if (stringClass == NULL) {
+ free(tab);
+ return NULL;
+ }
result = (*env)->NewObjectArray(env, cnt, stringClass, NULL);
- while (cnt-- > 0) {
- js = (*env)->NewStringUTF(env, tab[cnt]);
- (*env)->SetObjectArrayElement(env, result, cnt, js);
+ if (result != NULL) {
+ while (cnt-- > 0) {
+ js = (*env)->NewStringUTF(env, tab[cnt]);
+ if ((*env)->ExceptionCheck(env)) {
+ free(tab);
+ return NULL;
+ }
+ (*env)->SetObjectArrayElement(env, result, cnt, js);
+ if ((*env)->ExceptionCheck(env)) {
+ free(tab);
+ return NULL;
+ }
+ (*env)->DeleteLocalRef(env, js);
+ }
}
free(tab);
return result;
@@ -158,6 +189,11 @@
dprintf1("-size: %d\n", size);
mszReaders = malloc(size);
+ if (mszReaders == NULL) {
+ throwOutOfMemoryError(env, NULL);
+ return NULL;
+ }
+
rv = CALL_SCardListReaders(context, NULL, mszReaders, &size);
if (handleRV(env, rv)) {
free(mszReaders);
@@ -181,6 +217,9 @@
DWORD proto;
readerName = (*env)->GetStringUTFChars(env, jReaderName, NULL);
+ if (readerName == NULL) {
+ return 0;
+ }
rv = CALL_SCardConnect(context, readerName, jShareMode, jPreferredProtocols, &card, &proto);
(*env)->ReleaseStringUTFChars(env, jReaderName, readerName);
dprintf1("-cardhandle: %x\n", card);
@@ -210,6 +249,9 @@
sendPci.cbPciLength = sizeof(SCARD_IO_REQUEST);
sbuf = (unsigned char *) ((*env)->GetByteArrayElements(env, jBuf, NULL));
+ if (sbuf == NULL) {
+ return NULL;
+ }
rv = CALL_SCardTransmit(card, &sendPci, sbuf + ofs, len, NULL, rbuf, &rlen);
(*env)->ReleaseByteArrayElements(env, jBuf, (jbyte *)sbuf, JNI_ABORT);
@@ -218,7 +260,12 @@
}
jOut = (*env)->NewByteArray(env, rlen);
- (*env)->SetByteArrayRegion(env, jOut, 0, rlen, (jbyte *)rbuf);
+ if (jOut != NULL) {
+ (*env)->SetByteArrayRegion(env, jOut, 0, rlen, (jbyte *)rbuf);
+ if ((*env)->ExceptionCheck(env)) {
+ return NULL;
+ }
+ }
return jOut;
}
@@ -234,7 +281,7 @@
DWORD state;
DWORD protocol;
jbyteArray jArray;
- jbyte tmp;
+ jbyte status[2];
rv = CALL_SCardStatus(card, readerName, &readerLen, &state, &protocol, atr, &atrLen);
if (handleRV(env, rv)) {
@@ -245,13 +292,19 @@
dprintf1("-protocol: %d\n", protocol);
jArray = (*env)->NewByteArray(env, atrLen);
+ if (jArray == NULL) {
+ return NULL;
+ }
(*env)->SetByteArrayRegion(env, jArray, 0, atrLen, (jbyte *)atr);
-
- tmp = (jbyte)state;
- (*env)->SetByteArrayRegion(env, jStatus, 0, 1, &tmp);
- tmp = (jbyte)protocol;
- (*env)->SetByteArrayRegion(env, jStatus, 1, 1, &tmp);
-
+ if ((*env)->ExceptionCheck(env)) {
+ return NULL;
+ }
+ status[0] = (jbyte) state;
+ status[1] = (jbyte) protocol;
+ (*env)->SetByteArrayRegion(env, jStatus, 0, 2, status);
+ if ((*env)->ExceptionCheck(env)) {
+ return NULL;
+ }
return jArray;
}
@@ -274,36 +327,72 @@
SCARDCONTEXT context = (SCARDCONTEXT)jContext;
LONG rv;
int readers = (*env)->GetArrayLength(env, jReaderNames);
- SCARD_READERSTATE *readerState = malloc(readers * sizeof(SCARD_READERSTATE));
+ SCARD_READERSTATE *readerState;
int i;
- jintArray jEventState;
- int *currentState = (*env)->GetIntArrayElements(env, jCurrentState, NULL);
+ jintArray jEventState = NULL;
+ int *currentState = NULL;
+ const char *readerName;
+
+ readerState = calloc(readers, sizeof(SCARD_READERSTATE));
+ if (readerState == NULL) {
+ throwOutOfMemoryError(env, NULL);
+ return NULL;
+ }
+
+ currentState = (*env)->GetIntArrayElements(env, jCurrentState, NULL);
+ if (currentState == NULL) {
+ free(readerState);
+ return NULL;
+ }
for (i = 0; i < readers; i++) {
jobject jReaderName = (*env)->GetObjectArrayElement(env, jReaderNames, i);
- readerState[i].szReader = (*env)->GetStringUTFChars(env, jReaderName, NULL);
+ if ((*env)->ExceptionCheck(env)) {
+ goto cleanup;
+ }
+ readerName = (*env)->GetStringUTFChars(env, jReaderName, NULL);
+ if (readerName == NULL) {
+ goto cleanup;
+ }
+ readerState[i].szReader = strdup(readerName);
+ (*env)->ReleaseStringUTFChars(env, jReaderName, readerName);
+ if (readerState[i].szReader == NULL) {
+ throwOutOfMemoryError(env, NULL);
+ goto cleanup;
+ }
readerState[i].pvUserData = NULL;
readerState[i].dwCurrentState = currentState[i];
readerState[i].dwEventState = SCARD_STATE_UNAWARE;
readerState[i].cbAtr = 0;
+ (*env)->DeleteLocalRef(env, jReaderName);
}
- (*env)->ReleaseIntArrayElements(env, jCurrentState, currentState, JNI_ABORT);
rv = CALL_SCardGetStatusChange(context, (DWORD)jTimeout, readerState, readers);
+ if (handleRV(env, rv)) {
+ goto cleanup;
+ }
jEventState = (*env)->NewIntArray(env, readers);
+ if (jEventState == NULL) {
+ goto cleanup;
+ }
for (i = 0; i < readers; i++) {
jint eventStateTmp;
- jobject jReaderName = (*env)->GetObjectArrayElement(env, jReaderNames, i);
dprintf3("-reader status %s: 0x%X, 0x%X\n", readerState[i].szReader,
readerState[i].dwCurrentState, readerState[i].dwEventState);
- (*env)->ReleaseStringUTFChars(env, jReaderName, readerState[i].szReader);
eventStateTmp = (jint)readerState[i].dwEventState;
(*env)->SetIntArrayRegion(env, jEventState, i, 1, &eventStateTmp);
+ if ((*env)->ExceptionCheck(env)) {
+ jEventState = NULL;
+ goto cleanup;
+ }
+ }
+cleanup:
+ (*env)->ReleaseIntArrayElements(env, jCurrentState, currentState, JNI_ABORT);
+ for (i = 0; i < readers; i++) {
+ free((char *)readerState[i].szReader);
}
free(readerState);
-
- handleRV(env, rv);
return jEventState;
}
@@ -336,13 +425,18 @@
{
SCARDHANDLE card = (SCARDHANDLE)jCard;
LONG rv;
- jbyte* sendBuffer = (*env)->GetByteArrayElements(env, jSendBuffer, NULL);
+ jbyte* sendBuffer;
jint sendBufferLength = (*env)->GetArrayLength(env, jSendBuffer);
jbyte receiveBuffer[MAX_STACK_BUFFER_SIZE];
jint receiveBufferLength = MAX_STACK_BUFFER_SIZE;
ULONG returnedLength = 0;
jbyteArray jReceiveBuffer;
+ sendBuffer = (*env)->GetByteArrayElements(env, jSendBuffer, NULL);
+ if (sendBuffer == NULL) {
+ return NULL;
+ }
+
#ifdef J2PCSC_DEBUG
{
int k;
@@ -375,7 +469,12 @@
#endif
jReceiveBuffer = (*env)->NewByteArray(env, returnedLength);
+ if (jReceiveBuffer == NULL) {
+ return NULL;
+ }
(*env)->SetByteArrayRegion(env, jReceiveBuffer, 0, returnedLength, receiveBuffer);
-
+ if ((*env)->ExceptionCheck(env)) {
+ return NULL;
+ }
return jReceiveBuffer;
}