This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[fwd] Patch for tow JNI Bugs (from: martin.kahlert@infineon.com)
- To: java-patches at gcc dot gnu dot org
- Subject: [fwd] Patch for tow JNI Bugs (from: martin.kahlert@infineon.com)
- From: Martin Kahlert <martin dot kahlert at infineon dot com>
- Date: Fri, 27 Apr 2001 08:26:34 +0200
- Reply-To: martin dot kahlert at infineon dot com
Hi,
Alexandre told me, that java-patches would be the best list for that.
So here it goes:
----- Forwarded message from Martin Kahlert <martin.kahlert@infineon.com> -----
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
{
----- End forwarded message -----
--
The early bird gets the worm. If you want something else for
breakfast, get up later.