Ensure access to the map of geofence callbacks is synchronized in all cases
Fix Java reference leak in the JNI layer
Bug: 10624887
Change-Id: I656973653d82c73a7ba2b51f22989ffed144c5df
diff --git a/core/java/android/hardware/location/GeofenceHardwareImpl.java b/core/java/android/hardware/location/GeofenceHardwareImpl.java
index eac6620..6b61690 100644
--- a/core/java/android/hardware/location/GeofenceHardwareImpl.java
+++ b/core/java/android/hardware/location/GeofenceHardwareImpl.java
@@ -18,17 +18,14 @@
import android.content.Context;
import android.content.pm.PackageManager;
-import android.location.FusedBatchOptions;
import android.location.IFusedGeofenceHardware;
import android.location.IGpsGeofenceHardware;
import android.location.Location;
-import android.location.LocationManager;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.PowerManager;
import android.os.RemoteException;
-import android.os.SystemClock;
import android.util.Log;
import android.util.SparseArray;
@@ -601,12 +598,13 @@
GeofenceTransition geofenceTransition = (GeofenceTransition)(msg.obj);
synchronized (mGeofences) {
callback = mGeofences.get(geofenceTransition.mGeofenceId);
- }
- if (DEBUG) Log.d(TAG, "GeofenceTransistionCallback: GPS : GeofenceId: " +
- geofenceTransition.mGeofenceId +
- " Transition: " + geofenceTransition.mTransition +
- " Location: " + geofenceTransition.mLocation + ":" + mGeofences);
+ // need to keep access to mGeofences synchronized at all times
+ if (DEBUG) Log.d(TAG, "GeofenceTransistionCallback: GPS : GeofenceId: " +
+ geofenceTransition.mGeofenceId +
+ " Transition: " + geofenceTransition.mTransition +
+ " Location: " + geofenceTransition.mLocation + ":" + mGeofences);
+ }
if (callback != null) {
try {
diff --git a/services/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/jni/com_android_server_location_FlpHardwareProvider.cpp
index ac269eb..6c14887 100644
--- a/services/jni/com_android_server_location_FlpHardwareProvider.cpp
+++ b/services/jni/com_android_server_location_FlpHardwareProvider.cpp
@@ -938,6 +938,7 @@
}
sFlpGeofencingInterface->remove_geofences(geofenceIdsCount, geofenceIds);
+ env->ReleaseIntArrayElements(geofenceIdsArray, geofenceIds, 0 /*mode*/);
}
static JNINativeMethod sMethods[] = {