From 9cd45602a89b2af5d4b8086cbb806b64ff6b78a4 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Mon, 11 Sep 2017 11:50:36 -0700 Subject: Adjust the validation code for secondary dex paths Do not validate the package path when reconciling secondary dex files. If the file does not exist we cannot resolve the system sym links (e.g. /data/user/0 -> /data/data) and the validation will fail leaving oat files behind. Bug: 64460009 Test: adb shell cmd package reconcile-secondary-dex-files com.google.android.googlequicksearchbox (after removing some files) adb shell cmd package compile -m speed --secondary-dex com.google.android.googlequicksearchbox adb shell /data/nativetest64/installd_utils_test/installd_utils_test Change-Id: I9734ad18a579d44088180326661d8cf8288e90be --- cmds/installd/utils.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'cmds/installd/utils.cpp') diff --git a/cmds/installd/utils.cpp b/cmds/installd/utils.cpp index d277bd3ad8..dd32ac6425 100644 --- a/cmds/installd/utils.cpp +++ b/cmds/installd/utils.cpp @@ -801,7 +801,7 @@ int validate_system_app_path(const char* path) { } bool validate_secondary_dex_path(const std::string& pkgname, const std::string& dex_path, - const char* volume_uuid, int uid, int storage_flag) { + const char* volume_uuid, int uid, int storage_flag, bool validate_package_path) { CHECK(storage_flag == FLAG_STORAGE_CE || storage_flag == FLAG_STORAGE_DE); // Empty paths are not allowed. @@ -815,15 +815,18 @@ bool validate_secondary_dex_path(const std::string& pkgname, const std::string& // The path should be at most PKG_PATH_MAX long. if (dex_path.size() > PKG_PATH_MAX) { return false; } - // The dex_path should be under the app data directory. - std::string app_private_dir = storage_flag == FLAG_STORAGE_CE - ? create_data_user_ce_package_path( - volume_uuid, multiuser_get_user_id(uid), pkgname.c_str()) - : create_data_user_de_package_path( - volume_uuid, multiuser_get_user_id(uid), pkgname.c_str()); - - if (strncmp(dex_path.c_str(), app_private_dir.c_str(), app_private_dir.size()) != 0) { - return false; + if (validate_package_path) { + // If we are asked to validate the package path check that + // the dex_path is under the app data directory. + std::string app_private_dir = storage_flag == FLAG_STORAGE_CE + ? create_data_user_ce_package_path( + volume_uuid, multiuser_get_user_id(uid), pkgname.c_str()) + : create_data_user_de_package_path( + volume_uuid, multiuser_get_user_id(uid), pkgname.c_str()); + + if (strncmp(dex_path.c_str(), app_private_dir.c_str(), app_private_dir.size()) != 0) { + return false; + } } // If we got here we have a valid path. -- cgit v1.2.3-59-g8ed1b