diff options
4 files changed, 51 insertions, 27 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index aa5f39f78cbd..002d500e4df5 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -640,7 +640,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements && params.installerPackageName.length() < SessionParams.MAX_PACKAGE_NAME_LENGTH) ? params.installerPackageName : installerPackageName; - if ((callingUid == Process.SHELL_UID) || (callingUid == Process.ROOT_UID)) { + if ((callingUid == Process.SHELL_UID) || (callingUid == Process.ROOT_UID) + || PackageInstallerSession.isSystemDataLoaderInstallation(params)) { params.installFlags |= PackageManager.INSTALL_FROM_ADB; // adb installs can override the installingPackageName, but not the // initiatingPackageName @@ -666,8 +667,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements && !mPm.isCallerVerifier(snapshot, callingUid)) { params.installFlags &= ~PackageManager.INSTALL_VIRTUAL_PRELOAD; } - if (mContext.checkCallingOrSelfPermission( - Manifest.permission.INSTALL_TEST_ONLY_PACKAGE) + if (mContext.checkCallingOrSelfPermission(Manifest.permission.INSTALL_TEST_ONLY_PACKAGE) != PackageManager.PERMISSION_GRANTED) { params.installFlags &= ~PackageManager.INSTALL_ALLOW_TEST; } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index beb198643e78..5ba4cc115c21 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -29,7 +29,6 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK; import static android.content.pm.PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE; import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SPLIT; -import static android.content.pm.PackageManager.INSTALL_FROM_ADB; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; import static android.content.pm.PackageManager.INSTALL_STAGED; import static android.content.pm.PackageManager.INSTALL_SUCCEEDED; @@ -705,6 +704,18 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } }; + static boolean isDataLoaderInstallation(SessionParams params) { + return params.dataLoaderParams != null; + } + + static boolean isSystemDataLoaderInstallation(SessionParams params) { + if (!isDataLoaderInstallation(params)) { + return false; + } + return SYSTEM_DATA_LOADER_PACKAGE.equals( + params.dataLoaderParams.getComponentName().getPackageName()); + } + private final Handler.Callback mHandlerCallback = new Handler.Callback() { @Override public boolean handleMessage(Message msg) { @@ -744,7 +755,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { }; private boolean isDataLoaderInstallation() { - return params.dataLoaderParams != null; + return isDataLoaderInstallation(this.params); } private boolean isStreamingInstallation() { @@ -756,11 +767,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } private boolean isSystemDataLoaderInstallation() { - if (!isDataLoaderInstallation()) { - return false; - } - return SYSTEM_DATA_LOADER_PACKAGE.equals( - this.params.dataLoaderParams.getComponentName().getPackageName()); + return isSystemDataLoaderInstallation(this.params); } /** @@ -957,17 +964,12 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { "DataLoader installation of APEX modules is not allowed."); } - if (isSystemDataLoaderInstallation()) { - if (mContext.checkCallingOrSelfPermission( - Manifest.permission.USE_SYSTEM_DATA_LOADERS) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("You need the " - + "com.android.permission.USE_SYSTEM_DATA_LOADERS permission " - + "to use system data loaders"); - } - - // All installations using system dataloaders marked as ADB. - this.params.installFlags |= INSTALL_FROM_ADB; + if (isSystemDataLoaderInstallation() && mContext.checkCallingOrSelfPermission( + Manifest.permission.USE_SYSTEM_DATA_LOADERS) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("You need the " + + "com.android.permission.USE_SYSTEM_DATA_LOADERS permission " + + "to use system data loaders"); } } @@ -1264,13 +1266,21 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return; } - final String initiatingPackageName = getInstallSource().initiatingPackageName; + final String installerPackageName; + if (!TextUtils.isEmpty(getInstallSource().initiatingPackageName)) { + installerPackageName = getInstallSource().initiatingPackageName; + } else { + installerPackageName = getInstallSource().installerPackageName; + } + if (TextUtils.isEmpty(installerPackageName)) { + throw new IllegalStateException("Installer package is empty."); + } final AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class); - appOps.checkPackage(Binder.getCallingUid(), initiatingPackageName); + appOps.checkPackage(Binder.getCallingUid(), installerPackageName); final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); - final AndroidPackage callingInstaller = pmi.getPackage(initiatingPackageName); + final AndroidPackage callingInstaller = pmi.getPackage(installerPackageName); if (callingInstaller == null) { throw new IllegalStateException("Can't obtain calling installer's package."); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b1b05bedfcad..c7a101e2af4d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1254,9 +1254,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (applicationInfo == null) { throw new ParcelableException(new PackageManager.NameNotFoundException(packageName)); } + final InstallSourceInfo installSourceInfo = snapshot.getInstallSourceInfo(packageName); - final String installerPackageName = - installSourceInfo != null ? installSourceInfo.getInitiatingPackageName() : null; + final String installerPackageName; + if (installSourceInfo != null) { + if (!TextUtils.isEmpty(installSourceInfo.getInitiatingPackageName())) { + installerPackageName = installSourceInfo.getInitiatingPackageName(); + } else { + installerPackageName = installSourceInfo.getInstallingPackageName(); + } + } else { + installerPackageName = null; + } List<Pair<String, File>> filesToChecksum = new ArrayList<>(); diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 0e96567dbfad..a49577b21957 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -111,6 +111,11 @@ static bool getAlwaysEnableReadTimeoutsForSystemDataLoaders() { true); } +static bool getEnableReadTimeoutsAfterInstall() { + return android::base::GetBoolProperty("debug.incremental.enable_read_timeouts_after_install", + true); +} + static bool getEnforceReadLogsMaxIntervalForSystemDataLoaders() { return android::base::GetBoolProperty("debug.incremental.enforce_readlogs_max_interval_for_" "system_dataloaders", @@ -853,7 +858,7 @@ void IncrementalService::onInstallationComplete(StorageId storage) { // Always enable long read timeouts after installation is complete. std::unique_lock l(ifs->lock); - ifs->setReadTimeoutsRequested(true); + ifs->setReadTimeoutsRequested(getEnableReadTimeoutsAfterInstall()); applyStorageParamsLocked(*ifs); } |