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

Commit 0b930eeb authored by Mårten Kongstad's avatar Mårten Kongstad Committed by Todd Kennedy
Browse files

Fix NPE in package manager when asserting overlays

When a newer version of a package exists on /data, the package manager
will skip scanning the outdated version on /system. This means the
PackageSetting.pkg corresponding to the outdated version will be null.

This will cause an NPE when asserting that an upgraded overlay is
non-static (<overlay isStatic="false">). Prevent the exception by
checking for null, and, if needed, explicitly scan the outdated version
of the overlay within the scope of the assertion.

Bug: 78871949
Test: manual (have a pre-installed overlay, adb install a newer version, reboot)
Change-Id: I74d12c913705309dbb34f837b6806bb0fef25086
parent 35424828
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -11102,8 +11102,23 @@ public class PackageManagerService extends IPackageManager.Stub
                                mSettings.getPackageLPr(pkg.packageName),
                                "previous package state not present");
                        // previousPkg.pkg may be null: the package will be not be scanned if the
                        // package manager knows there is a newer version on /data.
                        // TODO[b/79435695]: Find a better way to keep track of the "static"
                        // property for RROs instead of having to parse packages on /system
                        PackageParser.Package ppkg = previousPkg.pkg;
                        if (ppkg == null) {
                            try {
                                final PackageParser pp = new PackageParser();
                                ppkg = pp.parsePackage(previousPkg.codePath,
                                        parseFlags | PackageParser.PARSE_IS_SYSTEM_DIR);
                            } catch (PackageParserException e) {
                                Slog.w(TAG, "failed to parse " + previousPkg.codePath, e);
                            }
                        }
                        // Static overlays cannot be updated.
                        if (previousPkg.pkg.mOverlayIsStatic) {
                        if (ppkg != null && ppkg.mOverlayIsStatic) {
                            throw new PackageManagerException("Overlay " + pkg.packageName +
                                    " is static and cannot be upgraded.");
                        // Non-static overlays cannot be converted to static overlays.