#define CHECK_FIELD_TYPE(_obj, _fieldid, _prim, _isstatic) \
checkFieldType(_obj, _fieldid, _prim, _isstatic, __FUNCTION__)
+#define CHECK_INST_FIELD_ID(_env, _obj, _fieldid) \
+ checkInstanceFieldID(_env, _obj, _fieldid, __FUNCTION__)
#define CHECK_CLASS(_env, _clazz) \
checkClass(_env, _clazz, __FUNCTION__)
#define CHECK_STRING(_env, _str) \
/*
* Verify that this instance field ID is valid for this object.
*/
-static void checkInstanceFieldID(JNIEnv* env, jobject obj, jfieldID fieldID)
+static void checkInstanceFieldID(JNIEnv* env, jobject obj, jfieldID fieldID,
+ const char* func)
{
+ if (obj == NULL) {
+ LOGW("JNI WARNING: invalid null object (%s)\n", func);
+ abortMaybe();
+ return;
+ }
+
ClassObject* clazz = ((Object*)obj)->clazz;
/*
if (!checkGuardedCopy(dataBuf, true)) {
LOGE("JNI: failed guarded copy check in releaseGuardedPACopy\n");
abortMaybe();
+ return NULL;
}
switch (mode) {
CHECK_ENTER(env, kFlag_Default); \
CHECK_OBJECT(env, obj); \
_ctype result; \
- checkInstanceFieldID(env, obj, fieldID); \
+ CHECK_INST_FIELD_ID(env, obj, fieldID); \
result = BASE_ENV(env)->Get##_jname##Field(env, obj, fieldID); \
CHECK_EXIT(env); \
return result; \
{ \
CHECK_ENTER(env, kFlag_Default); \
CHECK_OBJECT(env, obj); \
- checkInstanceFieldID(env, obj, fieldID); \
+ CHECK_INST_FIELD_ID(env, obj, fieldID); \
CHECK_FIELD_TYPE((jobject)(u4) value, fieldID, _ftype, false); \
BASE_ENV(env)->Set##_jname##Field(env, obj, fieldID, value); \
CHECK_EXIT(env); \
if (!checkGuardedCopy(chars, false)) {
LOGE("JNI: failed guarded copy check in ReleaseStringChars\n");
abortMaybe();
+ return;
}
chars = (const jchar*) freeGuardedCopy((jchar*)chars);
}
if (!checkGuardedCopy(utf, false)) {
LOGE("JNI: failed guarded copy check in ReleaseStringUTFChars\n");
abortMaybe();
+ return;
}
utf = (const char*) freeGuardedCopy((char*)utf);
}
if (!checkGuardedCopy(carray, false)) {
LOGE("JNI: failed guarded copy check in ReleaseStringCritical\n");
abortMaybe();
+ return;
}
carray = (const jchar*) freeGuardedCopy((jchar*)carray);
}
LOGW("JNI WARNING: invalid values for address (%p) or capacity (%ld)\n",
address, (long) capacity);
abortMaybe();
+ return NULL;
}
result = BASE_ENV(env)->NewDirectByteBuffer(env, address, capacity);
CHECK_EXIT(env);