diff options
3 files changed, 31 insertions, 18 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index e50c307df854..56f03d79b957 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -478,7 +478,7 @@ public class ApplicationPackageManager extends PackageManager { public @NonNull List<SharedLibraryInfo> getSharedLibrariesAsUser(int flags, int userId) { try { ParceledListSlice<SharedLibraryInfo> sharedLibs = mPM.getSharedLibraries( - flags, userId); + mContext.getOpPackageName(), flags, userId); if (sharedLibs == null) { return Collections.emptyList(); } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 9096e44cd175..cbe709afa9ca 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -617,7 +617,7 @@ interface IPackageManager { int getInstallReason(String packageName, int userId); - ParceledListSlice getSharedLibraries(int flags, int userId); + ParceledListSlice getSharedLibraries(in String packageName, int flags, int userId); boolean canRequestPackageInstalls(String packageName, int userId); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 0173533d9594..a9a58739c2e2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3594,8 +3594,7 @@ public class PackageManagerService extends IPackageManager.Stub public PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage, int flags, int userId) { return getPackageInfoInternal(versionedPackage.getPackageName(), - // TODO: We will change version code to long, so in the new API it is long - (int) versionedPackage.getVersionCode(), flags, userId); + versionedPackage.getVersionCode(), flags, userId); } private PackageInfo getPackageInfoInternal(String packageName, int versionCode, @@ -4315,7 +4314,8 @@ public class PackageManagerService extends IPackageManager.Stub } @Override - public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(int flags, int userId) { + public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(String packageName, + int flags, int userId) { if (!sUserManager.exists(userId)) return null; Preconditions.checkArgumentNonnegative(userId, "userId must be >= 0"); @@ -4326,8 +4326,9 @@ public class PackageManagerService extends IPackageManager.Stub == PERMISSION_GRANTED || mContext.checkCallingOrSelfPermission(DELETE_PACKAGES) == PERMISSION_GRANTED - || mContext.checkCallingOrSelfPermission(REQUEST_INSTALL_PACKAGES) - == PERMISSION_GRANTED + || canRequestPackageInstallsInternal(packageName, + PackageManager.MATCH_STATIC_SHARED_LIBRARIES, userId, + false /* throwIfPermNotDeclared*/) || mContext.checkCallingOrSelfPermission(REQUEST_DELETE_PACKAGES) == PERMISSION_GRANTED; @@ -4351,7 +4352,8 @@ public class PackageManagerService extends IPackageManager.Stub try { // TODO: We will change version code to long, so in the new API it is long PackageInfo packageInfo = getPackageInfoVersioned( - libInfo.getDeclaringPackage(), flags, userId); + libInfo.getDeclaringPackage(), flags + | PackageManager.MATCH_STATIC_SHARED_LIBRARIES, userId); if (packageInfo == null) { continue; } @@ -9249,6 +9251,9 @@ public class PackageManagerService extends IPackageManager.Stub } if (p != null) { usesLibraryFiles.addAll(p.getAllCodePaths()); + if (p.usesLibraryFiles != null) { + Collections.addAll(usesLibraryFiles, p.usesLibraryFiles); + } } } @@ -17670,14 +17675,12 @@ public class PackageManagerService extends IPackageManager.Stub Integer.MAX_VALUE, "versionCode must be >= -1"); final String packageName = versionedPackage.getPackageName(); - // TODO: We will change version code to long, so in the new API it is long - final int versionCode = (int) versionedPackage.getVersionCode(); + final int versionCode = versionedPackage.getVersionCode(); final String internalPackageName; synchronized (mPackages) { // Normalize package name to handle renamed packages and static libs internalPackageName = resolveInternalPackageNameLPr(versionedPackage.getPackageName(), - // TODO: We will change version code to long, so in the new API it is long - (int) versionedPackage.getVersionCode()); + versionedPackage.getVersionCode()); } final int uid = Binder.getCallingUid(); @@ -17819,8 +17822,7 @@ public class PackageManagerService extends IPackageManager.Stub libEntry.info.getVersion()) < 0) { continue; } - // TODO: We will change version code to long, so in the new API it is long - final int libVersionCode = (int) libEntry.info.getDeclaringPackage().getVersionCode(); + final int libVersionCode = libEntry.info.getDeclaringPackage().getVersionCode(); if (versionCode != PackageManager.VERSION_CODE_HIGHEST) { if (libVersionCode == versionCode) { return libEntry.apk; @@ -23876,6 +23878,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public boolean canRequestPackageInstalls(String packageName, int userId) { + return canRequestPackageInstallsInternal(packageName, 0, userId, + true /* throwIfPermNotDeclared*/); + } + + private boolean canRequestPackageInstallsInternal(String packageName, int flags, int userId, + boolean throwIfPermNotDeclared) { int callingUid = Binder.getCallingUid(); int uid = getPackageUid(packageName, 0, userId); if (callingUid != uid && callingUid != Process.ROOT_UID @@ -23883,18 +23891,23 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); throw new SecurityException( "Caller uid " + callingUid + " does not own package " + packageName); } - ApplicationInfo info = getApplicationInfo(packageName, 0, userId); + ApplicationInfo info = getApplicationInfo(packageName, flags, userId); if (info == null) { return false; } if (info.targetSdkVersion < Build.VERSION_CODES.O) { - throw new UnsupportedOperationException( - "Operation only supported on apps targeting Android O or higher"); + return false; } String appOpPermission = Manifest.permission.REQUEST_INSTALL_PACKAGES; String[] packagesDeclaringPermission = getAppOpPermissionPackages(appOpPermission); if (!ArrayUtils.contains(packagesDeclaringPermission, packageName)) { - throw new SecurityException("Need to declare " + appOpPermission + " to call this api"); + if (throwIfPermNotDeclared) { + throw new SecurityException("Need to declare " + appOpPermission + + " to call this api"); + } else { + Slog.e(TAG, "Need to declare " + appOpPermission + " to call this api"); + return false; + } } if (sUserManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, userId)) { return false; |