Improve error messages for bad modified UTF-8 strings passed to JNI functions.

Bug: 2567771
Change-Id: I8b67d13aaf0127f7eafffd69beb6f3b63729182f
diff --git a/vm/CheckJni.c b/vm/CheckJni.c
index e111187..f8815fb 100644
--- a/vm/CheckJni.c
+++ b/vm/CheckJni.c
@@ -75,7 +75,7 @@
     const char* objType = objClazz->descriptor;
     if (strcmp(declType, objType) == 0) {
         /* names match; ignore class loader issues and allow it */
-        LOGV("Check %s.%s: %s io %s (FAST-OK)\n",
+        LOGV("Check %s.%s: %s io %s (FAST-OK)",
             method->clazz->descriptor, method->name, objType, declType);
     } else {
         /*
@@ -93,22 +93,22 @@
 
         declClazz = dvmFindClassNoInit(declType, method->clazz->classLoader);
         if (declClazz == NULL) {
-            LOGW("JNI WARNING: method declared to return '%s' returned '%s'\n",
+            LOGW("JNI WARNING: method declared to return '%s' returned '%s'",
                 declType, objType);
-            LOGW("             failed in %s.%s ('%s' not found)\n",
+            LOGW("             failed in %s.%s ('%s' not found)",
                 method->clazz->descriptor, method->name, declType);
             abortMaybe();
             return;
         }
         if (!dvmInstanceof(objClazz, declClazz)) {
-            LOGW("JNI WARNING: method declared to return '%s' returned '%s'\n",
+            LOGW("JNI WARNING: method declared to return '%s' returned '%s'",
                 declType, objType);
-            LOGW("             failed in %s.%s\n",
+            LOGW("             failed in %s.%s",
                 method->clazz->descriptor, method->name);
             abortMaybe();
             return;
         } else {
-            LOGV("Check %s.%s: %s io %s (SLOW-OK)\n",
+            LOGV("Check %s.%s: %s io %s (SLOW-OK)",
                 method->clazz->descriptor, method->name, objType, declType);
         }
     }
@@ -233,8 +233,10 @@
     checkClass(_env, _clazz, __FUNCTION__)
 #define CHECK_STRING(_env, _str)                                            \
     checkString(_env, _str, __FUNCTION__)
-#define CHECK_UTF_STRING(_env, _str, _nullok)                               \
-    checkUtfString(_env, _str, _nullok, __FUNCTION__)
+#define CHECK_UTF_STRING(_env, _str)                                        \
+    checkUtfString(_env, _str, #_str, __FUNCTION__)
+#define CHECK_NULLABLE_UTF_STRING(_env, _str)                               \
+    checkUtfString(_env, _str, NULL, __FUNCTION__)
 #define CHECK_CLASS_NAME(_env, _str)                                        \
     checkClassName(_env, _str, __FUNCTION__)
 #define CHECK_OBJECT(_env, _obj)                                            \
@@ -286,7 +288,7 @@
 static void showLocation(const Method* meth, const char* func)
 {
     char* desc = dexProtoCopyMethodDescriptor(&meth->prototype);
-    LOGW("             in %s.%s %s (%s)\n",
+    LOGW("             in %s.%s %s (%s)",
         meth->clazz->descriptor, meth->name, desc, func + 6);
     free(desc);
 }
@@ -334,16 +336,16 @@
      * to receive.
      */
     if (threadEnv == NULL) {
-        LOGE("JNI ERROR: non-VM thread making JNI calls\n");
+        LOGE("JNI ERROR: non-VM thread making JNI calls");
         // don't set printWarn -- it'll try to call showLocation()
         dvmAbort();
     } else if ((JNIEnvExt*) env != threadEnv) {
         if (dvmThreadSelf()->threadId != threadEnv->envThreadId) {
-            LOGE("JNI: threadEnv != thread->env?\n");
+            LOGE("JNI: threadEnv != thread->env?");
             dvmAbort();
         }
 
-        LOGW("JNI WARNING: threadid=%d using env from threadid=%d\n",
+        LOGW("JNI WARNING: threadid=%d using env from threadid=%d",
             threadEnv->envThreadId, ((JNIEnvExt*)env)->envThreadId);
         printWarn = true;
 
@@ -352,7 +354,7 @@
         //    "invalid use of JNI env ptr");
     } else if (((JNIEnvExt*) env)->self != dvmThreadSelf()) {
         /* correct JNIEnv*; make sure the "self" pointer is correct */
-        LOGE("JNI ERROR: env->self != thread-self (%p vs. %p)\n",
+        LOGE("JNI ERROR: env->self != thread-self (%p vs. %p)",
             ((JNIEnvExt*) env)->self, dvmThreadSelf());
         dvmAbort();
     }
@@ -365,7 +367,7 @@
         break;
     case kFlag_CritBad:     // not okay to call
         if (threadEnv->critical) {
-            LOGW("JNI WARNING: threadid=%d using JNI after critical get\n",
+            LOGW("JNI WARNING: threadid=%d using JNI after critical get",
                 threadEnv->envThreadId);
             printWarn = true;
         }
@@ -377,7 +379,7 @@
     case kFlag_CritRelease: // this is a "release" call
         threadEnv->critical--;
         if (threadEnv->critical < 0) {
-            LOGW("JNI WARNING: threadid=%d called too many crit releases\n",
+            LOGW("JNI WARNING: threadid=%d called too many crit releases",
                 threadEnv->envThreadId);
             printWarn = true;
         }
@@ -390,7 +392,7 @@
      * Check for raised exceptions.
      */
     if ((flags & kFlag_ExcepOkay) == 0 && dvmCheckException(dvmThreadSelf())) {
-        LOGW("JNI WARNING: JNI method called with exception raised\n");
+        LOGW("JNI WARNING: JNI method called with exception raised");
         printWarn = true;
         printException = true;
     }
@@ -398,7 +400,7 @@
     if (printWarn)
         showLocation(dvmGetCurrentJNIMethod(), func);
     if (printException) {
-        LOGW("Pending exception is:\n");
+        LOGW("Pending exception is:");
         dvmLogExceptionStackTrace();
     }
     if (printWarn)
@@ -423,7 +425,7 @@
     bool printWarn = false;
 
     if (fieldID == NULL) {
-        LOGE("JNI ERROR: null field ID\n");
+        LOGE("JNI ERROR: null field ID");
         abortMaybe();
     }
 
@@ -438,21 +440,21 @@
             assert(objClass != NULL);
 
             if (!dvmInstanceof(objClass, fieldClass)) {
-                LOGW("JNI WARNING: field '%s' with type '%s' set with wrong type (%s)\n",
+                LOGW("JNI WARNING: field '%s' with type '%s' set with wrong type (%s)",
                     field->name, field->signature, objClass->descriptor);
                 printWarn = true;
             }
         }
     } else if (field->signature[0] != PRIM_TYPE_TO_LETTER[prim]) {
-        LOGW("JNI WARNING: field '%s' with type '%s' set with wrong type (%s)\n",
+        LOGW("JNI WARNING: field '%s' with type '%s' set with wrong type (%s)",
             field->name, field->signature, primNames[prim]);
         printWarn = true;
     } else if (isStatic && !dvmIsStaticField(field)) {
         if (isStatic)
-            LOGW("JNI WARNING: accessing non-static field %s as static\n",
+            LOGW("JNI WARNING: accessing non-static field %s as static",
                 field->name);
         else
-            LOGW("JNI WARNING: accessing static field %s as non-static\n",
+            LOGW("JNI WARNING: accessing static field %s as non-static",
                 field->name);
         printWarn = true;
     }
@@ -486,13 +488,13 @@
     }
 
     if (dvmGetJNIRefType(env, jobj) == JNIInvalidRefType) {
-        LOGW("JNI WARNING: %p is not a valid JNI reference\n", jobj);
+        LOGW("JNI WARNING: %p is not a valid JNI reference", jobj);
         printWarn = true;
     } else {
         Object* obj = dvmDecodeIndirectRef(env, jobj);
 
         if (obj == NULL || !dvmIsValidObject(obj)) {
-            LOGW("JNI WARNING: native code passing in bad object %p %p (%s)\n",
+            LOGW("JNI WARNING: native code passing in bad object %p %p (%s)",
                 jobj, obj, func);
             printWarn = true;
         }
@@ -536,14 +538,14 @@
     Object* obj = dvmDecodeIndirectRef(env, jclazz);
 
     if (obj == NULL) {
-        LOGW("JNI WARNING: received null jclass\n");
+        LOGW("JNI WARNING: received null jclass");
         printWarn = true;
     } else if (!dvmIsValidObject(obj)) {
-        LOGW("JNI WARNING: jclass points to invalid object %p\n", obj);
+        LOGW("JNI WARNING: jclass points to invalid object %p", obj);
         printWarn = true;
     } else if (obj->clazz != gDvm.classJavaLangClass) {
         LOGW("JNI WARNING: jclass arg is not a Class reference "
-             "(%p is instance of %s)\n",
+             "(%p is instance of %s)",
             jclazz, obj->clazz->descriptor);
         printWarn = true;
     }
@@ -568,7 +570,7 @@
     Object* obj = dvmDecodeIndirectRef(env, jstr);
 
     if (obj == NULL) {
-        LOGW("JNI WARNING: received null jstring (%s)\n", func);
+        LOGW("JNI WARNING: received null jstring (%s)", func);
         printWarn = true;
     } else if (obj->clazz != gDvm.classJavaLangString) {
         /*
@@ -578,10 +580,11 @@
          * we're doing it again over in checkObject().
          */
         if (dvmIsValidObject(obj))
-            LOGW("JNI WARNING: jstring %p points to non-string object (%s)\n",
+            LOGW("JNI WARNING: jstring %p points to non-string object (%s)",
                 jstr, func);
         else
-            LOGW("JNI WARNING: jstring %p is bogus (%s)\n", jstr, func);
+            LOGW("JNI WARNING: jstring %p is not a valid object (%s)", jstr,
+                func);
         printWarn = true;
     }
     JNI_EXIT();
@@ -594,23 +597,27 @@
 
 /*
  * Verify that "bytes" points to valid "modified UTF-8" data.
+ * If "identifier" is NULL, "bytes" is allowed to be NULL; otherwise,
+ * "identifier" is the name to use when reporting the null pointer.
  */
-static void checkUtfString(JNIEnv* env, const char* bytes, bool nullOk,
-    const char* func)
+static void checkUtfString(JNIEnv* env, const char* bytes,
+    const char* identifier, const char* func)
 {
     const char* origBytes = bytes;
 
     if (bytes == NULL) {
-        if (!nullOk) {
-            LOGW("JNI WARNING: unexpectedly null UTF string\n");
+        if (identifier != NULL) {
+            LOGW("JNI WARNING: %s == NULL", identifier);
             goto fail;
         }
 
         return;
     }
 
+    const char* errorKind = NULL;
+    u1 utf8;
     while (*bytes != '\0') {
-        u1 utf8 = *(bytes++);
+        utf8 = *(bytes++);
         // Switch on the high four bits.
         switch (utf8 >> 4) {
             case 0x00:
@@ -634,15 +641,15 @@
                  * Note: 1111 is valid for normal UTF-8, but not the
                  * modified UTF-8 used here.
                  */
-                LOGW("JNI WARNING: illegal start byte 0x%x\n", utf8);
-                goto fail;
+                errorKind = "start";
+                goto fail_with_string;
             }
             case 0x0e: {
                 // Bit pattern 1110, so there are two additional bytes.
                 utf8 = *(bytes++);
                 if ((utf8 & 0xc0) != 0x80) {
-                    LOGW("JNI WARNING: illegal continuation byte 0x%x\n", utf8);
-                    goto fail;
+                    errorKind = "continuation";
+                    goto fail_with_string;
                 }
                 // Fall through to take care of the final byte.
             }
@@ -651,8 +658,8 @@
                 // Bit pattern 110x, so there is one additional byte.
                 utf8 = *(bytes++);
                 if ((utf8 & 0xc0) != 0x80) {
-                    LOGW("JNI WARNING: illegal continuation byte 0x%x\n", utf8);
-                    goto fail;
+                    errorKind = "continuation";
+                    goto fail_with_string;
                 }
                 break;
             }
@@ -661,8 +668,11 @@
 
     return;
 
+fail_with_string:
+    LOGW("JNI WARNING: input is not valid UTF-8: illegal %s byte 0x%x",
+        errorKind, utf8);
+    LOGW("             string: '%s'", origBytes);
 fail:
-    LOGW("             string: '%s'\n", origBytes);
     showLocation(dvmGetCurrentJNIMethod(), func);
     abortMaybe();
 }
@@ -699,8 +709,8 @@
     return;
 
 fail:
-    LOGW("JNI WARNING: illegal class name '%s' (%s)\n", className, func);
-    LOGW("             (should be formed like 'java/lang/String')\n");
+    LOGW("JNI WARNING: illegal class name '%s' (%s)", className, func);
+    LOGW("             (should be formed like 'java/lang/String')");
     abortMaybe();
 }
 
@@ -717,14 +727,14 @@
     Object* obj = dvmDecodeIndirectRef(env, jarr);
 
     if (obj == NULL) {
-        LOGW("JNI WARNING: received null array (%s)\n", func);
+        LOGW("JNI WARNING: received null array (%s)", func);
         printWarn = true;
     } else if (obj->clazz->descriptor[0] != '[') {
         if (dvmIsValidObject(obj))
-            LOGW("JNI WARNING: jarray %p points to non-array object (%s)\n",
+            LOGW("JNI WARNING: jarray %p points to non-array object (%s)",
                 jarr, obj->clazz->descriptor);
         else
-            LOGW("JNI WARNING: jarray %p is bogus\n", jarr);
+            LOGW("JNI WARNING: jarray %p is not a valid object", jarr);
         printWarn = true;
     }
 
@@ -743,7 +753,7 @@
 static void checkReleaseMode(JNIEnv* env, jint mode, const char* func)
 {
     if (mode != 0 && mode != JNI_COMMIT && mode != JNI_ABORT) {
-        LOGW("JNI WARNING: bad value for mode (%d) (%s)\n", mode, func);
+        LOGW("JNI WARNING: bad value for mode (%d) (%s)", mode, func);
         abortMaybe();
     }
 }
@@ -754,7 +764,7 @@
 static void checkLengthPositive(JNIEnv* env, jsize length, const char* func)
 {
     if (length < 0) {
-        LOGW("JNI WARNING: negative length for array allocation (%s)\n", func);
+        LOGW("JNI WARNING: negative length for array allocation (%s)", func);
         abortMaybe();
     }
 }
@@ -765,7 +775,7 @@
 static void checkNonNull(JNIEnv* env, const void* ptr, const char* func)
 {
     if (ptr == NULL) {
-        LOGW("JNI WARNING: invalid null pointer (%s)\n", func);
+        LOGW("JNI WARNING: invalid null pointer (%s)", func);
         abortMaybe();
     }
 }
@@ -782,19 +792,19 @@
     bool printWarn = false;
 
     if (expectedSigByte != meth->shorty[0]) {
-        LOGW("JNI WARNING: expected return type '%c'\n", expectedSigByte);
+        LOGW("JNI WARNING: expected return type '%c'", expectedSigByte);
         printWarn = true;
     } else if (isStatic && !dvmIsStaticMethod(meth)) {
         if (isStatic)
-            LOGW("JNI WARNING: calling non-static method with static call\n");
+            LOGW("JNI WARNING: calling non-static method with static call");
         else
-            LOGW("JNI WARNING: calling static method with non-static call\n");
+            LOGW("JNI WARNING: calling static method with non-static call");
         printWarn = true;
     }
 
     if (printWarn) {
         char* desc = dexProtoCopyMethodDescriptor(&meth->prototype);
-        LOGW("             calling %s.%s %s\n",
+        LOGW("             calling %s.%s %s",
             meth->clazz->descriptor, meth->name, desc);
         free(desc);
         showLocation(dvmGetCurrentJNIMethod(), func);
@@ -814,9 +824,9 @@
     if ((StaticField*) fieldID < base ||
         (StaticField*) fieldID >= base + fieldCount)
     {
-        LOGW("JNI WARNING: static fieldID %p not valid for class %s\n",
+        LOGW("JNI WARNING: static fieldID %p not valid for class %s",
             fieldID, clazz->descriptor);
-        LOGW("             base=%p count=%d\n", base, fieldCount);
+        LOGW("             base=%p count=%d", base, fieldCount);
         abortMaybe();
     }
 }
@@ -830,7 +840,7 @@
     JNI_ENTER();
 
     if (jobj == NULL) {
-        LOGW("JNI WARNING: invalid null object (%s)\n", func);
+        LOGW("JNI WARNING: invalid null object (%s)", func);
         abortMaybe();
         goto bail;
     }
@@ -852,7 +862,7 @@
         clazz = clazz->super;
     }
 
-    LOGW("JNI WARNING: inst fieldID %p not valid for class %s\n",
+    LOGW("JNI WARNING: inst fieldID %p not valid for class %s",
         fieldID, obj->clazz->descriptor);
     abortMaybe();
 
@@ -876,7 +886,7 @@
     const Method* meth = (const Method*) methodID;
 
     if (!dvmInstanceof(obj->clazz, meth->clazz)) {
-        LOGW("JNI WARNING: can't call %s.%s on instance of %s\n",
+        LOGW("JNI WARNING: can't call %s.%s on instance of %s",
             meth->clazz->descriptor, meth->name, obj->clazz->descriptor);
         abortMaybe();
     }
@@ -902,7 +912,7 @@
     const Method* meth = (const Method*) methodID;
 
     if (!dvmInstanceof(clazz, meth->clazz)) {
-        LOGW("JNI WARNING: can't call static %s.%s on class %s\n",
+        LOGW("JNI WARNING: can't call static %s.%s on class %s",
             meth->clazz->descriptor, meth->name, clazz->descriptor);
         // no abort
     }
@@ -933,7 +943,7 @@
     const Method* meth = (const Method*) methodID;
     const char* desc = meth->shorty;
 
-    LOGV("V-checking %s.%s:%s...\n", meth->clazz->descriptor, meth->name, desc);
+    LOGV("V-checking %s.%s:%s...", meth->clazz->descriptor, meth->name, desc);
 
     while (*++desc != '\0') {       /* pre-incr to skip return type */
         switch (*desc) {
@@ -972,7 +982,7 @@
     const char* desc = meth->shorty;
     int idx = 0;
 
-    LOGV("A-checking %s.%s:%s...\n", meth->clazz->descriptor, meth->name, desc);
+    LOGV("A-checking %s.%s:%s...", meth->clazz->descriptor, meth->name, desc);
 
     while (*++desc != '\0') {       /* pre-incr to skip return type */
         if (*desc == 'L') {
@@ -1030,7 +1040,7 @@
 
     newBuf = (u1*)malloc(newLen);
     if (newBuf == NULL) {
-        LOGE("createGuardedCopy failed on alloc of %d bytes\n", newLen);
+        LOGE("createGuardedCopy failed on alloc of %d bytes", newLen);
         dvmAbort();
     }
 
@@ -1084,7 +1094,7 @@
         u1 buf[4];
         memcpy(buf, &pExtra->magic, 4);
         LOGE("JNI: guard magic does not match (found 0x%02x%02x%02x%02x) "
-             "-- incorrect data pointer %p?\n",
+             "-- incorrect data pointer %p?",
             buf[3], buf[2], buf[1], buf[0], dataBuf); /* assume little endian */
         return false;
     }
@@ -1096,7 +1106,7 @@
     for (i = kGuardExtra / 2; i < (int) (kGuardLen / 2 - kGuardExtra) / 2; i++)
     {
         if (pat[i] != kGuardPattern) {
-            LOGE("JNI: guard pattern(1) disturbed at %p + %d\n",
+            LOGE("JNI: guard pattern(1) disturbed at %p + %d",
                 fullBuf, i*2);
             return false;
         }
@@ -1108,7 +1118,7 @@
         const u2 patSample = kGuardPattern;
         if (fullBuf[offset] != ((const u1*) &patSample)[1]) {
             LOGE("JNI: guard pattern disturbed in odd byte after %p "
-                 "(+%d) 0x%02x 0x%02x\n",
+                 "(+%d) 0x%02x 0x%02x",
                 fullBuf, offset, fullBuf[offset], ((const u1*) &patSample)[1]);
             return false;
         }
@@ -1119,7 +1129,7 @@
     pat = (u2*) (fullBuf + offset);
     for (i = 0; i < kGuardLen / 4; i++) {
         if (pat[i] != kGuardPattern) {
-            LOGE("JNI: guard pattern(2) disturbed at %p + %d\n",
+            LOGE("JNI: guard pattern(2) disturbed at %p + %d",
                 fullBuf, offset + i*2);
             return false;
         }
@@ -1134,7 +1144,7 @@
         uLong adler = adler32(0L, Z_NULL, 0);
         adler = adler32(adler, dataBuf, len);
         if (pExtra->adler != adler) {
-            LOGE("JNI: buffer modified (0x%08lx vs 0x%08lx) at addr %p\n",
+            LOGE("JNI: buffer modified (0x%08lx vs 0x%08lx) at addr %p",
                 pExtra->adler, adler, dataBuf);
             return false;
         }
@@ -1228,7 +1238,7 @@
     u1* result;
 
     if (!checkGuardedCopy(dataBuf, true)) {
-        LOGE("JNI: failed guarded copy check in releaseGuardedPACopy\n");
+        LOGE("JNI: failed guarded copy check in releaseGuardedPACopy");
         abortMaybe();
         return NULL;
     }
@@ -1246,7 +1256,7 @@
         copyBack = true;
         break;
     default:
-        LOGE("JNI: bad release mode %d\n", mode);
+        LOGE("JNI: bad release mode %d", mode);
         dvmAbort();
         return NULL;
     }
@@ -1289,7 +1299,7 @@
 {
     CHECK_ENTER(env, kFlag_Default);
     CHECK_OBJECT(env, loader);
-    CHECK_UTF_STRING(env, name, false);
+    CHECK_UTF_STRING(env, name);
     CHECK_CLASS_NAME(env, name);
     jclass result;
     result = BASE_ENV(env)->DefineClass(env, name, loader, buf, bufLen);
@@ -1300,7 +1310,7 @@
 static jclass Check_FindClass(JNIEnv* env, const char* name)
 {
     CHECK_ENTER(env, kFlag_Default);
-    CHECK_UTF_STRING(env, name, false);
+    CHECK_UTF_STRING(env, name);
     CHECK_CLASS_NAME(env, name);
     jclass result;
     result = BASE_ENV(env)->FindClass(env, name);
@@ -1386,7 +1396,7 @@
 {
     CHECK_ENTER(env, kFlag_Default);
     CHECK_CLASS(env, clazz);
-    CHECK_UTF_STRING(env, message, true);
+    CHECK_NULLABLE_UTF_STRING(env, message);
     jint result;
     result = BASE_ENV(env)->ThrowNew(env, clazz, message);
     CHECK_EXIT(env);
@@ -1419,7 +1429,7 @@
 static void Check_FatalError(JNIEnv* env, const char* msg)
 {
     CHECK_ENTER(env, kFlag_Default);
-    CHECK_UTF_STRING(env, msg, true);
+    CHECK_NULLABLE_UTF_STRING(env, msg);
     BASE_ENV(env)->FatalError(env, msg);
     CHECK_EXIT(env);
 }
@@ -1461,7 +1471,7 @@
     if (globalRef != NULL &&
         dvmGetJNIRefType(env, globalRef) != JNIGlobalRefType)
     {
-        LOGW("JNI WARNING: DeleteGlobalRef on non-global %p (type=%d)\n",
+        LOGW("JNI WARNING: DeleteGlobalRef on non-global %p (type=%d)",
             globalRef, dvmGetJNIRefType(env, globalRef));
         abortMaybe();
     } else
@@ -1490,7 +1500,7 @@
     if (localRef != NULL &&
         dvmGetJNIRefType(env, localRef) != JNILocalRefType)
     {
-        LOGW("JNI WARNING: DeleteLocalRef on non-local %p (type=%d)\n",
+        LOGW("JNI WARNING: DeleteLocalRef on non-local %p (type=%d)",
             localRef, dvmGetJNIRefType(env, localRef));
         abortMaybe();
     } else
@@ -1606,8 +1616,8 @@
 {
     CHECK_ENTER(env, kFlag_Default);
     CHECK_CLASS(env, clazz);
-    CHECK_UTF_STRING(env, name, false);
-    CHECK_UTF_STRING(env, sig, false);
+    CHECK_UTF_STRING(env, name);
+    CHECK_UTF_STRING(env, sig);
     jmethodID result;
     result = BASE_ENV(env)->GetMethodID(env, clazz, name, sig);
     CHECK_EXIT(env);
@@ -1619,8 +1629,8 @@
 {
     CHECK_ENTER(env, kFlag_Default);
     CHECK_CLASS(env, clazz);
-    CHECK_UTF_STRING(env, name, false);
-    CHECK_UTF_STRING(env, sig, false);
+    CHECK_UTF_STRING(env, name);
+    CHECK_UTF_STRING(env, sig);
     jfieldID result;
     result = BASE_ENV(env)->GetFieldID(env, clazz, name, sig);
     CHECK_EXIT(env);
@@ -1632,8 +1642,8 @@
 {
     CHECK_ENTER(env, kFlag_Default);
     CHECK_CLASS(env, clazz);
-    CHECK_UTF_STRING(env, name, false);
-    CHECK_UTF_STRING(env, sig, false);
+    CHECK_UTF_STRING(env, name);
+    CHECK_UTF_STRING(env, sig);
     jmethodID result;
     result = BASE_ENV(env)->GetStaticMethodID(env, clazz, name, sig);
     CHECK_EXIT(env);
@@ -1645,8 +1655,8 @@
 {
     CHECK_ENTER(env, kFlag_Default);
     CHECK_CLASS(env, clazz);
-    CHECK_UTF_STRING(env, name, false);
-    CHECK_UTF_STRING(env, sig, false);
+    CHECK_UTF_STRING(env, name);
+    CHECK_UTF_STRING(env, sig);
     jfieldID result;
     result = BASE_ENV(env)->GetStaticFieldID(env, clazz, name, sig);
     CHECK_EXIT(env);
@@ -1980,7 +1990,7 @@
     CHECK_NON_NULL(env, chars);
     if (((JNIEnvExt*)env)->forceDataCopy) {
         if (!checkGuardedCopy(chars, false)) {
-            LOGE("JNI: failed guarded copy check in ReleaseStringChars\n");
+            LOGE("JNI: failed guarded copy check in ReleaseStringChars");
             abortMaybe();
             return;
         }
@@ -1993,7 +2003,7 @@
 static jstring Check_NewStringUTF(JNIEnv* env, const char* bytes)
 {
     CHECK_ENTER(env, kFlag_Default);
-    CHECK_UTF_STRING(env, bytes, true);
+    CHECK_NULLABLE_UTF_STRING(env, bytes);
     jstring result;
     result = BASE_ENV(env)->NewStringUTF(env, bytes);
     CHECK_EXIT(env);
@@ -2037,7 +2047,7 @@
     if (((JNIEnvExt*)env)->forceDataCopy) {
         //int len = dvmStringUtf8ByteLen(string) + 1;
         if (!checkGuardedCopy(utf, false)) {
-            LOGE("JNI: failed guarded copy check in ReleaseStringUTFChars\n");
+            LOGE("JNI: failed guarded copy check in ReleaseStringUTFChars");
             abortMaybe();
             return;
         }
@@ -2303,7 +2313,7 @@
     CHECK_NON_NULL(env, carray);
     if (((JNIEnvExt*)env)->forceDataCopy) {
         if (!checkGuardedCopy(carray, false)) {
-            LOGE("JNI: failed guarded copy check in ReleaseStringCritical\n");
+            LOGE("JNI: failed guarded copy check in ReleaseStringCritical");
             abortMaybe();
             return;
         }
@@ -2356,7 +2366,7 @@
     CHECK_ENTER(env, kFlag_Default);
     jobject result;
     if (address == NULL || capacity < 0) {
-        LOGW("JNI WARNING: invalid values for address (%p) or capacity (%ld)\n",
+        LOGW("JNI WARNING: invalid values for address (%p) or capacity (%ld)",
             address, (long) capacity);
         abortMaybe();
         return NULL;