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

Commit b59292ee authored by Mohammad Samiul Islam's avatar Mohammad Samiul Islam
Browse files

Create VerificationParams directly

No need for dependency on ActiveInstallSession.

Bug: 159331446
Test: atest GtsSecurityHostTestCases
Test: atest CtsAtomicInstallTestCases
Change-Id: Icd4f43dd2683789e6c034c73fefc128e31dbddaa
parent 16e7b5cf
Loading
Loading
Loading
Loading
+13 −14
Original line number Diff line number Diff line
@@ -1747,21 +1747,21 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

    private void verifyNonStaged(List<PackageInstallerSession> childSessions)
            throws PackageManagerException {
        final PackageManagerService.ActiveInstallSession verifyingSession =
                makeSessionActiveForVerification();
        final PackageManagerService.VerificationParams verifyingSession =
                makeVerificationParams();
        if (verifyingSession == null) {
            return;
        }
        if (isMultiPackage()) {
            List<PackageManagerService.ActiveInstallSession> verifyingChildSessions =
            List<PackageManagerService.VerificationParams> verifyingChildSessions =
                    new ArrayList<>(childSessions.size());
            boolean success = true;
            PackageManagerException failure = null;
            for (int i = 0; i < childSessions.size(); ++i) {
                final PackageInstallerSession session = childSessions.get(i);
                try {
                    final PackageManagerService.ActiveInstallSession verifyingChildSession =
                            session.makeSessionActiveForVerification();
                    final PackageManagerService.VerificationParams verifyingChildSession =
                            session.makeVerificationParams();
                    if (verifyingChildSession != null) {
                        verifyingChildSessions.add(verifyingChildSession);
                    }
@@ -1829,10 +1829,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

    /**
     * Stages this session for verification and returns a
     * {@link PackageManagerService.ActiveInstallSession} representing this new staged state or null
     * {@link PackageManagerService.VerificationParams} representing this new staged state or null
     * in case permissions need to be requested before verification can proceed.
     */
    private PackageManagerService.ActiveInstallSession makeSessionActiveForVerification()
    @Nullable
    private PackageManagerService.VerificationParams makeVerificationParams()
            throws PackageManagerException {
        assertNotLocked("makeSessionActive");

@@ -1873,12 +1874,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        }

        synchronized (mLock) {
            return makeSessionActiveForVerificationLocked();
            return makeVerificationParamsLocked();
        }
    }

    @GuardedBy("mLock")
    private PackageManagerService.ActiveInstallSession makeSessionActiveForVerificationLocked()
    private PackageManagerService.VerificationParams makeVerificationParamsLocked()
            throws PackageManagerException {
        if (!params.isMultiPackage) {
            Objects.requireNonNull(mPackageName);
@@ -1974,11 +1975,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        }

        mRelinquished = true;
        // TODO(159331446): create VerificationParams directly by passing information that is
        //  required for verification only
        return new PackageManagerService.ActiveInstallSession(mPackageName, stageDir,
                localObserver, sessionId, params, mInstallerUid, mInstallSource, user,
                mSigningDetails);

        return mPm.new VerificationParams(user, stageDir, localObserver, params,
                mInstallSource, mInstallerUid, mSigningDetails, sessionId);
    }

    private void onVerificationComplete() {
+26 −34
Original line number Diff line number Diff line
@@ -12869,17 +12869,16 @@ public class PackageManagerService extends IPackageManager.Stub
        mHandler.sendMessage(msg);
    }
    void verifyStage(ActiveInstallSession activeInstallSession) {
        final VerificationParams params = new VerificationParams(activeInstallSession);
    void verifyStage(VerificationParams params) {
        mHandler.post(()-> {
            params.startCopy();
        });
    }
    void verifyStage(ActiveInstallSession parent, List<ActiveInstallSession> children)
    void verifyStage(VerificationParams parent, List<VerificationParams> children)
            throws PackageManagerException {
        final MultiPackageVerificationParams params =
                new MultiPackageVerificationParams(UserHandle.ALL, parent, children);
                new MultiPackageVerificationParams(parent, children);
        mHandler.post(()-> {
            params.startCopy();
        });
@@ -15052,27 +15051,25 @@ public class PackageManagerService extends IPackageManager.Stub
     */
    class MultiPackageVerificationParams extends HandlerParams {
        private final IPackageInstallObserver2 mObserver;
        private final ArrayList<VerificationParams> mChildParams;
        private final List<VerificationParams> mChildParams;
        private final Map<VerificationParams, Integer> mVerificationState;
        MultiPackageVerificationParams(
                @NonNull UserHandle user,
                @NonNull ActiveInstallSession parent,
                @NonNull List<ActiveInstallSession> activeInstallSessions)
                VerificationParams parent,
                List<VerificationParams> children)
                throws PackageManagerException {
            super(user);
            if (activeInstallSessions.size() == 0) {
            super(parent.getUser());
            if (children.size() == 0) {
                throw new PackageManagerException("No child sessions found!");
            }
            mChildParams = new ArrayList<>(activeInstallSessions.size());
            for (int i = 0; i < activeInstallSessions.size(); i++) {
                final VerificationParams childParams =
                        new VerificationParams(activeInstallSessions.get(i));
            mChildParams = children;
            // Provide every child with reference to this object as parent
            for (int i = 0; i < children.size(); i++) {
                final VerificationParams childParams = children.get(i);
                childParams.mParentVerificationParams = this;
                this.mChildParams.add(childParams);
            }
            this.mVerificationState = new ArrayMap<>(mChildParams.size());
            mObserver = parent.getObserver();
            mObserver = parent.observer;
        }
        @Override
@@ -15130,31 +15127,26 @@ public class PackageManagerService extends IPackageManager.Stub
        private boolean mWaitForEnableRollbackToComplete;
        private int mRet;
        VerificationParams(ActiveInstallSession activeInstallSession) {
            super(activeInstallSession.getUser());
            final PackageInstaller.SessionParams sessionParams =
                    activeInstallSession.getSessionParams();
            if (DEBUG_INSTANT) {
                if ((sessionParams.installFlags
                        & PackageManager.INSTALL_INSTANT_APP) != 0) {
                    Slog.d(TAG, "Ephemeral install of " + activeInstallSession.getPackageName());
                }
            }
        VerificationParams(UserHandle user, File stagedDir, IPackageInstallObserver2 observer,
                PackageInstaller.SessionParams sessionParams, InstallSource installSource,
                int installerUid, SigningDetails signingDetails, int sessionId) {
            super(user);
            origin = OriginInfo.fromStagedFile(stagedDir);
            this.observer = observer;
            installFlags = sessionParams.installFlags;
            this.installSource = installSource;
            packageAbiOverride = sessionParams.abiOverride;
            verificationInfo = new VerificationInfo(
                    sessionParams.originatingUri,
                    sessionParams.referrerUri,
                    sessionParams.originatingUid,
                    activeInstallSession.getInstallerUid());
            origin = OriginInfo.fromStagedFile(activeInstallSession.getStagedDir());
            observer = activeInstallSession.getObserver();
            installFlags = sessionParams.installFlags;
            installSource = activeInstallSession.getInstallSource();
            packageAbiOverride = sessionParams.abiOverride;
            signingDetails = activeInstallSession.getSigningDetails();
                    installerUid
            );
            this.signingDetails = signingDetails;
            requiredInstalledVersionCode = sessionParams.requiredInstalledVersionCode;
            mDataLoaderType = (sessionParams.dataLoaderParams != null)
                    ? sessionParams.dataLoaderParams.getType() : DataLoaderType.NONE;
            mSessionId = activeInstallSession.getSessionId();
            mSessionId = sessionId;
        }
        @Override