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

Commit d7337e51 authored by Todd Kennedy's avatar Todd Kennedy Committed by android-build-merger
Browse files

Don't call into pkg mgr svc w/ lock held am: f29d07a6 am: 76a12e17

am: 45b7d510

Change-Id: Ie7dd466f9fc0d6f5e96b47abf74bf0df62e35ffe
parents 1644a754 45b7d510
Loading
Loading
Loading
Loading
+28 −21
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
    final int installerUid;
    final SessionParams params;
    final long createdMillis;
    final int defaultContainerGid;

    /** Staging location where client data is written. */
    final File stageDir;
@@ -199,13 +200,19 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
    private final Handler.Callback mHandlerCallback = new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            // Cache package manager data without the lock held
            final PackageInfo pkgInfo = mPm.getPackageInfo(
                    params.appPackageName, PackageManager.GET_SIGNATURES /*flags*/, userId);
            final ApplicationInfo appInfo = mPm.getApplicationInfo(
                    params.appPackageName, 0, userId);

            synchronized (mLock) {
                if (msg.obj != null) {
                    mRemoteObserver = (IPackageInstallObserver2) msg.obj;
                }

                try {
                    commitLocked();
                    commitLocked(pkgInfo, appInfo);
                } catch (PackageManagerException e) {
                    final String completeMsg = ExceptionUtils.getCompleteMessage(e);
                    Slog.e(TAG, "Commit of session " + sessionId + " failed: " + completeMsg);
@@ -264,6 +271,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        } else {
            mPermissionsAccepted = false;
        }
        final int uid = mPm.getPackageUid(PackageManagerService.DEFAULT_CONTAINER_PACKAGE,
                PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM);
        defaultContainerGid = UserHandle.getSharedAppGid(uid);
    }

    public SessionInfo generateInfo() {
@@ -520,7 +530,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        mHandler.obtainMessage(MSG_COMMIT, adapter.getBinder()).sendToTarget();
    }

    private void commitLocked() throws PackageManagerException {
    private void commitLocked(PackageInfo pkgInfo, ApplicationInfo appInfo)
            throws PackageManagerException {
        if (mDestroyed) {
            throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR, "Session destroyed");
        }
@@ -538,7 +549,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        // Verify that stage looks sane with respect to existing application.
        // This currently only ensures packageName, versionCode, and certificate
        // consistency.
        validateInstallLocked();
        validateInstallLocked(pkgInfo, appInfo);

        Preconditions.checkNotNull(mPackageName);
        Preconditions.checkNotNull(mSignatures);
@@ -650,7 +661,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
     * Note that upgrade compatibility is still performed by
     * {@link PackageManagerService}.
     */
    private void validateInstallLocked() throws PackageManagerException {
    private void validateInstallLocked(PackageInfo pkgInfo, ApplicationInfo appInfo)
            throws PackageManagerException {
        mPackageName = null;
        mVersionCode = -1;
        mSignatures = null;
@@ -729,10 +741,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

        if (removeSplitList.size() > 0) {
            // validate split names marked for removal
            final int flags = mSignatures == null ? PackageManager.GET_SIGNATURES : 0;
            final PackageInfo pkg = mPm.getPackageInfo(params.appPackageName, flags, userId);
            for (String splitName : removeSplitList) {
                if (!ArrayUtils.contains(pkg.splitNames, splitName)) {
                if (!ArrayUtils.contains(pkgInfo.splitNames, splitName)) {
                    throw new PackageManagerException(INSTALL_FAILED_INVALID_APK,
                            "Split not found: " + splitName);
                }
@@ -740,11 +750,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

            // ensure we've got appropriate package name, version code and signatures
            if (mPackageName == null) {
                mPackageName = pkg.packageName;
                mVersionCode = pkg.versionCode;
                mPackageName = pkgInfo.packageName;
                mVersionCode = pkgInfo.versionCode;
            }
            if (mSignatures == null) {
                mSignatures = pkg.signatures;
                mSignatures = pkgInfo.signatures;
            }
        }

@@ -757,8 +767,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

        } else {
            // Partial installs must be consistent with existing install
            final ApplicationInfo app = mPm.getApplicationInfo(mPackageName, 0, userId);
            if (app == null) {
            if (appInfo == null) {
                throw new PackageManagerException(INSTALL_FAILED_INVALID_APK,
                        "Missing existing base package for " + mPackageName);
            }
@@ -766,8 +775,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            final PackageLite existing;
            final ApkLite existingBase;
            try {
                existing = PackageParser.parsePackageLite(new File(app.getCodePath()), 0);
                existingBase = PackageParser.parseApkLite(new File(app.getBaseCodePath()),
                existing = PackageParser.parsePackageLite(new File(appInfo.getCodePath()), 0);
                existingBase = PackageParser.parseApkLite(new File(appInfo.getBaseCodePath()),
                        PackageParser.PARSE_COLLECT_CERTIFICATES);
            } catch (PackageParserException e) {
                throw PackageManagerException.from(e);
@@ -777,7 +786,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

            // Inherit base if not overridden
            if (mResolvedBaseFile == null) {
                mResolvedBaseFile = new File(app.getBaseCodePath());
                mResolvedBaseFile = new File(appInfo.getBaseCodePath());
                mResolvedInheritedFiles.add(mResolvedBaseFile);
            }

@@ -794,7 +803,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
            }

            // Inherit compiled oat directory.
            final File packageInstallDir = (new File(app.getBaseCodePath())).getParentFile();
            final File packageInstallDir = (new File(appInfo.getBaseCodePath())).getParentFile();
            mInheritedFilesBase = packageInstallDir;
            final File oatDir = new File(packageInstallDir, "oat");
            if (oatDir.exists()) {
@@ -822,7 +831,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
        }
    }

    private void assertApkConsistent(String tag, ApkLite apk) throws PackageManagerException {
    private void assertApkConsistent(String tag, ApkLite apk)
            throws PackageManagerException {
        if (!mPackageName.equals(apk.packageName)) {
            throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, tag + " package "
                    + apk.packageName + " inconsistent with " + mPackageName);
@@ -1035,10 +1045,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
                    "Failed to finalize container " + cid);
        }

        final int uid = mPm.getPackageUid(PackageManagerService.DEFAULT_CONTAINER_PACKAGE,
                PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM);
        final int gid = UserHandle.getSharedAppGid(uid);
        if (!PackageHelper.fixSdPermissions(cid, gid, null)) {
        if (!PackageHelper.fixSdPermissions(cid, defaultContainerGid, null)) {
            throw new PackageManagerException(INSTALL_FAILED_CONTAINER_ERROR,
                    "Failed to fix permissions on container " + cid);
        }