summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java6
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerServiceUtils.java28
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);
}
/**