From 7f02eb2c84c0a39e6357aca10a4fda1dd090a8a6 Mon Sep 17 00:00:00 2001 From: destradaa Date: Fri, 20 Sep 2013 13:08:41 -0700 Subject: [PATCH] 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 --- .../hardware/location/GeofenceHardwareImpl.java | 14 ++++++-------- ...android_server_location_FlpHardwareProvider.cpp | 1 + 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/core/java/android/hardware/location/GeofenceHardwareImpl.java b/core/java/android/hardware/location/GeofenceHardwareImpl.java index eac662020c646..6b616909d1287 100644 --- a/core/java/android/hardware/location/GeofenceHardwareImpl.java +++ b/core/java/android/hardware/location/GeofenceHardwareImpl.java @@ -18,17 +18,14 @@ package android.hardware.location; 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 @@ public final class GeofenceHardwareImpl { 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 ac269eb468b8b..6c14887ef6272 100644 --- a/services/jni/com_android_server_location_FlpHardwareProvider.cpp +++ b/services/jni/com_android_server_location_FlpHardwareProvider.cpp @@ -938,6 +938,7 @@ static void RemoveGeofences( } sFlpGeofencingInterface->remove_geofences(geofenceIdsCount, geofenceIds); + env->ReleaseIntArrayElements(geofenceIdsArray, geofenceIds, 0 /*mode*/); } static JNINativeMethod sMethods[] = {