RESTRICT AUTOMERGE: Set mAllowWhileInUsePermissionInFgs correctly when bindService() from background.

Pass original callingPid and callingUid into
shouldAllowWhileInUsePermissionInFgsLocked() after
Binder.clearCallingIdentity().

Bug: 163084228, 173516292
Test: atest cts/tests/app/src/android/app/cts/ActivityManagerFgsBgStartTest.java#testFgsLocationStartFromBGWithBind
Change-Id: I7a240621267648ea54e7dc737ebc55bc665e39b6
Merged-In: I7a240621267648ea54e7dc737ebc55bc665e39b6
(cherry picked from commit 86bd39db35)
This commit is contained in:
Hui Yu
2020-08-06 16:55:19 -07:00
parent 0d8b71b182
commit 346eed7325

View File

@@ -1836,11 +1836,13 @@ public final class ActiveServices {
if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "bindService: " + service if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "bindService: " + service
+ " type=" + resolvedType + " conn=" + connection.asBinder() + " type=" + resolvedType + " conn=" + connection.asBinder()
+ " flags=0x" + Integer.toHexString(flags)); + " flags=0x" + Integer.toHexString(flags));
final int callingPid = Binder.getCallingPid();
final int callingUid = Binder.getCallingUid();
final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller); final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller);
if (callerApp == null) { if (callerApp == null) {
throw new SecurityException( throw new SecurityException(
"Unable to find app for caller " + caller "Unable to find app for caller " + caller
+ " (pid=" + Binder.getCallingPid() + " (pid=" + callingPid
+ ") when binding service " + service); + ") when binding service " + service);
} }
@@ -1880,19 +1882,19 @@ public final class ActiveServices {
} }
if ((flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0 && !isCallerSystem) { if ((flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0 && !isCallerSystem) {
throw new SecurityException("Non-system caller (pid=" + Binder.getCallingPid() throw new SecurityException("Non-system caller (pid=" + callingPid
+ ") set BIND_SCHEDULE_LIKE_TOP_APP when binding service " + service); + ") set BIND_SCHEDULE_LIKE_TOP_APP when binding service " + service);
} }
if ((flags & Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0 && !isCallerSystem) { if ((flags & Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0 && !isCallerSystem) {
throw new SecurityException( throw new SecurityException(
"Non-system caller " + caller + " (pid=" + Binder.getCallingPid() "Non-system caller " + caller + " (pid=" + callingPid
+ ") set BIND_ALLOW_WHITELIST_MANAGEMENT when binding service " + service); + ") set BIND_ALLOW_WHITELIST_MANAGEMENT when binding service " + service);
} }
if ((flags & Context.BIND_ALLOW_INSTANT) != 0 && !isCallerSystem) { if ((flags & Context.BIND_ALLOW_INSTANT) != 0 && !isCallerSystem) {
throw new SecurityException( throw new SecurityException(
"Non-system caller " + caller + " (pid=" + Binder.getCallingPid() "Non-system caller " + caller + " (pid=" + callingPid
+ ") set BIND_ALLOW_INSTANT when binding service " + service); + ") set BIND_ALLOW_INSTANT when binding service " + service);
} }
@@ -1908,7 +1910,7 @@ public final class ActiveServices {
ServiceLookupResult res = ServiceLookupResult res =
retrieveServiceLocked(service, instanceName, resolvedType, callingPackage, retrieveServiceLocked(service, instanceName, resolvedType, callingPackage,
Binder.getCallingPid(), Binder.getCallingUid(), userId, true, callingPid, callingUid, userId, true,
callerFg, isBindExternal, allowInstant); callerFg, isBindExternal, allowInstant);
if (res == null) { if (res == null) {
return 0; return 0;
@@ -2068,7 +2070,7 @@ public final class ActiveServices {
if (!s.mAllowWhileInUsePermissionInFgs) { if (!s.mAllowWhileInUsePermissionInFgs) {
s.mAllowWhileInUsePermissionInFgs = s.mAllowWhileInUsePermissionInFgs =
shouldAllowWhileInUsePermissionInFgsLocked(callingPackage, shouldAllowWhileInUsePermissionInFgsLocked(callingPackage,
Binder.getCallingPid(), Binder.getCallingUid(), callingPid, callingUid,
service, s, false); service, s, false);
} }