summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java3
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java5
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerServiceUtils.java9
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) {