Fix exploit where can hide the fact that a location was mocked am: a206a0f17e am: d417e54872 am: 3380a77516 am: 0a8978f04b am: 1684e5f344 am: d28eef0cc2 am: 1f458fdc66 am: d82f8a67fc am: 1ac8affd51 am: 56098f81b6 am: 7cec76de0f am: 2da05d0f9e am: 3b7d90c024 am: f035e8b411
am: 8dc64b729b
Change-Id: I1b83d758c57b21c574de55e4de3a80283d9b7f56
This commit is contained in:
@@ -87,6 +87,8 @@ import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.os.WorkSource;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.EventLog;
|
||||
import android.util.Log;
|
||||
import android.util.Slog;
|
||||
|
||||
@@ -2552,9 +2554,22 @@ public class LocationManagerService extends ILocationManager.Stub {
|
||||
if (mockProvider == null) {
|
||||
throw new IllegalArgumentException("Provider \"" + provider + "\" unknown");
|
||||
}
|
||||
|
||||
// Ensure that the location is marked as being mock. There's some logic to do this in
|
||||
// handleLocationChanged(), but it fails if loc has the wrong provider (bug 33091107).
|
||||
Location mock = new Location(loc);
|
||||
mock.setIsFromMockProvider(true);
|
||||
|
||||
if (!TextUtils.isEmpty(loc.getProvider()) && !provider.equals(loc.getProvider())) {
|
||||
// The location has an explicit provider that is different from the mock provider
|
||||
// name. The caller may be trying to fool us via bug 33091107.
|
||||
EventLog.writeEvent(0x534e4554, "33091107", Binder.getCallingUid(),
|
||||
provider + "!=" + loc.getProvider());
|
||||
}
|
||||
|
||||
// clear calling identity so INSTALL_LOCATION_PROVIDER permission is not required
|
||||
long identity = Binder.clearCallingIdentity();
|
||||
mockProvider.setLocation(loc);
|
||||
mockProvider.setLocation(mock);
|
||||
Binder.restoreCallingIdentity(identity);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user