From 32e9cd9b546912d75bdf2e83b3298131c65fc70f Mon Sep 17 00:00:00 2001 From: William Loh Date: Wed, 10 May 2023 11:07:02 -0700 Subject: [PATCH] Fix appMetadataFilePath when restoring system app When restoring a disabled system app the appMetadataFilePath field was not being copied over from the disabled PackageSetting to the new PackageSetting. This is now copied over in enableSystemPackageLPw. The appMetadataFilePath was also being set in commitPackageSettings which is shared code path for both installs and restores. This was causing the appMetadataFilePath to be set to null when restoring. Moved the relevant code instead to commitPackagesLocked so that it only sets for installs and not restores. Also added GET_APP_METADATA permission check to guard the get-app-metadata adb command. Bug: 281589646 Test: Manual Test: atest android.packageinstaller.install.cts.InstallAppMetadataTest Change-Id: I69b90d61b1f53f8eaefc2adf719eca99f77e81ea --- .../android/server/pm/InstallPackageHelper.java | 14 +++++++------- .../server/pm/PackageManagerShellCommand.java | 2 ++ .../core/java/com/android/server/pm/Settings.java | 3 +++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index f3d5f6e84113e..430d03a08380b 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -499,13 +499,6 @@ final class InstallPackageHelper { mPm.setUpCustomResolverActivity(pkg, pkgSetting); } - File appMetadataFile = new File(pkgSetting.getPath(), APP_METADATA_FILE_NAME); - if (appMetadataFile.exists()) { - pkgSetting.setAppMetadataFilePath(appMetadataFile.getAbsolutePath()); - } else { - pkgSetting.setAppMetadataFilePath(null); - } - if (pkg.getPackageName().equals("android")) { mPm.setPlatformPackage(pkg, pkgSetting); } @@ -2170,6 +2163,13 @@ final class InstallPackageHelper { installRequest.setNewUsers( ps.queryInstalledUsers(mPm.mUserManager.getUserIds(), true)); ps.setUpdateAvailable(false /*updateAvailable*/); + + File appMetadataFile = new File(ps.getPath(), APP_METADATA_FILE_NAME); + if (appMetadataFile.exists()) { + ps.setAppMetadataFilePath(appMetadataFile.getAbsolutePath()); + } else { + ps.setAppMetadataFilePath(null); + } } if (installRequest.getReturnCode() == PackageManager.INSTALL_SUCCEEDED) { mPm.updateSequenceNumberLP(ps, installRequest.getNewUsers()); diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 58183f0bc16af..d3f3a69f507d3 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -16,6 +16,7 @@ package com.android.server.pm; +import static android.Manifest.permission.GET_APP_METADATA; import static android.content.pm.PackageInstaller.LOCATION_DATA_APP; import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED; import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKED_COMPAT; @@ -3576,6 +3577,7 @@ class PackageManagerShellCommand extends ShellCommand { } private int runGetAppMetadata() { + mContext.enforceCallingOrSelfPermission(GET_APP_METADATA, "getAppMetadataFd"); final PrintWriter pw = getOutPrintWriter(); String pkgName = getNextArgRequired(); ParcelFileDescriptor pfd = null; diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index e0dbcbf27264c..f2d1357ac1b5e 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -921,6 +921,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile p.getUsesStaticLibraries(), p.getUsesStaticLibrariesVersions(), p.getMimeGroups(), mDomainVerificationManager.generateNewId()); if (ret != null) { + ret.setAppMetadataFilePath(p.getAppMetadataFilePath()); ret.getPkgState().setUpdatedSystemApp(false); } mDisabledSysPackages.remove(name); @@ -3700,6 +3701,8 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile ps.setSharedUserAppId(sharedUserAppId); } + ps.setAppMetadataFilePath(parser.getAttributeValue(null, "appMetadataFilePath")); + int outerDepth = parser.getDepth(); int type; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT