Loading services/core/java/com/android/server/pm/InstallPackageHelper.java +4 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +22 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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); } /** Loading Loading
services/core/java/com/android/server/pm/InstallPackageHelper.java +4 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading
services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +22 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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); } /** Loading