diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/InstallPackageHelper.java | 6 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerServiceUtils.java | 28 |
2 files changed, 26 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 40d3ef03395d..2951ef630eb3 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -1867,7 +1867,8 @@ final class InstallPackageHelper { final File targetDir = resolveTargetDir(request.getInstallFlags(), request.getCodeFile()); final File beforeCodeFile = request.getCodeFile(); - final File afterCodeFile = PackageManagerServiceUtils.getNextCodePath(targetDir); + final File afterCodeFile = PackageManagerServiceUtils.getNextCodePath(targetDir, + parsedPackage.getPackageName()); if (DEBUG_INSTALL) Slog.d(TAG, "Renaming " + beforeCodeFile + " to " + afterCodeFile); final boolean onIncremental = mPm.mIncrementalManager != null @@ -3098,7 +3099,8 @@ final class InstallPackageHelper { return null; } final File dstCodePath = - PackageManagerServiceUtils.getNextCodePath(Environment.getDataAppDirectory(null)); + PackageManagerServiceUtils.getNextCodePath(Environment.getDataAppDirectory(null), + packageName); int ret = PackageManagerServiceUtils.decompressFiles(codePath, dstCodePath, packageName); if (ret == PackageManager.INSTALL_SUCCEEDED) { ret = PackageManagerServiceUtils.extractNativeBinaries(dstCodePath, packageName); diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index f8e909e4c112..bcb7bdebf9bf 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -30,6 +30,7 @@ import static com.android.server.pm.PackageManagerService.COMPRESSED_EXTENSION; import static com.android.server.pm.PackageManagerService.DEBUG_COMPRESSION; import static com.android.server.pm.PackageManagerService.DEBUG_INTENT_MATCHING; import static com.android.server.pm.PackageManagerService.DEBUG_PREFERRED; +import static com.android.server.pm.PackageManagerService.RANDOM_CODEPATH_PREFIX; import static com.android.server.pm.PackageManagerService.RANDOM_DIR_PREFIX; import static com.android.server.pm.PackageManagerService.SHELL_PACKAGE_NAME; import static com.android.server.pm.PackageManagerService.STUB_SUFFIX; @@ -1298,15 +1299,16 @@ public class PackageManagerServiceUtils { } /** - * Given {@code targetDir}, returns {@code targetDir/~~[randomStrA]/[randomStrB].} + * Given {@code targetDir}, returns {@code targetDir/~~[randomStrA]/[packageName]-[randomStrB].} * Makes sure that {@code targetDir/~~[randomStrA]} directory doesn't exist. * Notice that this method doesn't actually create any directory. * * @param targetDir Directory that is two-levels up from the result directory. - * - * @return File object for the directory that should hold the code files. + * @param packageName Name of the package whose code files are to be installed under the result + * directory. + * @return File object for the directory that should hold the code files of {@code packageName}. */ - public static File getNextCodePath(File targetDir) { + public static File getNextCodePath(File targetDir, String packageName) { SecureRandom random = new SecureRandom(); byte[] bytes = new byte[16]; File firstLevelDir; @@ -1318,8 +1320,22 @@ public class PackageManagerServiceUtils { } while (firstLevelDir.exists()); random.nextBytes(bytes); - String dirName = Base64.encodeToString(bytes, Base64.URL_SAFE | Base64.NO_WRAP); - return new File(firstLevelDir, dirName); + String dirName = packageName + RANDOM_CODEPATH_PREFIX + Base64.encodeToString(bytes, + Base64.URL_SAFE | Base64.NO_WRAP); + final File result = new File(firstLevelDir, dirName); + if (DEBUG && !Objects.equals(tryParsePackageName(result.getName()), packageName)) { + throw new RuntimeException( + "codepath is off: " + result.getName() + " (" + packageName + ")"); + } + return result; + } + + static String tryParsePackageName(@NonNull String codePath) throws IllegalArgumentException { + int packageNameEnds = codePath.indexOf(RANDOM_CODEPATH_PREFIX); + if (packageNameEnds == -1) { + throw new IllegalArgumentException("Not a valid package folder name"); + } + return codePath.substring(0, packageNameEnds); } /** |