Location Manager: Fix LocationManager.getBestProvider filtering.
getBestProvider should only return location providers that the client
has permission to use.
BUG: 3124614
Change-Id: I065091d0445092563bc53fb4f7d93a1ab6bebb9a
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index 8644ceb..10107c6 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -574,15 +574,16 @@
|| LocationManager.PASSIVE_PROVIDER.equals(provider))
&& (mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)) {
- throw new SecurityException("Requires ACCESS_FINE_LOCATION permission");
+ throw new SecurityException("Provider " + provider
+ + " requires ACCESS_FINE_LOCATION permission");
}
if (LocationManager.NETWORK_PROVIDER.equals(provider)
&& (mContext.checkCallingOrSelfPermission(ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
&& (mContext.checkCallingOrSelfPermission(ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)) {
- throw new SecurityException(
- "Requires ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permission");
+ throw new SecurityException("Provider " + provider
+ + " requires ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION permission");
}
}
@@ -741,9 +742,9 @@
private LocationProviderInterface best(List<String> providerNames) {
ArrayList<LocationProviderInterface> providers;
synchronized (mLock) {
- providers = new ArrayList<LocationProviderInterface>(mProviders.size());
- for (int i = mProviders.size() - 1; i >= 0; i--) {
- providers.add(mProviders.get(i));
+ providers = new ArrayList<LocationProviderInterface>(providerNames.size());
+ for (String name : providerNames) {
+ providers.add(mProvidersByName.get(name));
}
}