diff options
author | Calin Juravle <calin@google.com> | 2017-09-13 18:09:57 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-09-13 18:09:57 +0000 |
commit | 495157b05cab033c54cf1cb2388a04fdb33d553a (patch) | |
tree | c83f12d6e772906d77dae020ee7dfc30aae592cc | |
parent | fcc70bdc9e380ef1a652b229910c6e333cf575c5 (diff) | |
parent | 9cd45602a89b2af5d4b8086cbb806b64ff6b78a4 (diff) | |
download | native-495157b05cab033c54cf1cb2388a04fdb33d553a.tar.gz |
Merge "Adjust the validation code for secondary dex paths" into oc-mr1-dev
-rw-r--r-- | cmds/installd/dexopt.cpp | 8 | ||||
-rw-r--r-- | cmds/installd/utils.cpp | 23 | ||||
-rw-r--r-- | cmds/installd/utils.h | 2 |
3 files changed, 21 insertions, 12 deletions
diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp index 3c4a933ad6..f29da17457 100644 --- a/cmds/installd/dexopt.cpp +++ b/cmds/installd/dexopt.cpp @@ -1796,8 +1796,14 @@ bool reconcile_secondary_dex_file(const std::string& dex_path, } const char* volume_uuid_cstr = volume_uuid == nullptr ? nullptr : volume_uuid->c_str(); + + // Note that we cannot validate the package path here because the file might not exist + // and we cannot call realpath to resolve system symlinks. Since /data/user/0 symlinks to + // /data/data/ a lot of validations will fail if we attempt to check the package path. + // It is still ok to be more relaxed because any file removal is done after forking and + // dropping capabilities. if (!validate_secondary_dex_path(pkgname.c_str(), dex_path.c_str(), volume_uuid_cstr, - uid, storage_flag)) { + uid, storage_flag, /*validate_package_path*/ false)) { LOG(ERROR) << "Could not validate secondary dex path " << dex_path; return false; } 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. diff --git a/cmds/installd/utils.h b/cmds/installd/utils.h index da3a2933ec..e938042a3b 100644 --- a/cmds/installd/utils.h +++ b/cmds/installd/utils.h @@ -125,7 +125,7 @@ std::string read_path_inode(const std::string& parent, const char* name, const c 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 = true); int get_path_from_env(dir_rec_t* rec, const char* var); |