DeleteLocalRef the result of GetObjectClass more consistently.
Should fix VM crashes in tests.java.sql.StressTest, which can now be
re-enabled.
I've also added a "throwoom" to the one place where this code
calls malloc but doesn't check the result.
Bug: 2213053
diff --git a/libcore/sql/src/main/native/sqlite_jni.c b/libcore/sql/src/main/native/sqlite_jni.c
index 1a23769..341ef2e 100644
--- a/libcore/sql/src/main/native/sqlite_jni.c
+++ b/libcore/sql/src/main/native/sqlite_jni.c
@@ -320,6 +320,10 @@
if (haveutf) {
const jsize utfLength = (*env)->GetStringUTFLength(env, src);
dest->result = dest->tofree = malloc(utfLength + 1);
+ if (!dest->tofree) {
+ throwoom(env, "string translation failed");
+ return dest->result;
+ }
(*env)->GetStringUTFRegion(env, src, 0, utfLength, dest->result);
return dest->result;
}
@@ -399,6 +403,7 @@
"(Ljava/lang/String;I)Z");
if (mid == 0) {
+ (*env)->DeleteLocalRef(env, cls);
return ret;
}
trans2utf(env, h->haveutf, h->enc, table, &tabstr);
@@ -406,6 +411,7 @@
(jint) count)
!= JNI_FALSE;
(*env)->DeleteLocalRef(env, tabstr.jstr);
+ (*env)->DeleteLocalRef(env, cls);
}
return ret;
}
@@ -425,10 +431,12 @@
"(Ljava/lang/String;I)Z");
if (mid == 0) {
+ (*env)->DeleteLocalRef(env, cls);
return ret;
}
ret = (*env)->CallBooleanMethod(env, h->bh, mid, 0, (jint) count)
!= JNI_FALSE;
+ (*env)->DeleteLocalRef(env, cls);
}
return ret;
}
@@ -446,9 +454,11 @@
jmethodID mid = (*env)->GetMethodID(env, cls, "progress", "()Z");
if (mid == 0) {
+ (*env)->DeleteLocalRef(env, cls);
return ret;
}
ret = (*env)->CallBooleanMethod(env, h->ph, mid) != JNI_TRUE;
+ (*env)->DeleteLocalRef(env, cls);
}
return ret;
}
@@ -1591,6 +1601,7 @@
int i;
if (mid == 0) {
+ (*env)->DeleteLocalRef(env, cls);
return;
}
arr = (*env)->NewObjectArray(env, nargs, C_java_lang_String, 0);
@@ -1639,6 +1650,7 @@
jmethodID mid = (*env)->GetMethodID(env, cls, "last_step",
"(LSQLite/FunctionContext;)V");
if (mid == 0) {
+ (*env)->DeleteLocalRef(env, cls);
return;
}
f->sf = sf;
@@ -1665,6 +1677,7 @@
int i;
if (mid == 0) {
+ (*env)->DeleteLocalRef(env, cls);
return;
}
arr = (*env)->NewObjectArray(env, nargs, C_java_lang_String, 0);
@@ -1714,6 +1727,7 @@
jmethodID mid = (*env)->GetMethodID(env, cls, "last_step",
"(LSQLite/FunctionContext;)V");
if (mid == 0) {
+ (*env)->DeleteLocalRef(env, cls);
return;
}
f->sf = sf;
diff --git a/libcore/sql/src/test/java/tests/java/sql/StressTest.java b/libcore/sql/src/test/java/tests/java/sql/StressTest.java
index 8b80690..b6d13c1 100755
--- a/libcore/sql/src/test/java/tests/java/sql/StressTest.java
+++ b/libcore/sql/src/test/java/tests/java/sql/StressTest.java
@@ -219,7 +219,6 @@
clazz = Driver.class,
args = {String.class, Properties.class}
)
- @BrokenTest("2191557 ReferenceTable overflow")
public void testInsertOfManyRowsUsingManyThreads() {
Logger.global.info("java.sql stress test: multiple threads and many operations.");