Allow NULL JNI arguments for length 0 memcpys.

Bug 10393546.

Change-Id: Ifaba4481e5b356c3e85a32525e6007e35036fcd1
diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc
index a18a261..ceed866 100644
--- a/runtime/jni_internal.cc
+++ b/runtime/jni_internal.cc
@@ -611,6 +611,11 @@
     JniAbortF(#fn, #value " == null"); \
   }
 
+#define CHECK_NON_NULL_MEMCPY_ARGUMENT(fn, length, value) \
+  if (UNLIKELY(length != 0 && value == NULL)) { \
+    JniAbortF(#fn, #value " == null"); \
+  }
+
 class JNI {
  public:
   static jint GetVersion(JNIEnv*) {
@@ -1968,7 +1973,7 @@
     if (start < 0 || length < 0 || start + length > s->GetLength()) {
       ThrowSIOOBE(soa, start, length, s->GetLength());
     } else {
-      CHECK_NON_NULL_ARGUMENT(GetStringRegion, buf);
+      CHECK_NON_NULL_MEMCPY_ARGUMENT(GetStringRegion, length, buf);
       const jchar* chars = s->GetCharArray()->GetData() + s->GetOffset();
       memcpy(buf, chars + start, length * sizeof(jchar));
     }
@@ -1982,7 +1987,7 @@
     if (start < 0 || length < 0 || start + length > s->GetLength()) {
       ThrowSIOOBE(soa, start, length, s->GetLength());
     } else {
-      CHECK_NON_NULL_ARGUMENT(GetStringUTFRegion, buf);
+      CHECK_NON_NULL_MEMCPY_ARGUMENT(GetStringUTFRegion, length, buf);
       const jchar* chars = s->GetCharArray()->GetData() + s->GetOffset();
       ConvertUtf16ToModifiedUtf8(buf, chars + start, length);
     }
@@ -2566,7 +2571,7 @@
     if (start < 0 || length < 0 || start + length > array->GetLength()) {
       ThrowAIOOBE(soa, array, start, length, "src");
     } else {
-      CHECK_NON_NULL_ARGUMENT(GetPrimitiveArrayRegion, buf);
+      CHECK_NON_NULL_MEMCPY_ARGUMENT(GetStringRegion, length, buf);
       JavaT* data = array->GetData();
       memcpy(buf, data + start, length * sizeof(JavaT));
     }
@@ -2581,7 +2586,7 @@
     if (start < 0 || length < 0 || start + length > array->GetLength()) {
       ThrowAIOOBE(soa, array, start, length, "dst");
     } else {
-      CHECK_NON_NULL_ARGUMENT(SetPrimitiveArrayRegion, buf);
+      CHECK_NON_NULL_MEMCPY_ARGUMENT(GetStringRegion, length, buf);
       JavaT* data = array->GetData();
       memcpy(data + start, buf, length * sizeof(JavaT));
     }