diff options
-rw-r--r-- | include/ScopedUtfChars.h | 17 | ||||
-rw-r--r-- | luni/src/main/native/ICU.cpp | 22 | ||||
-rw-r--r-- | luni/src/main/native/NativeBreakIterator.cpp | 2 | ||||
-rw-r--r-- | luni/src/main/native/NativeCollation.cpp | 5 | ||||
-rw-r--r-- | luni/src/main/native/NativeConverter.cpp | 4 | ||||
-rw-r--r-- | luni/src/main/native/UCharacter.cpp | 13 | ||||
-rw-r--r-- | luni/src/main/native/java_io_ObjectInputStream.cpp | 299 | ||||
-rw-r--r-- | luni/src/main/native/java_io_ObjectOutputStream.cpp | 256 | ||||
-rw-r--r-- | luni/src/main/native/java_lang_System.cpp | 81 | ||||
-rw-r--r-- | luni/src/main/native/java_net_InetAddress.cpp | 63 | ||||
-rw-r--r-- | luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp | 59 | ||||
-rw-r--r-- | luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp | 104 | ||||
-rw-r--r-- | luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp | 20 | ||||
-rw-r--r-- | openssl/src/main/native/BNInterface.cpp | 23 |
14 files changed, 275 insertions, 693 deletions
diff --git a/include/ScopedUtfChars.h b/include/ScopedUtfChars.h index bfe9bb9..3051d3b 100644 --- a/include/ScopedUtfChars.h +++ b/include/ScopedUtfChars.h @@ -20,12 +20,25 @@ #include "JNIHelp.h" // A smart pointer that provides read-only access to a Java string's UTF chars. +// Unlike GetStringUTFChars, we throw NullPointerException rather than abort if +// passed a null jstring, and c_str will return NULL. +// This makes the correct idiom very simple: +// +// ScopedUtfChars name(env, javaName); +// if (name.c_str() == NULL) { +// return NULL; +// } class ScopedUtfChars { public: ScopedUtfChars(JNIEnv* env, jstring s) - : mEnv(env), mString(s), mUtfChars(NULL) + : mEnv(env), mString(s) { - mUtfChars = env->GetStringUTFChars(s, NULL); + if (s == NULL) { + mUtfChars = NULL; + jniThrowNullPointerException(env, NULL); + } else { + mUtfChars = env->GetStringUTFChars(s, NULL); + } } ~ScopedUtfChars() { diff --git a/luni/src/main/native/ICU.cpp b/luni/src/main/native/ICU.cpp index 097bbe3..94bb521 100644 --- a/luni/src/main/native/ICU.cpp +++ b/luni/src/main/native/ICU.cpp @@ -90,7 +90,7 @@ static jint getCurrencyFractionDigitsNative(JNIEnv* env, jclass, jstring currenc return fmt->getMinimumFractionDigits(); } -static jstring getCurrencyCodeNative(JNIEnv* env, jclass, jstring key) { +static jstring getCurrencyCodeNative(JNIEnv* env, jclass, jstring javaKey) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle supplData(ures_openDirect(NULL, "supplementalData", &status)); if (U_FAILURE(status)) { @@ -102,9 +102,8 @@ static jstring getCurrencyCodeNative(JNIEnv* env, jclass, jstring key) { return NULL; } - const char* keyChars = env->GetStringUTFChars(key, NULL); - ScopedResourceBundle currency(ures_getByKey(currencyMap.get(), keyChars, NULL, &status)); - env->ReleaseStringUTFChars(key, keyChars); + ScopedUtfChars key(env, javaKey); + ScopedResourceBundle currency(ures_getByKey(currencyMap.get(), key.c_str(), NULL, &status)); if (U_FAILURE(status)) { return NULL; } @@ -142,10 +141,9 @@ static jstring getCurrencyCodeNative(JNIEnv* env, jclass, jstring key) { static jstring getCurrencySymbolNative(JNIEnv* env, jclass, jstring locale, jstring currencyCode) { // LOGI("ENTER getCurrencySymbolNative"); - const char* locName = env->GetStringUTFChars(locale, NULL); + ScopedUtfChars localeName(env, locale); UErrorCode status = U_ZERO_ERROR; - ScopedResourceBundle root(ures_open(NULL, locName, &status)); - env->ReleaseStringUTFChars(locale, locName); + ScopedResourceBundle root(ures_open(NULL, localeName.c_str(), &status)); if (U_FAILURE(status)) { return NULL; } @@ -155,9 +153,8 @@ static jstring getCurrencySymbolNative(JNIEnv* env, jclass, jstring locale, jstr return NULL; } - const char* currName = env->GetStringUTFChars(currencyCode, NULL); - ScopedResourceBundle currencyElems(ures_getByKey(currencies.get(), currName, NULL, &status)); - env->ReleaseStringUTFChars(currencyCode, currName); + ScopedUtfChars currency(env, currencyCode); + ScopedResourceBundle currencyElems(ures_getByKey(currencies.get(), currency.c_str(), NULL, &status)); if (U_FAILURE(status)) { return NULL; } @@ -577,10 +574,9 @@ static void setCharField(JNIEnv* env, jobject obj, const char* fieldName, UResou } static jboolean initLocaleDataImpl(JNIEnv* env, jclass, jstring locale, jobject localeData) { - const char* loc = env->GetStringUTFChars(locale, NULL); + ScopedUtfChars localeName(env, locale); UErrorCode status = U_ZERO_ERROR; - ScopedResourceBundle root(ures_openU(NULL, loc, &status)); - env->ReleaseStringUTFChars(locale, loc); + ScopedResourceBundle root(ures_openU(NULL, localeName.c_str(), &status)); if (U_FAILURE(status)) { LOGE("Error getting ICU resource bundle: %s", u_errorName(status)); status = U_ZERO_ERROR; diff --git a/luni/src/main/native/NativeBreakIterator.cpp b/luni/src/main/native/NativeBreakIterator.cpp index e2db39a..cb7b7b9 100644 --- a/luni/src/main/native/NativeBreakIterator.cpp +++ b/luni/src/main/native/NativeBreakIterator.cpp @@ -26,7 +26,7 @@ static jint getIterator(JNIEnv* env, jstring locale, UBreakIteratorType type) { UErrorCode status = U_ZERO_ERROR; ScopedUtfChars localeChars(env, locale); - if (!localeChars.c_str()) { + if (localeChars.c_str() == NULL) { return 0; } UBreakIterator* it = ubrk_open(type, localeChars.c_str(), NULL, 0, &status); diff --git a/luni/src/main/native/NativeCollation.cpp b/luni/src/main/native/NativeCollation.cpp index ce76786..ed2a0e5 100644 --- a/luni/src/main/native/NativeCollation.cpp +++ b/luni/src/main/native/NativeCollation.cpp @@ -117,6 +117,9 @@ static jint next(JNIEnv* env, jclass, jint address) { static jint openCollator(JNIEnv* env, jclass, jstring localeName) { ScopedUtfChars localeChars(env, localeName); + if (localeChars.c_str() == NULL) { + return 0; + } UErrorCode status = U_ZERO_ERROR; UCollator* c = ucol_open(localeChars.c_str(), &status); icu4jni_error(env, status); @@ -193,7 +196,7 @@ static JNINativeMethod gMethods[] = { { "getOffset", "(I)I", (void*) getOffset }, { "setOffset", "(II)V", (void*) setOffset } }; -int register_com_ibm_icu4jni_text_NativeCollator(JNIEnv* env) { +int register_com_ibm_icu4jni_text_NativeCollator(JNIEnv* env) { return jniRegisterNativeMethods(env, "com/ibm/icu4jni/text/NativeCollation", gMethods, NELEM(gMethods)); } diff --git a/luni/src/main/native/NativeConverter.cpp b/luni/src/main/native/NativeConverter.cpp index f5de483..edc5f50 100644 --- a/luni/src/main/native/NativeConverter.cpp +++ b/luni/src/main/native/NativeConverter.cpp @@ -56,7 +56,7 @@ static UConverter* toUConverter(jlong address) { static jlong openConverter(JNIEnv* env, jclass, jstring converterName) { ScopedUtfChars converterNameChars(env, converterName); - if (!converterNameChars.c_str()) { + if (converterNameChars.c_str() == NULL) { return 0; } UErrorCode errorCode = U_ZERO_ERROR; @@ -591,7 +591,7 @@ static jboolean contains(JNIEnv*, jclass, jlong handle1, jlong handle2) { static jobject charsetForName(JNIEnv* env, jclass, jstring charsetName) { ScopedUtfChars charsetNameChars(env, charsetName); - if (!charsetNameChars.c_str()) { + if (charsetNameChars.c_str() == NULL) { return NULL; } // Get ICU's canonical name for this charset. diff --git a/luni/src/main/native/UCharacter.cpp b/luni/src/main/native/UCharacter.cpp index 136f58c..09bb90d 100644 --- a/luni/src/main/native/UCharacter.cpp +++ b/luni/src/main/native/UCharacter.cpp @@ -156,15 +156,12 @@ static jboolean isLowerCaseImpl(JNIEnv*, jclass, jint codePoint) { return u_islower(codePoint); } -static int forNameImpl(JNIEnv* env, jclass, jstring blockName) { - if (blockName == NULL) { - jniThrowNullPointerException(env, NULL); - return -1; +static int forNameImpl(JNIEnv* env, jclass, jstring javaBlockName) { + ScopedUtfChars blockName(env, javaBlockName); + if (blockName.c_str() == NULL) { + return 0; } - const char* bName = env->GetStringUTFChars(blockName, NULL); - int result = u_getPropertyValueEnum(UCHAR_BLOCK, bName); - env->ReleaseStringUTFChars(blockName, bName); - return result; + return u_getPropertyValueEnum(UCHAR_BLOCK, blockName.c_str()); } static int ofImpl(JNIEnv*, jclass, jint codePoint) { diff --git a/luni/src/main/native/java_io_ObjectInputStream.cpp b/luni/src/main/native/java_io_ObjectInputStream.cpp index 57f8afe..224603e 100644 --- a/luni/src/main/native/java_io_ObjectInputStream.cpp +++ b/luni/src/main/native/java_io_ObjectInputStream.cpp @@ -16,265 +16,72 @@ */ #include "JNIHelp.h" - -static void java_setFieldBool (JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jboolean newValue) { - const char *fieldNameInC; - jfieldID fid; - if(targetObject == NULL) { +#include "ScopedUtfChars.h" + +#define SETTER(FUNCTION_NAME, JNI_C_TYPE, JNI_TYPE_STRING, JNI_SETTER_FUNCTION) \ + static void FUNCTION_NAME(JNIEnv* env, jclass, jobject instance, \ + jclass declaringClass, jstring javaFieldName, JNI_C_TYPE newValue) { \ + if (instance == NULL) { \ + return; \ + } \ + ScopedUtfChars fieldName(env, javaFieldName); \ + if (fieldName.c_str() == NULL) { \ + return; \ + } \ + jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), JNI_TYPE_STRING); \ + if (fid != 0) { \ + env->JNI_SETTER_FUNCTION(instance, fid, newValue); \ + } \ + } + +SETTER(ObjectInputStream_setFieldBool, jboolean, "Z", SetBooleanField) +SETTER(ObjectInputStream_setFieldByte, jbyte, "B", SetByteField) +SETTER(ObjectInputStream_setFieldChar, jchar, "C", SetCharField) +SETTER(ObjectInputStream_setFieldDouble, jdouble, "D", SetDoubleField) +SETTER(ObjectInputStream_setFieldFloat, jfloat, "F", SetFloatField) +SETTER(ObjectInputStream_setFieldInt, jint, "I", SetIntField) +SETTER(ObjectInputStream_setFieldLong, jlong, "J", SetLongField) +SETTER(ObjectInputStream_setFieldShort, jshort, "S", SetShortField) + +static void ObjectInputStream_setFieldObj(JNIEnv* env, jclass, jobject instance, + jclass declaringClass, jstring javaFieldName, jstring javaFieldTypeName, jobject newValue) { + if (instance == NULL) { return; } - fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - fid = env->GetFieldID(declaringClass, fieldNameInC, "Z"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid != 0) { - env->SetBooleanField(targetObject, fid, newValue); - } -} - -static void java_setFieldChar (JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jchar newValue) { - const char *fieldNameInC; - jfieldID fid; - if(targetObject == NULL) { + ScopedUtfChars fieldName(env, javaFieldName); + if (fieldName.c_str() == NULL) { return; } - fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - fid = env->GetFieldID(declaringClass, fieldNameInC, "C"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid != 0) { - env->SetCharField(targetObject, fid, newValue); - } -} - -static void java_setFieldInt (JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jint newValue) { - const char *fieldNameInC; - jfieldID fid; - if(targetObject == NULL) { - return; - } - fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - fid = env->GetFieldID(declaringClass, fieldNameInC, "I"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid != 0) { - env->SetIntField(targetObject, fid, newValue); - } -} - -static void java_setFieldFloat (JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jfloat newValue) { - const char *fieldNameInC; - jfieldID fid; - if(targetObject == NULL) { + ScopedUtfChars fieldTypeName(env, javaFieldTypeName); + if (fieldTypeName.c_str() == NULL) { return; } - fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - fid = env->GetFieldID(declaringClass, fieldNameInC, "F"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid != 0) { - env->SetFloatField(targetObject, fid, newValue); + jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), fieldTypeName.c_str()); + if (fid != 0) { + env->SetObjectField(instance, fid, newValue); } } -static void java_setFieldDouble (JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jdouble newValue) { - const char *fieldNameInC; - jfieldID fid; - if(targetObject == NULL) { - return; - } - fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - fid = env->GetFieldID(declaringClass, fieldNameInC, "D"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid != 0) { - env->SetDoubleField(targetObject, fid, newValue); - } - -} - -static void java_setFieldShort (JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jshort newValue) { - const char *fieldNameInC; - jfieldID fid; - if(targetObject == NULL) { - return; - } - fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - fid = env->GetFieldID(declaringClass, fieldNameInC, "S"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid != 0) { - env->SetShortField(targetObject, fid, newValue); - } - -} - -static void java_setFieldLong (JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jlong newValue) { - const char *fieldNameInC; - jfieldID fid; - if(targetObject == NULL) { - return; - } - fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - fid = env->GetFieldID(declaringClass, fieldNameInC, "J"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid != 0) { - env->SetLongField(targetObject, fid, newValue); - } -} - -static jobject java_newInstance (JNIEnv* env, jclass, - jclass instantiationClass, - jclass constructorClass) { - jmethodID mid = - env->GetMethodID(constructorClass, "<init>", "()V"); - - if(mid == 0) { - /* Cant newInstance,No empty constructor... */ - return (jobject) 0; - } else { - /* Instantiate an object of a given class */ - return (jobject) env->NewObject(instantiationClass, mid); - } - -} - -static void java_setFieldByte (JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jbyte newValue){ - const char *fieldNameInC; - jfieldID fid; - if(targetObject == NULL) { - return; - } - fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - fid = env->GetFieldID(declaringClass, fieldNameInC, "B"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* Two options now. Maybe getFieldID caused an exception, or maybe it returned the real value */ - if(fid != 0) { - env->SetByteField(targetObject, fid, newValue); - } -} - -static void java_setFieldObj (JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jstring fieldTypeName, - jobject newValue) { - const char *fieldNameInC, *fieldTypeNameInC; - jfieldID fid; - if(targetObject == NULL) { - return; - } - fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - fieldTypeNameInC = env->GetStringUTFChars(fieldTypeName, NULL); - fid = env->GetFieldID(declaringClass, - fieldNameInC, fieldTypeNameInC); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - env->ReleaseStringUTFChars(fieldTypeName, fieldTypeNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid != 0) { - env->SetObjectField(targetObject, fid, newValue); +static jobject ObjectInputStream_newInstance(JNIEnv* env, jclass, + jclass instantiationClass, jclass constructorClass) { + jmethodID mid = env->GetMethodID(constructorClass, "<init>", "()V"); + if (mid == 0) { + return NULL; } + return env->NewObject(instantiationClass, mid); } static JNINativeMethod gMethods[] = { - { "setField", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;J)V", - (void*) java_setFieldLong }, - { "setField", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;S)V", - (void*) java_setFieldShort }, - { "setField", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;D)V", - (void*) java_setFieldDouble }, - { "setField", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Z)V", - (void*) java_setFieldBool }, - { "setField", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;B)V", - (void*) java_setFieldByte }, - { "setField", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;F)V", - (void*) java_setFieldFloat }, - { "setField", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;C)V", - (void*) java_setFieldChar }, - { "setField", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;I)V", - (void*) java_setFieldInt }, - { "newInstance", - "(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Object;", - (void*) java_newInstance }, - { "objSetField", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", - (void*) java_setFieldObj } - + { "newInstance", "(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/Object;", (void*) ObjectInputStream_newInstance }, + { "objSetField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", (void*) ObjectInputStream_setFieldObj }, + { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;B)V", (void*) ObjectInputStream_setFieldByte }, + { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;C)V", (void*) ObjectInputStream_setFieldChar }, + { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;D)V", (void*) ObjectInputStream_setFieldDouble }, + { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;F)V", (void*) ObjectInputStream_setFieldFloat }, + { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;I)V", (void*) ObjectInputStream_setFieldInt }, + { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;J)V", (void*) ObjectInputStream_setFieldLong }, + { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;S)V", (void*) ObjectInputStream_setFieldShort }, + { "setField", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Z)V", (void*) ObjectInputStream_setFieldBool }, }; int register_java_io_ObjectInputStream(JNIEnv* env) { return jniRegisterNativeMethods(env, "java/io/ObjectInputStream", gMethods, NELEM(gMethods)); diff --git a/luni/src/main/native/java_io_ObjectOutputStream.cpp b/luni/src/main/native/java_io_ObjectOutputStream.cpp index 791e041..c499bac 100644 --- a/luni/src/main/native/java_io_ObjectOutputStream.cpp +++ b/luni/src/main/native/java_io_ObjectOutputStream.cpp @@ -16,223 +16,61 @@ */ #include "JNIHelp.h" - -static jlong java_getFieldLong(JNIEnv * env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName) { - const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "J"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid == 0) { - // Field not found. I believe we must throw an exception here - return (jlong) 0L; - } else { - return env->GetLongField(targetObject, fid); +#include "ScopedUtfChars.h" + +#define GETTER(FUNCTION_NAME, JNI_C_TYPE, JNI_TYPE_STRING, JNI_GETTER_FUNCTION) \ + static JNI_C_TYPE FUNCTION_NAME(JNIEnv* env, jclass, jobject instance, jclass declaringClass, \ + jstring javaFieldName) { \ + if (instance == NULL) { \ + return JNI_C_TYPE(); \ + } \ + ScopedUtfChars fieldName(env, javaFieldName); \ + if (fieldName.c_str() == NULL) { \ + return JNI_C_TYPE(); \ + } \ + jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), JNI_TYPE_STRING); \ + if (fid == 0) { \ + return JNI_C_TYPE(); \ + } \ + return env->JNI_GETTER_FUNCTION(instance, fid); \ } -} -static jshort java_getFieldShort(JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName) { - const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "S"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid == 0) { - // Field not found. I believe we must throw an exception here - return (jshort) 0; - } else { - return env->GetShortField(targetObject, fid); +GETTER(ObjectOutputStream_getFieldBool, jboolean, "Z", GetBooleanField) +GETTER(ObjectOutputStream_getFieldByte, jbyte, "B", GetByteField) +GETTER(ObjectOutputStream_getFieldChar, jchar, "C", GetCharField) +GETTER(ObjectOutputStream_getFieldDouble, jdouble, "D", GetDoubleField) +GETTER(ObjectOutputStream_getFieldFloat, jfloat, "F", GetFloatField) +GETTER(ObjectOutputStream_getFieldInt, jint, "I", GetIntField) +GETTER(ObjectOutputStream_getFieldLong, jlong, "J", GetLongField) +GETTER(ObjectOutputStream_getFieldShort, jshort, "S", GetShortField) + +static jobject ObjectOutputStream_getFieldObj(JNIEnv* env, jclass, jobject instance, + jclass declaringClass, jstring javaFieldName, jstring javaFieldTypeName) { + ScopedUtfChars fieldName(env, javaFieldName); + if (fieldName.c_str() == NULL) { + return NULL; } -} - -static jdouble java_getFieldDouble(JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName) { - const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "D"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid == 0) { - // Field not found. I believe we must throw an exception here - return (jdouble) 0.0; - } else { - return env->GetDoubleField(targetObject, fid); + ScopedUtfChars fieldTypeName(env, javaFieldTypeName); + if (fieldTypeName.c_str() == NULL) { + return NULL; } -} - -static jboolean java_getFieldBool(JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName) { - const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "Z"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid == 0) { - // Field not found. I believe we must throw an exception here - return (jboolean) 0; - } else { - return env->GetBooleanField(targetObject, fid); - } -} - -static jbyte java_getFieldByte(JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName) { - const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "B"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid == 0) { - // Field not found. I believe we must throw an exception here - return (jbyte) 0; - } else { - return env->GetByteField(targetObject, fid); - } -} - -static jfloat java_getFieldFloat(JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName) { - const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "F"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid == 0) { - // Field not found. I believe we must throw an exception here - return (jfloat) 0.0f; - } - else { - return env->GetFloatField(targetObject, fid); - } - -} - -static jchar java_getFieldChar(JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName) { - const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "C"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid == 0) { - // Field not found. I believe we must throw an exception here - return (jchar) 0; - } else { - return env->GetCharField(targetObject, fid); - } -} - -static jobject java_getFieldObj(JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName, - jstring fieldTypeName) { - const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - const char *fieldTypeNameInC = - env->GetStringUTFChars(fieldTypeName, NULL); - jfieldID fid = env->GetFieldID(declaringClass, - fieldNameInC, fieldTypeNameInC); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - env->ReleaseStringUTFChars(fieldTypeName, fieldTypeNameInC); - - /* - * Two options now. Maybe getFieldID caused an exception, - * or maybe it returned the real value - */ - if(fid == 0) { - // Field not found. I believe we must throw an exception here - return (jobject) 0; - } else { - return env->GetObjectField(targetObject, fid); - } -} - -static jint java_getFieldInt(JNIEnv* env, jclass, - jobject targetObject, - jclass declaringClass, - jstring fieldName) { - const char *fieldNameInC = env->GetStringUTFChars(fieldName, NULL); - jfieldID fid = env->GetFieldID(declaringClass, fieldNameInC, "I"); - env->ReleaseStringUTFChars(fieldName, fieldNameInC); - - /* - * Two options now. Maybe getFieldID caused - * an exception, or maybe it returned the real value - */ - if(fid == 0) { - // Field not found. I believe we must throw an exception here - return (jint) 0; - } else { - return env->GetIntField(targetObject, fid); + jfieldID fid = env->GetFieldID(declaringClass, fieldName.c_str(), fieldTypeName.c_str()); + if (fid == 0) { + return NULL; } + return env->GetObjectField(instance, fid); } static JNINativeMethod gMethods[] = { - { "getFieldLong", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)J", - (void*) java_getFieldLong }, - { "getFieldShort", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)S", - (void*) java_getFieldShort }, - { "getFieldDouble", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)D", - (void*) java_getFieldDouble }, - { "getFieldBool", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)Z", - (void*) java_getFieldBool }, - { "getFieldByte", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)B", - (void*) java_getFieldByte }, - { "getFieldFloat", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)F", - (void*) java_getFieldFloat }, - { "getFieldChar", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)C", - (void*) java_getFieldChar }, - { "getFieldObj", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;", - (void*) java_getFieldObj }, - { "getFieldInt", - "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)I", - (void*) java_getFieldInt }, - + { "getFieldBool", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)Z", (void*) ObjectOutputStream_getFieldBool }, + { "getFieldByte", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)B", (void*) ObjectOutputStream_getFieldByte }, + { "getFieldChar", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)C", (void*) ObjectOutputStream_getFieldChar }, + { "getFieldDouble", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)D", (void*) ObjectOutputStream_getFieldDouble }, + { "getFieldFloat", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)F", (void*) ObjectOutputStream_getFieldFloat }, + { "getFieldInt", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)I", (void*) ObjectOutputStream_getFieldInt }, + { "getFieldLong", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)J", (void*) ObjectOutputStream_getFieldLong }, + { "getFieldObj", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;", (void*) ObjectOutputStream_getFieldObj }, + { "getFieldShort", "(Ljava/lang/Object;Ljava/lang/Class;Ljava/lang/String;)S", (void*) ObjectOutputStream_getFieldShort }, }; int register_java_io_ObjectOutputStream(JNIEnv* env) { return jniRegisterNativeMethods(env, "java/io/ObjectOutputStream", gMethods, NELEM(gMethods)); diff --git a/luni/src/main/native/java_lang_System.cpp b/luni/src/main/native/java_lang_System.cpp index b114dab..61a784a 100644 --- a/luni/src/main/native/java_lang_System.cpp +++ b/luni/src/main/native/java_lang_System.cpp @@ -15,78 +15,45 @@ */ #include "JNIHelp.h" +#include "ScopedUtfChars.h" #include <stdlib.h> #include <string.h> - -/* - * public static native String getEnvByName(String name) - * - * (Calling it plain "getenv" might confuse GDB if you try to put a breakpoint - * on the libc version.) - */ -static jstring java_getEnvByName(JNIEnv* env, jclass, jstring nameStr) { - jstring valueStr = NULL; - - if (nameStr != NULL) { - const char* name = env->GetStringUTFChars(nameStr, NULL); - const char* val = getenv(name); - if (val != NULL) { - valueStr = env->NewStringUTF(val); - } - env->ReleaseStringUTFChars(nameStr, name); - } else { - jniThrowNullPointerException(env, NULL); +static jstring System_getEnvByName(JNIEnv* env, jclass, jstring javaName) { + ScopedUtfChars name(env, javaName); + if (name.c_str() == NULL) { + return NULL; } - - return valueStr; + return env->NewStringUTF(getenv(name.c_str())); } -/* - * Pointer to complete environment, from Posix. - */ +// Pointer to complete environment. extern char** environ; -/* - * public static native String getEnvByIndex() - * - * (Calling it plain "getenv" might confuse GDB if you try to put a breakpoint - * on the libc version.) - */ -static jstring java_getEnvByIndex(JNIEnv* env, jclass, jint index) { - jstring valueStr = NULL; - - char* entry = environ[index]; - if (entry != NULL) { - valueStr = env->NewStringUTF(entry); - } - - return valueStr; +static jstring System_getEnvByIndex(JNIEnv* env, jclass, jint index) { + return env->NewStringUTF(environ[index]); } -/* - * public static native String setFieldImpl() - * - * Sets a field via JNI. Used for the standard streams, which are r/o - * otherwise. - */ -static void java_setFieldImpl(JNIEnv* env, jclass clazz, - jstring name, jstring sig, jobject object) { - const char* fieldName = env->GetStringUTFChars(name, NULL); - const char* fieldSig = env->GetStringUTFChars(sig, NULL); - - jfieldID fieldID = env->GetStaticFieldID(clazz, fieldName, fieldSig); +// Sets a field via JNI. Used for the standard streams, which are read-only otherwise. +static void System_setFieldImpl(JNIEnv* env, jclass clazz, + jstring javaName, jstring javaSignature, jobject object) { + ScopedUtfChars name(env, javaName); + if (name.c_str() == NULL) { + return; + } + ScopedUtfChars signature(env, javaSignature); + if (signature.c_str() == NULL) { + return; + } + jfieldID fieldID = env->GetStaticFieldID(clazz, name.c_str(), signature.c_str()); env->SetStaticObjectField(clazz, fieldID, object); - - env->ReleaseStringUTFChars(name, fieldName); - env->ReleaseStringUTFChars(sig, fieldSig); } static JNINativeMethod gMethods[] = { - { "getEnvByName", "(Ljava/lang/String;)Ljava/lang/String;", (void*) java_getEnvByName }, - { "getEnvByIndex", "(I)Ljava/lang/String;", (void*) java_getEnvByIndex }, - { "setFieldImpl", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", (void*) java_setFieldImpl }, + { "getEnvByIndex", "(I)Ljava/lang/String;", (void*) System_getEnvByIndex }, + { "getEnvByName", "(Ljava/lang/String;)Ljava/lang/String;", (void*) System_getEnvByName }, + { "setFieldImpl", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", (void*) System_setFieldImpl }, }; int register_java_lang_System(JNIEnv* env) { return jniRegisterNativeMethods(env, "java/lang/System", gMethods, NELEM(gMethods)); diff --git a/luni/src/main/native/java_net_InetAddress.cpp b/luni/src/main/native/java_net_InetAddress.cpp index afd859a..c27114b 100644 --- a/luni/src/main/native/java_net_InetAddress.cpp +++ b/luni/src/main/native/java_net_InetAddress.cpp @@ -20,6 +20,7 @@ #include "JNIHelp.h" #include "ScopedLocalRef.h" +#include "ScopedUtfChars.h" #include "utils/Log.h" #include "jni.h" @@ -47,7 +48,7 @@ static jstring InetAddress_gethostname(JNIEnv* env, jclass) } #if LOG_DNS -static void logIpString(struct addrinfo* ai, const char* name) +static void logIpString(addrinfo* ai, const char* name) { char ipString[INET6_ADDRSTRLEN]; int result = getnameinfo(ai->ai_addr, ai->ai_addrlen, ipString, @@ -60,15 +61,18 @@ static void logIpString(struct addrinfo* ai, const char* name) } } #else -static inline void logIpString(struct addrinfo*, const char*) +static inline void logIpString(addrinfo*, const char*) { } #endif -static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) { - struct addrinfo hints, *addressList = NULL, *addrInfo; - jobjectArray addressArray = NULL; +static jobjectArray InetAddress_getaddrinfo(JNIEnv* env, jclass, jstring javaName) { + ScopedUtfChars name(env, javaName); + if (name.c_str() == NULL) { + return NULL; + } + addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_flags = AI_ADDRCONFIG; @@ -79,12 +83,14 @@ static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) { */ hints.ai_socktype = SOCK_STREAM; - int result = getaddrinfo(name, NULL, &hints, &addressList); + addrinfo* addressList = NULL; + jobjectArray addressArray = NULL; + int result = getaddrinfo(name.c_str(), NULL, &hints, &addressList); if (result == 0 && addressList) { // Count results so we know how to size the output array. int addressCount = 0; - for (addrInfo = addressList; addrInfo; addrInfo = addrInfo->ai_next) { - if (addrInfo->ai_family == AF_INET || addrInfo->ai_family == AF_INET6) { + for (addrinfo* ai = addressList; ai != NULL; ai = ai->ai_next) { + if (ai->ai_family == AF_INET || ai->ai_family == AF_INET6) { addressCount++; } } @@ -100,26 +106,26 @@ static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) { // Examine returned addresses one by one, save them in the output array. int index = 0; - for (addrInfo = addressList; addrInfo; addrInfo = addrInfo->ai_next) { - struct sockaddr* address = addrInfo->ai_addr; + for (addrinfo* ai = addressList; ai != NULL; ai = ai->ai_next) { + sockaddr* address = ai->ai_addr; size_t addressLength = 0; void* rawAddress; - switch (addrInfo->ai_family) { + switch (ai->ai_family) { // Find the raw address length and start pointer. case AF_INET6: addressLength = 16; - rawAddress = &((struct sockaddr_in6*) address)->sin6_addr.s6_addr; - logIpString(addrInfo, name); + rawAddress = &reinterpret_cast<sockaddr_in6*>(address)->sin6_addr.s6_addr; + logIpString(ai, name.c_str()); break; case AF_INET: addressLength = 4; - rawAddress = &((struct sockaddr_in*) address)->sin_addr.s_addr; - logIpString(addrInfo, name); + rawAddress = &reinterpret_cast<sockaddr_in*>(address)->sin_addr.s_addr; + logIpString(ai, name.c_str()); break; default: // Unknown address family. Skip this address. - LOGE("getaddrinfo: Unknown address family %d", addrInfo->ai_family); + LOGE("getaddrinfo: Unknown address family %d", ai->ai_family); continue; } @@ -131,7 +137,8 @@ static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) { addressArray = NULL; break; } - env->SetByteArrayRegion(byteArray.get(), 0, addressLength, (jbyte*) rawAddress); + env->SetByteArrayRegion(byteArray.get(), + 0, addressLength, reinterpret_cast<jbyte*>(rawAddress)); env->SetObjectArrayElement(addressArray, index, byteArray.get()); index++; } @@ -150,18 +157,6 @@ static jobjectArray InetAddress_getaddrinfoImpl(JNIEnv* env, const char* name) { return addressArray; } -jobjectArray InetAddress_getaddrinfo(JNIEnv* env, jclass, jstring javaName) { - if (javaName == NULL) { - jniThrowNullPointerException(env, NULL); - return NULL; - } - const char* name = env->GetStringUTFChars(javaName, NULL); - jobjectArray out = InetAddress_getaddrinfoImpl(env, name); - env->ReleaseStringUTFChars(javaName, name); - return out; -} - - /** * Looks up the name corresponding to an IP address. * @@ -179,21 +174,21 @@ static jstring InetAddress_getnameinfo(JNIEnv* env, jclass, } // Convert the raw address bytes into a socket address structure. - struct sockaddr_storage ss; + sockaddr_storage ss; memset(&ss, 0, sizeof(ss)); size_t socklen; const size_t addressLength = env->GetArrayLength(javaAddress); if (addressLength == 4) { - struct sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(&ss); + sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(&ss); sin->sin_family = AF_INET; - socklen = sizeof(struct sockaddr_in); + socklen = sizeof(sockaddr_in); jbyte* dst = reinterpret_cast<jbyte*>(&sin->sin_addr.s_addr); env->GetByteArrayRegion(javaAddress, 0, 4, dst); } else if (addressLength == 16) { - struct sockaddr_in6 *sin6 = reinterpret_cast<sockaddr_in6*>(&ss); + sockaddr_in6 *sin6 = reinterpret_cast<sockaddr_in6*>(&ss); sin6->sin6_family = AF_INET6; - socklen = sizeof(struct sockaddr_in6); + socklen = sizeof(sockaddr_in6); jbyte* dst = reinterpret_cast<jbyte*>(&sin6->sin6_addr.s6_addr); env->GetByteArrayRegion(javaAddress, 0, 16, dst); } else { diff --git a/luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp b/luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp index d4d0afd..e85b7f1 100644 --- a/luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp +++ b/luni/src/main/native/org_apache_harmony_luni_util_fltparse.cpp @@ -19,6 +19,7 @@ #include <string.h> #include <math.h> #include "JNIHelp.h" +#include "ScopedUtfChars.h" #include "commonDblParce.h" #include "cbigint.h" @@ -542,25 +543,20 @@ Java_org_apache_harmony_luni_util_FloatingPointParser_parseFltImpl (JNIEnv* env, jclass, jstring s, jint e) { - jfloat flt; - const char *str = env->GetStringUTFChars(s, 0); - flt = createFloat (env, str, e); - env->ReleaseStringUTFChars(s, str); - - if (((I_32) FLOAT_TO_INTBITS (flt)) >= 0) - { - return flt; + ScopedUtfChars str(env, s); + if (str.c_str() == NULL) { + return 0.0; } - else if (((I_32) FLOAT_TO_INTBITS (flt)) == (I_32) - 1) - { /* NumberFormatException */ - jniThrowException(env, "java/lang/NumberFormatException", ""); + jfloat flt = createFloat(env, str.c_str(), e); + + if (((I_32) FLOAT_TO_INTBITS (flt)) >= 0) { + return flt; + } else if (((I_32) FLOAT_TO_INTBITS (flt)) == (I_32) - 1) { + jniThrowException(env, "java/lang/NumberFormatException", NULL); + } else { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); } - else - { /* OutOfMemoryError */ - jniThrowException(env, "java/lang/OutOfMemoryError", ""); - } - - return 0.0; + return 0.0; } JNIEXPORT jdouble JNICALL @@ -568,25 +564,20 @@ Java_org_apache_harmony_luni_util_FloatingPointParser_parseDblImpl (JNIEnv* env, jclass, jstring s, jint e) { - jdouble dbl; - const char *str = env->GetStringUTFChars(s, 0); - dbl = createDouble(env, str, e); - env->ReleaseStringUTFChars(s, str); - - if (!ERROR_OCCURED (dbl)) - { - return dbl; + ScopedUtfChars str(env, s); + if (str.c_str() == NULL) { + return 0.0; } - else if (LOW_I32_FROM_VAR (dbl) == (I_32) - 1) - { /* NumberFormatException */ - jniThrowException(env, "java/lang/NumberFormatException", ""); + jdouble dbl = createDouble(env, str.c_str(), e); + + if (!ERROR_OCCURED (dbl)) { + return dbl; + } else if (LOW_I32_FROM_VAR (dbl) == (I_32) - 1) { + jniThrowException(env, "java/lang/NumberFormatException", NULL); + } else { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); } - else - { /* OutOfMemoryError */ - jniThrowException(env, "java/lang/OutOfMemoryError", ""); - } - - return 0.0; + return 0.0; } static JNINativeMethod gMethods[] = { diff --git a/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp b/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp index aaa052a..2ff8a4e 100644 --- a/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp +++ b/luni/src/main/native/org_apache_harmony_xml_ExpatParser.cpp @@ -20,6 +20,7 @@ #include "LocalArray.h" #include "ScopedLocalRef.h" #include "ScopedPrimitiveArray.h" +#include "ScopedUtfChars.h" #include "UniquePtr.h" #include "jni.h" #include "utils/Log.h" @@ -313,13 +314,7 @@ static void jniThrowExpatException(JNIEnv* env, XML_Error error) { jniThrowException(env, "org/apache/harmony/xml/ExpatException", message); } -/** - * Allocates a new parsing context. - * - * @param jobject the Java ExpatParser instance - * @returns a newly-allocated ParsingContext - */ -ParsingContext* newParsingContext(JNIEnv* env, jobject object) { +static ParsingContext* newParsingContext(JNIEnv* env, jobject object) { ParsingContext* result = (ParsingContext*) malloc(sizeof(ParsingContext)); if (result == NULL) { throw_OutOfMemoryError(env); @@ -840,25 +835,14 @@ static void processingInstruction(void* data, const char* target, const char* in * @param javaContext that was provided to handleExternalEntity * @returns the pointer to the C Expat entity parser */ -static jint createEntityParser(JNIEnv* env, jobject, jint parentParser, - jstring javaEncoding, jstring javaContext) { - const char* encoding = env->GetStringUTFChars(javaEncoding, NULL); - if (encoding == NULL) { - return 0; - } - - const char* context = env->GetStringUTFChars(javaContext, NULL); - if (context == NULL) { - env->ReleaseStringUTFChars(javaEncoding, encoding); +static jint createEntityParser(JNIEnv* env, jobject, jint parentParser, jstring javaEncoding, jstring javaContext) { + ScopedUtfChars context(env, javaContext); + if (context.c_str() == NULL) { return 0; } XML_Parser parent = (XML_Parser) parentParser; - XML_Parser entityParser - = XML_ExternalEntityParserCreate(parent, context, NULL); - env->ReleaseStringUTFChars(javaEncoding, encoding); - env->ReleaseStringUTFChars(javaContext, context); - + XML_Parser entityParser = XML_ExternalEntityParserCreate(parent, context.c_str(), NULL); if (entityParser == NULL) { throw_OutOfMemoryError(env); } @@ -1002,14 +986,16 @@ static jint initialize(JNIEnv* env, jobject object, jstring javaEncoding, // Create a parser. XML_Parser parser; - const char* encoding = env->GetStringUTFChars(javaEncoding, NULL); + ScopedUtfChars encoding(env, javaEncoding); + if (encoding.c_str() == NULL) { + return 0; + } if (processNamespaces) { // Use '|' to separate URIs from local names. - parser = XML_ParserCreateNS(encoding, '|'); + parser = XML_ParserCreateNS(encoding.c_str(), '|'); } else { - parser = XML_ParserCreate(encoding); + parser = XML_ParserCreate(encoding.c_str()); } - env->ReleaseStringUTFChars(javaEncoding, encoding); if (parser != NULL) { if (processNamespaces) { @@ -1047,8 +1033,7 @@ static void append(JNIEnv* env, jobject object, jint pointer, ParsingContext* context = (ParsingContext*) XML_GetUserData(parser); context->env = env; context->object = object; - if (!XML_Parse(parser, bytes + byteOffset, byteCount, isFinal) && - !env->ExceptionCheck()) { + if (!XML_Parse(parser, bytes + byteOffset, byteCount, isFinal) && !env->ExceptionCheck()) { jniThrowExpatException(env, XML_GetErrorCode(parser)); } context->object = NULL; @@ -1071,8 +1056,7 @@ static void appendCharacters(JNIEnv* env, jobject object, jint pointer, append(env, object, pointer, bytes, byteOffset, byteCount, XML_FALSE); } -static void appendString(JNIEnv* env, jobject object, jint pointer, - jstring xml, jboolean isFinal) { +static void appendString(JNIEnv* env, jobject object, jint pointer, jstring xml, jboolean isFinal) { const jchar* chars = env->GetStringChars(xml, NULL); const char* bytes = reinterpret_cast<const char*>(chars); size_t byteCount = 2 * env->GetStringLength(xml); @@ -1186,8 +1170,7 @@ static jstring getAttributeQName(JNIEnv* env, jobject, jint pointer, * @param index of the attribute * @returns Java string containing attribute's value */ -static jstring getAttributeValueByIndex(JNIEnv* env, jobject, - jint attributePointer, jint index) { +static jstring getAttributeValueByIndex(JNIEnv* env, jobject, jint attributePointer, jint index) { const char** attributes = (const char**) attributePointer; const char* value = attributes[(index << 1) + 1]; return env->NewStringUTF(value); @@ -1201,24 +1184,22 @@ static jstring getAttributeValueByIndex(JNIEnv* env, jobject, * @returns index of attribute with the given uri and local name or -1 if not * found */ -static jint getAttributeIndexForQName(JNIEnv* env, jobject, - jint attributePointer, jstring qName) { +static jint getAttributeIndexForQName(JNIEnv* env, jobject, jint attributePointer, jstring qName) { const char** attributes = (const char**) attributePointer; - const char* qNameBytes = env->GetStringUTFChars(qName, NULL); - if (qNameBytes == NULL) { + ScopedUtfChars qNameBytes(env, qName); + if (qNameBytes.c_str() == NULL) { return -1; } int found = -1; for (int index = 0; attributes[index * 2]; ++index) { - if (ExpatElementName(NULL, NULL, attributePointer, index).matchesQName(qNameBytes)) { + if (ExpatElementName(NULL, NULL, attributePointer, index).matchesQName(qNameBytes.c_str())) { found = index; break; } } - env->ReleaseStringUTFChars(qName, qNameBytes); return found; } @@ -1231,33 +1212,26 @@ static jint getAttributeIndexForQName(JNIEnv* env, jobject, * @returns index of attribute with the given uri and local name or -1 if not * found */ -static jint getAttributeIndex(JNIEnv* env, jobject, - jint attributePointer, jstring uri, jstring localName) { - const char** attributes = (const char**) attributePointer; - - const char* uriBytes = env->GetStringUTFChars(uri, NULL); - if (uriBytes == NULL) { +static jint getAttributeIndex(JNIEnv* env, jobject, jint attributePointer, + jstring uri, jstring localName) { + ScopedUtfChars uriBytes(env, uri); + if (uriBytes.c_str() == NULL) { return -1; } - const char* localNameBytes = env->GetStringUTFChars(localName, NULL); - if (localNameBytes == NULL) { - env->ReleaseStringUTFChars(uri, uriBytes); + ScopedUtfChars localNameBytes(env, localName); + if (localNameBytes.c_str() == NULL) { return -1; } - int found = -1; + const char** attributes = (const char**) attributePointer; for (int index = 0; attributes[index * 2]; ++index) { - if (ExpatElementName(NULL, NULL, attributePointer, index) - .matches(uriBytes, localNameBytes)) { - found = index; - break; + if (ExpatElementName(NULL, NULL, attributePointer, index).matches(uriBytes.c_str(), + localNameBytes.c_str())) { + return index; } } - - env->ReleaseStringUTFChars(uri, uriBytes); - env->ReleaseStringUTFChars(localName, localNameBytes); - return found; + return -1; } /** @@ -1271,10 +1245,8 @@ static jint getAttributeIndex(JNIEnv* env, jobject, */ static jstring getAttributeValueForQName(JNIEnv* env, jobject clazz, jint attributePointer, jstring qName) { - jint index = getAttributeIndexForQName( - env, clazz, attributePointer, qName); - return index == -1 ? NULL - : getAttributeValueByIndex(env, clazz, attributePointer, index); + jint index = getAttributeIndexForQName(env, clazz, attributePointer, qName); + return index == -1 ? NULL : getAttributeValueByIndex(env, clazz, attributePointer, index); } /** @@ -1288,10 +1260,8 @@ static jstring getAttributeValueForQName(JNIEnv* env, jobject clazz, */ static jstring getAttributeValue(JNIEnv* env, jobject clazz, jint attributePointer, jstring uri, jstring localName) { - jint index = getAttributeIndex( - env, clazz, attributePointer, uri, localName); - return index == -1 ? NULL - : getAttributeValueByIndex(env, clazz, attributePointer, index); + jint index = getAttributeIndex(env, clazz, attributePointer, uri, localName); + return index == -1 ? NULL : getAttributeValueByIndex(env, clazz, attributePointer, index); } /** @@ -1428,10 +1398,8 @@ static JNINativeMethod parserMethods[] = { { "append", "(ILjava/lang/String;Z)V", (void*) appendString }, { "append", "(I[CII)V", (void*) appendCharacters }, { "append", "(I[BII)V", (void*) appendBytes }, - { "initialize", "(Ljava/lang/String;Z)I", - (void*) initialize}, - { "createEntityParser", "(ILjava/lang/String;Ljava/lang/String;)I", - (void*) createEntityParser}, + { "initialize", "(Ljava/lang/String;Z)I", (void*) initialize}, + { "createEntityParser", "(ILjava/lang/String;Ljava/lang/String;)I", (void*) createEntityParser}, { "staticInitialize", "(Ljava/lang/String;)V", (void*) staticInitialize}, { "cloneAttributes", "(II)I", (void*) cloneAttributes }, }; diff --git a/luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp b/luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp index b91c8e6..ffffb66 100644 --- a/luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp +++ b/luni/src/main/native/org_apache_harmony_xnet_provider_jsse_NativeCrypto.cpp @@ -596,6 +596,9 @@ static void NativeCrypto_EVP_DigestInit(JNIEnv* env, jclass, EVP_MD_CTX* ctx, js } ScopedUtfChars algorithmChars(env, algorithm); + if (algorithmChars.c_str() == NULL) { + return; + } const EVP_MD *digest = EVP_get_digestbynid(OBJ_txt2nid(algorithmChars.c_str())); @@ -675,6 +678,9 @@ static void NativeCrypto_EVP_VerifyInit(JNIEnv* env, jclass, EVP_MD_CTX* ctx, js } ScopedUtfChars algorithmChars(env, algorithm); + if (algorithmChars.c_str() == NULL) { + return; + } const EVP_MD *digest = EVP_get_digestbynid(OBJ_txt2nid(algorithmChars.c_str())); @@ -811,18 +817,20 @@ static int NativeCrypto_verifysignature(JNIEnv* env, jclass, return -1; } - int result = -1; - ScopedByteArrayRO msgBytes(env, msg); ScopedByteArrayRO sigBytes(env, sig); ScopedByteArrayRO modBytes(env, mod); ScopedByteArrayRO expBytes(env, exp); ScopedUtfChars algorithmChars(env, algorithm); + if (algorithmChars.c_str() == NULL) { + return -1; + } JNI_TRACE("NativeCrypto_verifysignature algorithmChars=%s", algorithmChars.c_str()); Unique_RSA rsa(rsaCreateKey((unsigned char*) modBytes.get(), modBytes.size(), (unsigned char*) expBytes.get(), expBytes.size())); + int result = -1; if (rsa.get() != NULL) { result = rsaVerify((unsigned char*) msgBytes.get(), msgBytes.size(), (unsigned char*) sigBytes.get(), sigBytes.size(), @@ -851,11 +859,10 @@ static void NativeCrypto_RAND_seed(JNIEnv* env, jclass, jbyteArray seed) { static int NativeCrypto_RAND_load_file(JNIEnv* env, jclass, jstring filename, jlong max_bytes) { JNI_TRACE("NativeCrypto_RAND_load_file filename=%p max_bytes=%lld", filename, max_bytes); - if (filename == NULL) { - jniThrowNullPointerException(env, "filename == null"); + ScopedUtfChars file(env, filename); + if (file.c_str() == NULL) { return -1; } - ScopedUtfChars file(env, filename); int result = RAND_load_file(file.c_str(), max_bytes); JNI_TRACE("NativeCrypto_RAND_load_file file=%s => %d", file.c_str(), result); return result; @@ -1896,6 +1903,9 @@ static void NativeCrypto_SSL_set_cipher_lists(JNIEnv* env, jclass, ScopedLocalRef<jstring> cipherSuite(env, reinterpret_cast<jstring>(env->GetObjectArrayElement(cipherSuites, i))); ScopedUtfChars c(env, cipherSuite.get()); + if (c.c_str() == NULL) { + return; + } JNI_TRACE("ssl=%p NativeCrypto_SSL_set_cipher_lists cipherSuite=%s", ssl, c.c_str()); bool found = false; for (int j = 0; j < num_ciphers; j++) { diff --git a/openssl/src/main/native/BNInterface.cpp b/openssl/src/main/native/BNInterface.cpp index a40192c..ea93895 100644 --- a/openssl/src/main/native/BNInterface.cpp +++ b/openssl/src/main/native/BNInterface.cpp @@ -20,6 +20,7 @@ #include "JNIHelp.h" #include "ScopedPrimitiveArray.h" +#include "ScopedUtfChars.h" #include "jni.h" #include <assert.h> #include <openssl/bn.h> @@ -150,27 +151,23 @@ static jboolean NativeBN_putLongInt(JNIEnv* env, jclass cls, BIGNUM* a, long lon */ static int NativeBN_BN_dec2bn(JNIEnv* env, jclass, BIGNUM* a, jstring str) { if (!oneValidHandle(env, a)) return -1; - char* tmpStr = (char*)env->GetStringUTFChars(str, NULL); - if (tmpStr != NULL) { - int len = BN_dec2bn(&a, tmpStr); - env->ReleaseStringUTFChars(str, tmpStr); - return len; // len == 0: Error + ScopedUtfChars chars(env, str); + if (chars.c_str() == NULL) { + return -1; } - else return -1; // Error outside BN. + return BN_dec2bn(&a, chars.c_str()); } /** * public static native int BN_hex2bn(int, java.lang.String) */ static int NativeBN_BN_hex2bn(JNIEnv* env, jclass, BIGNUM* a, jstring str) { - if (!oneValidHandle(env, a)) return -1; - char* tmpStr = (char*)env->GetStringUTFChars(str, NULL); - if (tmpStr != NULL) { - int len = BN_hex2bn(&a, tmpStr); - env->ReleaseStringUTFChars(str, tmpStr); - return len; // len == 0: Error + if (!oneValidHandle(env, a)) return -1; + ScopedUtfChars chars(env, str); + if (chars.c_str() == NULL) { + return -1; } - else return -1; // Error outside BN. + return BN_hex2bn(&a, chars.c_str()); } /** |