diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 1bdfe87bdb5bb..f5330b444818f 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -48,6 +48,7 @@ import android.util.ArrayMap; import android.util.Log; import com.android.internal.location.ProviderProperties; +import com.android.internal.util.Preconditions; import java.util.ArrayList; import java.util.List; @@ -2298,18 +2299,19 @@ public class LocationManager { } /** - * Sends additional commands to a location provider. - * Can be used to support provider specific extensions to the Location Manager API + * Sends additional commands to a location provider. Can be used to support provider specific + * extensions to the Location Manager API. * * @param provider name of the location provider. - * @param command name of the command to send to the provider. - * @param extras optional arguments for the command (or null). - * The provider may optionally fill the extras Bundle with results from the command. - * - * @return true if the command succeeds. + * @param command name of the command to send to the provider. + * @param extras optional arguments for the command (or null). + * @return true always */ public boolean sendExtraCommand( @NonNull String provider, @NonNull String command, @Nullable Bundle extras) { + Preconditions.checkArgument(provider != null, "invalid null provider"); + Preconditions.checkArgument(command != null, "invalid null command"); + try { return mService.sendExtraCommand(provider, command, extras); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index a3f26ad64f397..3ebe70266c715 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -1098,12 +1098,9 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("mLock") public void sendExtraCommandLocked(String command, Bundle extras) { if (mProvider != null) { - long identity = Binder.clearCallingIdentity(); - try { - mProvider.sendExtraCommand(command, extras); - } finally { - Binder.restoreCallingIdentity(identity); - } + // intentionally do not clear binder identity so that providers can evaluate who + // is sending the extra command + mProvider.sendExtraCommand(command, extras); } } diff --git a/services/core/java/com/android/server/location/AbstractLocationProvider.java b/services/core/java/com/android/server/location/AbstractLocationProvider.java index 0edd17b1f777f..8107e9fe3e675 100644 --- a/services/core/java/com/android/server/location/AbstractLocationProvider.java +++ b/services/core/java/com/android/server/location/AbstractLocationProvider.java @@ -142,6 +142,9 @@ public abstract class AbstractLocationProvider { return 0; } - /** Sends a custom command to this provider. */ + /** + * Sends a custom command to this provider. Called with the original binder identity of the + * caller. + */ public abstract void sendExtraCommand(String command, Bundle extras); }