You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/10/17 15:50:49 UTC
svn commit: r464927 -
/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp
Author: geirm
Date: Tue Oct 17 06:50:49 2006
New Revision: 464927
URL: http://svn.apache.org/viewvc?view=rev&rev=464927
Log:
HARMONY-1791
For JNI java.lang.String manipulation function argument jstring class check is added. It helps to catch non-valid
jstring argument in early stage not inside java.lang.String analysis.
I see no harm - seems to be able to be optimized away for release
Ubuntu 6 - smoke, c-unit, ~kernel
Modified:
incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp
Modified: incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp?view=diff&rev=464927&r1=464926&r2=464927
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni.cpp Tue Oct 17 06:50:49 2006
@@ -1081,6 +1081,26 @@
}
} //IsInstanceOf
+static bool
+check_is_jstring_class(jstring string)
+{
+#ifndef NDEBUG
+ ObjectHandle h = (ObjectHandle)string;
+
+ tmn_suspend_disable(); //---------------------------------v
+
+ ObjectHandle new_handle = oh_allocate_local_handle();
+ ManagedObject *jlo = h->object;
+ assert(jlo);
+ assert(jlo->vt());
+ Class *clss = jlo->vt()->clss;
+ tmn_suspend_enable(); //---------------------------------^
+ return clss == VM_Global_State::loader_env->JavaLangString_Class;
+#else
+ return true;
+#endif // !NDEBUG
+}
+
jstring JNICALL NewString(JNIEnv * UNREF env,
const jchar *unicodeChars,
jsize length)
@@ -1095,7 +1115,9 @@
{
TRACE2("jni", "GetStringLength called");
assert(hythread_is_suspend_enabled());
- if(!string) return 0;
+ if(!string)
+ return 0;
+ assert(check_is_jstring_class(string));
return string_get_length_h((ObjectHandle)string);
} //GetStringLength
@@ -1105,7 +1127,9 @@
{
TRACE2("jni", "GetStringChars called");
assert(hythread_is_suspend_enabled());
- assert(string);
+ if(!string)
+ return 0;
+ assert(check_is_jstring_class(string));
tmn_suspend_disable();
ManagedObject* str = ((ObjectHandle)string)->object;
@@ -1116,10 +1140,13 @@
} //GetStringChars
void JNICALL ReleaseStringChars(JNIEnv * UNREF env,
- jstring UNREF string,
+ jstring string,
const jchar *chars)
{
TRACE2("jni", "ReleaseStringChars called");
+ if(!string)
+ return;
+ assert(check_is_jstring_class(string));
assert(hythread_is_suspend_enabled());
STD_FREE((void*)chars);
} //ReleaseStringChars
@@ -1136,6 +1163,9 @@
jstring string)
{
TRACE2("jni", "GetStringUTFLength called");
+ if(!string)
+ return 0;
+ assert(check_is_jstring_class(string));
assert(hythread_is_suspend_enabled());
return string_get_utf8_length_h((ObjectHandle)string);
} //GetStringUTFLength
@@ -1145,19 +1175,23 @@
jboolean *isCopy)
{
TRACE2("jni", "GetStringUTFChars called");
- assert(hythread_is_suspend_enabled());
if(!string)
return 0;
+ assert(check_is_jstring_class(string));
+ assert(hythread_is_suspend_enabled());
const char* res = string_get_utf8_chars_h((ObjectHandle)string);
if (isCopy) *isCopy = JNI_TRUE;
return res;
} //GetStringUTFChars
void JNICALL ReleaseStringUTFChars(JNIEnv * UNREF env,
- jstring UNREF string,
+ jstring string,
const char *utf)
{
TRACE2("jni", "ReleaseStringUTFChars called");
+ if(!string)
+ return;
+ assert(check_is_jstring_class(string));
assert(hythread_is_suspend_enabled());
STD_FREE((void*)utf);
} //ReleaseStringUTFChars