diff options
3 files changed, 15 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 69e92e075b51..f358ce796fcf 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -677,7 +677,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements ? params.installerPackageName : installerPackageName; if (PackageManagerServiceUtils.isRootOrShell(callingUid) - || PackageInstallerSession.isSystemDataLoaderInstallation(params)) { + || PackageInstallerSession.isSystemDataLoaderInstallation(params) + || PackageManagerServiceUtils.isAdoptedShell(callingUid, mContext)) { params.installFlags |= PackageManager.INSTALL_FROM_ADB; // adb installs can override the installingPackageName, but not the // initiatingPackageName diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index ea6383e14969..9bfea1f626ed 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -1442,7 +1442,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { @NonNull IOnChecksumsReadyListener onChecksumsReadyListener) { assertCallerIsOwnerRootOrVerifier(); final File file = new File(stageDir, name); - final String installerPackageName = getInstallSource().mInitiatingPackageName; + final String installerPackageName = PackageManagerServiceUtils.isInstalledByAdb( + getInstallSource().mInitiatingPackageName) + ? getInstallSource().mInstallerPackageName + : getInstallSource().mInitiatingPackageName; try { mPm.requestFileChecksums(file, installerPackageName, optional, required, trustedInstallers, onChecksumsReadyListener); diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 42538f33c5f8..db997d8d1d79 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -36,6 +36,7 @@ import static com.android.server.pm.PackageManagerService.SHELL_PACKAGE_NAME; import static com.android.server.pm.PackageManagerService.STUB_SUFFIX; import static com.android.server.pm.PackageManagerService.TAG; +import android.Manifest; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -1389,6 +1390,14 @@ public class PackageManagerServiceUtils { } /** + * Check if a UID is non-system UID adopted shell permission. + */ + public static boolean isAdoptedShell(int uid, Context context) { + return uid != Process.SYSTEM_UID && context.checkCallingOrSelfPermission( + Manifest.permission.USE_SYSTEM_DATA_LOADERS) == PackageManager.PERMISSION_GRANTED; + } + + /** * Check if a UID is system UID or shell's UID. */ public static boolean isRootOrShell(int uid) { |