Merge "DO NOT MERGE: ActivityManager#killBackgroundProcesses can kill caller's own app only" into tm-qpr-dev

This commit is contained in:
Jing Ji
2023-03-03 00:40:21 +00:00
committed by Android (Google) Code Review
3 changed files with 38 additions and 3 deletions

View File

@@ -3933,6 +3933,9 @@ public class ActivityManager {
* processes to reclaim memory; the system will take care of restarting
* these processes in the future as needed.
*
* <p class="note">Third party applications can only use this API to kill their own processes.
* </p>
*
* @param packageName The name of the package whose processes are to
* be killed.
*/

View File

@@ -3154,7 +3154,11 @@
android:protectionLevel="normal" />
<!-- Allows an application to call
{@link android.app.ActivityManager#killBackgroundProcesses}.
{@link android.app.ActivityManager#killBackgroundProcesses}.
<p class="note">Third party applications can only use this API to kill their own
processes.</p>
<p>Protection level: normal
-->
<permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"

View File

@@ -3831,8 +3831,20 @@ public class ActivityManagerService extends IActivityManager.Stub
Slog.w(TAG, msg);
throw new SecurityException(msg);
}
final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid();
final int callingAppId = UserHandle.getAppId(callingUid);
userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
ProcessRecord proc;
synchronized (mPidsSelfLocked) {
proc = mPidsSelfLocked.get(callingPid);
}
final boolean hasKillAllPermission = PERMISSION_GRANTED == checkPermission(
android.Manifest.permission.FORCE_STOP_PACKAGES, callingPid, callingUid)
|| UserHandle.isCore(callingUid)
|| (proc != null && proc.info.isSystemApp());
userId = mUserController.handleIncomingUser(callingPid, callingUid,
userId, true, ALLOW_FULL_ONLY, "killBackgroundProcesses", null);
final int[] userIds = mUserController.expandUserId(userId);
@@ -3847,7 +3859,7 @@ public class ActivityManagerService extends IActivityManager.Stub
targetUserId));
} catch (RemoteException e) {
}
if (appId == -1) {
if (appId == -1 || (!hasKillAllPermission && appId != callingAppId)) {
Slog.w(TAG, "Invalid packageName: " + packageName);
return;
}
@@ -3875,6 +3887,22 @@ public class ActivityManagerService extends IActivityManager.Stub
throw new SecurityException(msg);
}
final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid();
ProcessRecord proc;
synchronized (mPidsSelfLocked) {
proc = mPidsSelfLocked.get(callingPid);
}
if (callingUid >= FIRST_APPLICATION_UID
&& (proc == null || !proc.info.isSystemApp())) {
final String msg = "Permission Denial: killAllBackgroundProcesses() from pid="
+ callingPid + ", uid=" + callingUid + " is not allowed";
Slog.w(TAG, msg);
// Silently return to avoid existing apps from crashing.
return;
}
final long callingId = Binder.clearCallingIdentity();
try {
synchronized (this) {