Exceptions in JNI

Archie Cobbs archie at whistle.com
Sun Jul 19 11:30:08 PDT 1998


Stephen Crowley writes:
> Are exceptions broken in the JNI or what? When trying to call a method
> that uses StringTokenizer.tokenCount() it ALWAYS throws a
> StringIndexOutOfBoundsException. I looked at the source to
> StringTokenizer and it should catch the exception but it doesn't.
> Running Kaffe 1.0 on linux

Try the patch below, it fixes a JNI bug whereby accessing the very
last element of an array incorrectly causes an IndexOutOfBoundsException.

-Archie

___________________________________________________________________________
Archie Cobbs   *   Whistle Communications, Inc.  *   http://www.whistle.com

Index: jni.c
===================================================================
RCS file: /cvs/mod/net/kaffe/kaffe/kaffevm/jni.c,v
retrieving revision 1.1.1.2
retrieving revision 1.1.1.2.2.1
diff -c -u -r1.1.1.2 -r1.1.1.2.2.1
--- jni.c	1998/07/14 16:48:50	1.1.1.2
+++ jni.c	1998/07/16 18:13:01	1.1.1.2.2.1
@@ -3116,7 +3116,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfBoolean*)arr) || start + len >= obj_length((HArrayOfBoolean*)arr)) {
+	if (start >= obj_length((HArrayOfBoolean*)arr) || start + len > obj_length((HArrayOfBoolean*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(data, &unhand((HArrayOfBoolean*)arr)->body[start], len * sizeof(jboolean));
@@ -3129,7 +3129,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfByte*)arr) || start + len >= obj_length((HArrayOfByte*)arr)) {
+	if (start >= obj_length((HArrayOfByte*)arr) || start + len > obj_length((HArrayOfByte*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(data, &unhand((HArrayOfByte*)arr)->body[start], len * sizeof(jbyte));
@@ -3142,7 +3142,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfChar*)arr) || start + len >= obj_length((HArrayOfChar*)arr)) {
+	if (start >= obj_length((HArrayOfChar*)arr) || start + len > obj_length((HArrayOfChar*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(data, &unhand((HArrayOfChar*)arr)->body[start], len * sizeof(jchar));
@@ -3155,7 +3155,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfShort*)arr) || start + len >= obj_length((HArrayOfShort*)arr)) {
+	if (start >= obj_length((HArrayOfShort*)arr) || start + len > obj_length((HArrayOfShort*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(data, &unhand((HArrayOfShort*)arr)->body[start], len * sizeof(jshort));
@@ -3168,7 +3168,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfInt*)arr) || start + len >= obj_length((HArrayOfInt*)arr)) {
+	if (start >= obj_length((HArrayOfInt*)arr) || start + len > obj_length((HArrayOfInt*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(data, &unhand((HArrayOfInt*)arr)->body[start], len * sizeof(jint));
@@ -3181,7 +3181,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfLong*)arr) || start + len >= obj_length((HArrayOfLong*)arr)) {
+	if (start >= obj_length((HArrayOfLong*)arr) || start + len > obj_length((HArrayOfLong*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(data, &unhand((HArrayOfLong*)arr)->body[start], len * sizeof(jlong));
@@ -3194,7 +3194,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfFloat*)arr) || start + len >= obj_length((HArrayOfFloat*)arr)) {
+	if (start >= obj_length((HArrayOfFloat*)arr) || start + len > obj_length((HArrayOfFloat*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(data, &unhand((HArrayOfFloat*)arr)->body[start], len * sizeof(jfloat));
@@ -3207,7 +3207,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfDouble*)arr) || start + len >= obj_length((HArrayOfDouble*)arr)) {
+	if (start >= obj_length((HArrayOfDouble*)arr) || start + len > obj_length((HArrayOfDouble*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(data, &unhand((HArrayOfDouble*)arr)->body[start], len * sizeof(jdouble));
@@ -3220,7 +3220,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfBoolean*)arr) || start+len >= obj_length((HArrayOfBoolean*)arr)) {
+	if (start >= obj_length((HArrayOfBoolean*)arr) || start+len > obj_length((HArrayOfBoolean*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(&unhand((HArrayOfBoolean*)arr)->body[start], data, len * sizeof(jboolean));
@@ -3233,7 +3233,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfByte*)arr) || start+len >= obj_length((HArrayOfByte*)arr)) {
+	if (start >= obj_length((HArrayOfByte*)arr) || start+len > obj_length((HArrayOfByte*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(&unhand((HArrayOfByte*)arr)->body[start], data, len * sizeof(jbyte));
@@ -3246,7 +3246,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfChar*)arr) || start+len >= obj_length((HArrayOfChar*)arr)) {
+	if (start >= obj_length((HArrayOfChar*)arr) || start+len > obj_length((HArrayOfChar*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(&unhand((HArrayOfChar*)arr)->body[start], data, len * sizeof(jchar));
@@ -3259,7 +3259,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfShort*)arr) || start+len >= obj_length((HArrayOfShort*)arr)) {
+	if (start >= obj_length((HArrayOfShort*)arr) || start+len > obj_length((HArrayOfShort*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(&unhand((HArrayOfShort*)arr)->body[start], data, len * sizeof(jshort));
@@ -3272,7 +3272,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfInt*)arr) || start+len >= obj_length((HArrayOfInt*)arr)) {
+	if (start >= obj_length((HArrayOfInt*)arr) || start+len > obj_length((HArrayOfInt*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(&unhand((HArrayOfInt*)arr)->body[start], data, len * sizeof(jint));
@@ -3285,7 +3285,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfLong*)arr) || start+len >= obj_length((HArrayOfLong*)arr)) {
+	if (start >= obj_length((HArrayOfLong*)arr) || start+len > obj_length((HArrayOfLong*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(&unhand((HArrayOfLong*)arr)->body[start], data, len * sizeof(jlong));
@@ -3298,7 +3298,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfFloat*)arr) || start+len >= obj_length((HArrayOfFloat*)arr)) {
+	if (start >= obj_length((HArrayOfFloat*)arr) || start+len > obj_length((HArrayOfFloat*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(&unhand((HArrayOfFloat*)arr)->body[start], data, len * sizeof(jfloat));
@@ -3311,7 +3311,7 @@
 {
 	BEGIN_EXCEPTION_HANDLING_VOID();
 
-	if (start >= obj_length((HArrayOfDouble*)arr) || start+len >= obj_length((HArrayOfDouble*)arr)) {
+	if (start >= obj_length((HArrayOfDouble*)arr) || start+len > obj_length((HArrayOfDouble*)arr)) {
 		throwException(ArrayIndexOutOfBoundsException);
 	}
 	memcpy(&unhand((HArrayOfDouble*)arr)->body[start], data, len * sizeof(jdouble));


More information about the kaffe mailing list