Patch for tow JNI Bugs

Martin Kahlert martin.kahlert@infineon.com
Thu Apr 26 07:59:00 GMT 2001


Hi!
This fixes two bugs in JNI:
There were problems with wrong types in functions [G,S]et*ArrayRegion.
The other change in jni.cc addresses an off by one error
in [GS]etPrimitiveArrayRegion:
The condition start + len >= array->length is always valid 
if you copy a complete array (start=0, len = array->length).
This is wrong.
I changed the if condition to address overflow and negative len, too.
This should be correct (hopefully).
Bye,
Martin.
PS: Is it correct to post this into this list, only, or should it
 go to gcc-patches?
diff -Nrc gcc-20010423/libjava/include/jni.h gcc-20010423.orig/libjava/include/jni.h
*** gcc-20010423/libjava/include/jni.h	Thu Apr 26 13:58:39 2001
--- gcc-20010423.orig/libjava/include/jni.h	Sat Jul 1 01:09:44 2000
***************
*** 494,530 ****
 
 void 		(*GetBooleanArrayRegion) (JNIEnv *, jbooleanArray,
 					 jsize, jsize, jboolean *);
! void 		(*GetByteArrayRegion)	 (JNIEnv *, jbyteArray,
! 					 jsize, jsize, jbyte *);
! void 		(*GetCharArrayRegion)	 (JNIEnv *, jcharArray,
! 					 jsize, jsize, jchar *);
! void 		(*GetShortArrayRegion)	 (JNIEnv *, jshortArray,
! 					 jsize, jsize, jshort *);
! void 		(*GetIntArrayRegion)	 (JNIEnv *, jintArray,
! 					 jsize, jsize, jint *);
! void 		(*GetLongArrayRegion)	 (JNIEnv *, jlongArray,
! 					 jsize, jsize, jlong *);
! void 		(*GetFloatArrayRegion)	 (JNIEnv *, jfloatArray,
! 					 jsize, jsize, jfloat *);
! void 		(*GetDoubleArrayRegion)	 (JNIEnv *, jdoubleArray,
! 					 jsize, jsize, jdouble *);
 
 void 		(*SetBooleanArrayRegion) (JNIEnv *, jbooleanArray,
 					 jsize, jsize, jboolean *);
! void 		(*SetByteArrayRegion)	 (JNIEnv *, jbyteArray,
! 					 jsize, jsize, jbyte *);
! void 		(*SetCharArrayRegion)	 (JNIEnv *, jcharArray,
! 					 jsize, jsize, jchar *);
! void 		(*SetShortArrayRegion)	 (JNIEnv *, jshortArray,
! 					 jsize, jsize, jshort *);
! void 		(*SetIntArrayRegion)	 (JNIEnv *, jintArray,
! 					 jsize, jsize, jint *);
! void 		(*SetLongArrayRegion)	 (JNIEnv *, jlongArray,
! 					 jsize, jsize, jlong *);
! void 		(*SetFloatArrayRegion)	 (JNIEnv *, jfloatArray,
! 					 jsize, jsize, jfloat *);
! void 		(*SetDoubleArrayRegion)	 (JNIEnv *, jdoubleArray,
! 					 jsize, jsize, jdouble *);
 
 jint (*RegisterNatives) (JNIEnv *, jclass,
 					 const JNINativeMethod *, jint);
--- 494,530 ----
 
 void 		(*GetBooleanArrayRegion) (JNIEnv *, jbooleanArray,
 					 jsize, jsize, jboolean *);
! void 		(*GetByteArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*GetCharArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*GetShortArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*GetIntArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*GetLongArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*GetFloatArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*GetDoubleArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
 
 void 		(*SetBooleanArrayRegion) (JNIEnv *, jbooleanArray,
 					 jsize, jsize, jboolean *);
! void 		(*SetByteArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*SetCharArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*SetShortArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*SetIntArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*SetLongArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*SetFloatArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
! void 		(*SetDoubleArrayRegion)	 (JNIEnv *, jbooleanArray,
! 					 jsize, jsize, jboolean *);
 
 jint (*RegisterNatives) (JNIEnv *, jclass,
 					 const JNINativeMethod *, jint);
***************
*** 1343,1391 ****
 void GetBooleanArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->GetBooleanArrayRegion (this, val0, val1, val2, val3); }
 
! void GetByteArrayRegion (jbyteArray val0, jsize val1, jsize val2, jbyte * val3)
 { p->GetByteArrayRegion (this, val0, val1, val2, val3); }
 
! void GetCharArrayRegion (jcharArray val0, jsize val1, jsize val2, jchar * val3)
 { p->GetCharArrayRegion (this, val0, val1, val2, val3); }
 
! void GetShortArrayRegion (jshortArray val0, jsize val1, jsize val2, jshort * val3)
 { p->GetShortArrayRegion (this, val0, val1, val2, val3); }
 
! void GetIntArrayRegion (jintArray val0, jsize val1, jsize val2, jint * val3)
 { p->GetIntArrayRegion (this, val0, val1, val2, val3); }
 
! void GetLongArrayRegion (jlongArray val0, jsize val1, jsize val2, jlong * val3)
 { p->GetLongArrayRegion (this, val0, val1, val2, val3); }
 
! void GetFloatArrayRegion (jfloatArray val0, jsize val1, jsize val2, jfloat * val3)
 { p->GetFloatArrayRegion (this, val0, val1, val2, val3); }
 
! void GetDoubleArrayRegion (jdoubleArray val0, jsize val1, jsize val2, jdouble * val3)
 { p->GetDoubleArrayRegion (this, val0, val1, val2, val3); }
 
 void SetBooleanArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->SetBooleanArrayRegion (this, val0, val1, val2, val3); }
 
! void SetByteArrayRegion (jbyteArray val0, jsize val1, jsize val2, jbyte * val3)
 { p->SetByteArrayRegion (this, val0, val1, val2, val3); }
 
! void SetCharArrayRegion (jcharArray val0, jsize val1, jsize val2, jchar * val3)
 { p->SetCharArrayRegion (this, val0, val1, val2, val3); }
 
! void SetShortArrayRegion (jshortArray val0, jsize val1, jsize val2, jshort * val3)
 { p->SetShortArrayRegion (this, val0, val1, val2, val3); }
 
! void SetIntArrayRegion (jintArray val0, jsize val1, jsize val2, jint * val3)
 { p->SetIntArrayRegion (this, val0, val1, val2, val3); }
 
! void SetLongArrayRegion (jlongArray val0, jsize val1, jsize val2, jlong * val3)
 { p->SetLongArrayRegion (this, val0, val1, val2, val3); }
 
! void SetFloatArrayRegion (jfloatArray val0, jsize val1, jsize val2, jfloat * val3)
 { p->SetFloatArrayRegion (this, val0, val1, val2, val3); }
 
! void SetDoubleArrayRegion (jdoubleArray val0, jsize val1, jsize val2, jdouble * val3)
 { p->SetDoubleArrayRegion (this, val0, val1, val2, val3); }
 
 jint RegisterNatives (jclass cl0, const JNINativeMethod * val1, jint val2)
--- 1343,1391 ----
 void GetBooleanArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->GetBooleanArrayRegion (this, val0, val1, val2, val3); }
 
! void GetByteArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->GetByteArrayRegion (this, val0, val1, val2, val3); }
 
! void GetCharArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->GetCharArrayRegion (this, val0, val1, val2, val3); }
 
! void GetShortArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->GetShortArrayRegion (this, val0, val1, val2, val3); }
 
! void GetIntArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->GetIntArrayRegion (this, val0, val1, val2, val3); }
 
! void GetLongArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->GetLongArrayRegion (this, val0, val1, val2, val3); }
 
! void GetFloatArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->GetFloatArrayRegion (this, val0, val1, val2, val3); }
 
! void GetDoubleArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->GetDoubleArrayRegion (this, val0, val1, val2, val3); }
 
 void SetBooleanArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->SetBooleanArrayRegion (this, val0, val1, val2, val3); }
 
! void SetByteArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->SetByteArrayRegion (this, val0, val1, val2, val3); }
 
! void SetCharArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->SetCharArrayRegion (this, val0, val1, val2, val3); }
 
! void SetShortArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->SetShortArrayRegion (this, val0, val1, val2, val3); }
 
! void SetIntArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->SetIntArrayRegion (this, val0, val1, val2, val3); }
 
! void SetLongArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->SetLongArrayRegion (this, val0, val1, val2, val3); }
 
! void SetFloatArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->SetFloatArrayRegion (this, val0, val1, val2, val3); }
 
! void SetDoubleArrayRegion (jbooleanArray val0, jsize val1, jsize val2, jboolean * val3)
 { p->SetDoubleArrayRegion (this, val0, val1, val2, val3); }
 
 jint RegisterNatives (jclass cl0, const JNINativeMethod * val1, jint val2)
diff -Nrc gcc-20010423/libjava/jni.cc gcc-20010423.orig/libjava/jni.cc
*** gcc-20010423/libjava/jni.cc	Thu Apr 26 16:42:46 2001
--- gcc-20010423.orig/libjava/jni.cc	Fri Apr 6 19:38:02 2001
***************
*** 1364,1372 ****
 				 jsize start, jsize len,
 				 T *buf)
 {
! jsize end = start + len; // may be smaller than start (due to overflow or len < 0)
! 
! if (end < start || len > array->length)
 {
 try
 	{
--- 1364,1370 ----
 				 jsize start, jsize len,
 				 T *buf)
 {
! if (start < 0 || len >= array->length || start + len >= array->length)
 {
 try
 	{
***************
*** 1391,1399 ****
 _Jv_JNI_SetPrimitiveArrayRegion (JNIEnv *env, JArray<T> *array, 
 				 jsize start, jsize len, T *buf)
 {
! jsize end = start + len; // may be smaller than start (due to overflow or len < 0)
! 
! if (end < start || len > array->length)
 {
 try
 	{
--- 1389,1395 ----
 _Jv_JNI_SetPrimitiveArrayRegion (JNIEnv *env, JArray<T> *array, 
 				 jsize start, jsize len, T *buf)
 {
! if (start < 0 || len >= array->length || start + len >= array->length)
 {
 try
 	{
-- 
The early bird gets the worm. If you want something else for 
breakfast, get up later.


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /