Fix two location bugs
-Telephony service accessed before it's ready.
-Checking binder UID after clearing calling identity.
Bug: 189305487
Bug: 189820484
Test: manual
Change-Id: I0b36418656df202f1ad48b78cb6012248b423c22
diff --git a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java
index a34d722..70a222f 100644
--- a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java
+++ b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java
@@ -35,17 +35,17 @@
private final Context mContext;
- private TelephonyManager mTelephonyManager;
+ TelephonyManager mTelephonyManager;
- private boolean mIsInEmergencyCall;
- private long mEmergencyCallEndRealtimeMs = Long.MIN_VALUE;
+ boolean mIsInEmergencyCall;
+ long mEmergencyCallEndRealtimeMs = Long.MIN_VALUE;
public SystemEmergencyHelper(Context context) {
mContext = context;
}
/** Called when system is ready. */
- public void onSystemReady() {
+ public synchronized void onSystemReady() {
if (mTelephonyManager != null) {
return;
}
@@ -64,14 +64,20 @@
return;
}
- mIsInEmergencyCall = mTelephonyManager.isEmergencyNumber(
- intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER));
+ synchronized (SystemEmergencyHelper.this) {
+ mIsInEmergencyCall = mTelephonyManager.isEmergencyNumber(
+ intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER));
+ }
}
}, new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL));
}
@Override
- public boolean isInEmergency(long extensionTimeMs) {
+ public synchronized boolean isInEmergency(long extensionTimeMs) {
+ if (mTelephonyManager == null) {
+ return false;
+ }
+
boolean isInExtensionTime = mEmergencyCallEndRealtimeMs != Long.MIN_VALUE
&& (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) < extensionTimeMs;
@@ -84,12 +90,16 @@
private class EmergencyCallTelephonyCallback extends TelephonyCallback implements
TelephonyCallback.CallStateListener{
+ EmergencyCallTelephonyCallback() {}
+
@Override
public void onCallStateChanged(int state) {
if (state == TelephonyManager.CALL_STATE_IDLE) {
- if (mIsInEmergencyCall) {
- mEmergencyCallEndRealtimeMs = SystemClock.elapsedRealtime();
- mIsInEmergencyCall = false;
+ synchronized (SystemEmergencyHelper.this) {
+ if (mIsInEmergencyCall) {
+ mEmergencyCallEndRealtimeMs = SystemClock.elapsedRealtime();
+ mIsInEmergencyCall = false;
+ }
}
}
}
diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
index 6d7f792..4f8b87b 100644
--- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java
+++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java
@@ -1527,16 +1527,16 @@
throw new IllegalArgumentException(mName + " provider is not a test provider");
}
+ String locationProvider = location.getProvider();
+ if (!TextUtils.isEmpty(locationProvider) && !mName.equals(locationProvider)) {
+ // The location has an explicit provider that is different from the mock
+ // provider name. The caller may be trying to fool us via b/33091107.
+ EventLog.writeEvent(0x534e4554, "33091107", Binder.getCallingUid(),
+ mName + "!=" + locationProvider);
+ }
+
final long identity = Binder.clearCallingIdentity();
try {
- String locationProvider = location.getProvider();
- if (!TextUtils.isEmpty(locationProvider) && !mName.equals(locationProvider)) {
- // The location has an explicit provider that is different from the mock
- // provider name. The caller may be trying to fool us via b/33091107.
- EventLog.writeEvent(0x534e4554, "33091107", Binder.getCallingUid(),
- mName + "!=" + locationProvider);
- }
-
mProvider.setMockProviderLocation(location);
} finally {
Binder.restoreCallingIdentity(identity);