Fix leaks of JNI objects in the local reference table
Change-Id: I769502f8b13e0025707abdf98c24f2cac0604602
diff --git a/services/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/jni/com_android_server_location_FlpHardwareProvider.cpp
index 9465a68..b403ee6 100644
--- a/services/jni/com_android_server_location_FlpHardwareProvider.cpp
+++ b/services/jni/com_android_server_location_FlpHardwareProvider.cpp
@@ -217,6 +217,8 @@
}
// TODO: wire sources_used if Location class exposes them
+
+ env->DeleteLocalRef(locationClass);
}
/*
@@ -257,6 +259,8 @@
jmethodID getFlags = env->GetMethodID(batchOptionsClass, "getFlags", "()I");
batchOptions.flags = env->CallIntMethod(batchOptionsObject, getFlags);
+
+ env->DeleteLocalRef(batchOptionsClass);
}
/*
@@ -326,6 +330,8 @@
options->last_transition = env->CallIntMethod(geofenceRequestObject, getLastTransition);
// TODO: set data.sources_to_use when available
+
+ env->DeleteLocalRef(geofenceRequestClass);
}
/*
@@ -408,6 +414,8 @@
}
// TODO: wire FlpLocation::sources_used when needed
+
+ sCallbackEnv->DeleteLocalRef(locationClass);
}
/*
@@ -430,6 +438,8 @@
sCallbackEnv->SetObjectArrayElement(locationsArray, i, locationObject);
sCallbackEnv->DeleteLocalRef(locationObject);
}
+
+ sCallbackEnv->DeleteLocalRef(locationClass);
}
static void LocationCallback(int32_t locationsCount, FlpLocation** locations) {
@@ -455,6 +465,10 @@
locationsArray
);
CheckExceptions(sCallbackEnv, __FUNCTION__);
+
+ if(locationsArray != NULL) {
+ sCallbackEnv->DeleteLocalRef(locationsArray);
+ }
}
static void AcquireWakelock() {
@@ -522,6 +536,10 @@
sourcesUsed
);
CheckExceptions(sCallbackEnv, __FUNCTION__);
+
+ if(locationObject != NULL) {
+ sCallbackEnv->DeleteLocalRef(locationObject);
+ }
}
static void GeofenceMonitorStatusCallback(
@@ -545,6 +563,10 @@
locationObject
);
CheckExceptions(sCallbackEnv, __FUNCTION__);
+
+ if(locationObject != NULL) {
+ sCallbackEnv->DeleteLocalRef(locationObject);
+ }
}
static void GeofenceAddCallback(int32_t geofenceId, int32_t result) {
@@ -843,6 +865,7 @@
jobject geofenceObject = env->GetObjectArrayElement(geofenceRequestsArray, i);
TranslateGeofenceFromGeofenceHardwareRequestParcelable(env, geofenceObject, geofences[i]);
+ env->DeleteLocalRef(geofenceObject);
}
sFlpGeofencingInterface->add_geofences(geofenceRequestsCount, &geofences);