From d130931b0b070a04911de29340888b7487da626d Mon Sep 17 00:00:00 2001 From: WyattRiley Date: Thu, 28 Feb 2019 12:11:45 -0800 Subject: [PATCH] SUPL ES Extension - Safer Init and Not After Boot Safe order of pointer setting and background thread start Verifying mCallEndElapsedRealtimeMillis is not the initial value Bug: 112159033 Bug: 115361555 Bug: 125124724 Test: Verified not-after-boot with test code b/115361555#comment14 Test: Reproed NPE with test thread sleep and verify fix Change-Id: Ic01a5d35d919ccea7934c8384253311261cd0167 --- .../internal/location/GpsNetInitiatedHandler.java | 9 +++++---- .../android/server/location/GnssLocationProvider.java | 7 +++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java index 866634e175137..e5fd0d342e9d1 100644 --- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java +++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java @@ -118,8 +118,8 @@ public class GpsNetInitiatedHandler { static private boolean mIsHexInput = true; // End time of emergency call, and extension, if set - private long mCallEndElapsedRealtimeMillis = 0; - private long mEmergencyExtensionMillis = 0; + private volatile long mCallEndElapsedRealtimeMillis = 0; + private volatile long mEmergencyExtensionMillis = 0; public static class GpsNiNotification { @@ -242,8 +242,9 @@ public class GpsNetInitiatedHandler { */ public boolean getInEmergency() { boolean isInEmergencyExtension = - (SystemClock.elapsedRealtime() - mCallEndElapsedRealtimeMillis) < - mEmergencyExtensionMillis; + (mCallEndElapsedRealtimeMillis > 0) + && ((SystemClock.elapsedRealtime() - mCallEndElapsedRealtimeMillis) + < mEmergencyExtensionMillis); boolean isInEmergencyCallback = mTelephonyManager.getEmergencyCallbackMode(); return mIsInEmergencyCall || isInEmergencyCallback || isInEmergencyExtension; } diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index b18110e80c2db..0a59e01ddc2b5 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -600,12 +600,11 @@ public class GnssLocationProvider extends AbstractLocationProvider implements // while IO initialization and registration is delegated to our internal handler // this approach is just fine because events are posted to our handler anyway mGnssConfiguration = new GnssConfiguration(mContext); - sendMessage(INITIALIZE_HANDLER, 0, null); - - // Create a GPS net-initiated handler. + // Create a GPS net-initiated handler (also needed by handleInitialize) mNIHandler = new GpsNetInitiatedHandler(context, mNetInitiatedListener, mSuplEsEnabled); + sendMessage(INITIALIZE_HANDLER, 0, null); mGnssStatusListenerHelper = new GnssStatusListenerHelper(mContext, mHandler) { @Override @@ -2166,4 +2165,4 @@ public class GnssLocationProvider extends AbstractLocationProvider implements int lac, int cid); private native void native_agps_set_id(int type, String setid); -} \ No newline at end of file +}