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