Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f3d52cf authored by Kholoud Mohamed's avatar Kholoud Mohamed
Browse files

Use killUid instead of killApplication to kill app

When the cross profile app op gets revoked, we need to
kill the app then send an app op changed broadcast to
the app. The problem with using killApplication is that
it is async and does not guarantee that the app is killed
before the broadcast is sent.

It also fixes an unrelated issue when
CrossProfileApps#clearInteractAcrossProfilesAppOps is called
from managed provisioning which is non system process, this
causes a security exception if killApplication is used.

Fixes: 156995567
Fixes: 157318765
Test: atest ManagedProfileCrossProfileTest
Test: atest ManagedProfileProvisioningTest
Change-Id: Iceedd57baeb64daccef072bc787b1e1cb1bfe814
parent fa6cf176
Loading
Loading
Loading
Loading
+11 −12
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
import com.android.internal.util.FunctionalUtils.ThrowingSupplier;
import com.android.server.LocalServices;
import com.android.server.pm.permission.PermissionManagerService;
import com.android.server.wm.ActivityTaskManagerInternal;

import java.util.ArrayList;
@@ -475,9 +476,11 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub {
            mInjector.getAppOpsManager()
                    .setMode(OP_INTERACT_ACROSS_PROFILES, uid, packageName, newMode);
        }
        // Kill the UID before sending the broadcast to ensure that apps can be informed when
        // their app-op has been revoked.
        maybeKillUid(packageName, uid, hadPermission);
        sendCanInteractAcrossProfilesChangedBroadcast(packageName, uid, UserHandle.of(userId));
        maybeLogSetInteractAcrossProfilesAppOp(packageName, newMode, userId, logMetrics, uid);
        maybeKillUid(packageName, uid, hadPermission);
    }

    /**
@@ -492,7 +495,7 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub {
        if (hasInteractAcrossProfilesPermission(packageName, uid, PermissionChecker.PID_UNKNOWN)) {
            return;
        }
        mInjector.killUid(packageName, uid);
        mInjector.killUid(uid);
    }

    private void maybeLogSetInteractAcrossProfilesAppOp(
@@ -797,15 +800,11 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub {
        }

        @Override
        public void killUid(String packageName, int uid) {
            try {
                ActivityManager.getService().killApplication(
                        packageName,
        public void killUid(int uid) {
            PermissionManagerService.killUid(
                    UserHandle.getAppId(uid),
                    UserHandle.getUserId(uid),
                    PermissionManager.KILL_APP_REASON_PERMISSIONS_REVOKED);
            } catch (RemoteException ignored) {
            }
        }
    }

@@ -847,7 +846,7 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub {

        int checkComponentPermission(String permission, int uid, int owningUid, boolean exported);

        void killUid(String packageName, int uid);
        void killUid(int uid);
    }

    class LocalService extends CrossProfileAppsInternal {
+1 −1
Original line number Diff line number Diff line
@@ -709,7 +709,7 @@ public class CrossProfileAppsServiceImplRoboTest {
        }

        @Override
        public void killUid(String packageName, int uid) {
        public void killUid(int uid) {
            mKilledUids.add(uid);
        }
    }
+6 −10
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import android.content.pm.PermissionInfo;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.permission.PermissionManager;
@@ -42,6 +41,7 @@ import android.util.SparseArray;
import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
import com.android.internal.util.FunctionalUtils.ThrowingSupplier;
import com.android.server.LocalServices;
import com.android.server.pm.permission.PermissionManagerService;
import com.android.server.wm.ActivityTaskManagerInternal;

import org.junit.Before;
@@ -696,15 +696,11 @@ public class CrossProfileAppsServiceImplTest {
        }

        @Override
        public void killUid(String packageName, int uid) {
            try {
                ActivityManager.getService().killApplication(
                        packageName,
        public void killUid(int uid) {
            PermissionManagerService.killUid(
                    UserHandle.getAppId(uid),
                    UserHandle.getUserId(uid),
                    PermissionManager.KILL_APP_REASON_PERMISSIONS_REVOKED);
            } catch (RemoteException ignored) {
            }
        }
    }
}