diff options
author | Bryan Ferris <bferris@google.com> | 2020-02-13 00:37:34 +0100 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-02-13 00:37:34 +0100 |
commit | 7bc9c8297b44991a81a9c54ae19c1162ef7e5ffd (patch) | |
tree | 056a7e38bdc99b99214183e2e58608612f6b2e72 /install/install.cpp | |
parent | Merge "rm libbinderthreadstate" am: 2015fe5dbc am: ecfa97375f (diff) | |
parent | Force package installation with FUSE unless the package stores on device (diff) | |
download | android_bootable_recovery-7bc9c8297b44991a81a9c54ae19c1162ef7e5ffd.tar android_bootable_recovery-7bc9c8297b44991a81a9c54ae19c1162ef7e5ffd.tar.gz android_bootable_recovery-7bc9c8297b44991a81a9c54ae19c1162ef7e5ffd.tar.bz2 android_bootable_recovery-7bc9c8297b44991a81a9c54ae19c1162ef7e5ffd.tar.lz android_bootable_recovery-7bc9c8297b44991a81a9c54ae19c1162ef7e5ffd.tar.xz android_bootable_recovery-7bc9c8297b44991a81a9c54ae19c1162ef7e5ffd.tar.zst android_bootable_recovery-7bc9c8297b44991a81a9c54ae19c1162ef7e5ffd.zip |
Diffstat (limited to 'install/install.cpp')
-rw-r--r-- | install/install.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/install/install.cpp b/install/install.cpp index 4bb0903cc..1c9bf2fd2 100644 --- a/install/install.cpp +++ b/install/install.cpp @@ -30,6 +30,7 @@ #include <atomic> #include <chrono> #include <condition_variable> +#include <filesystem> #include <functional> #include <limits> #include <mutex> @@ -641,3 +642,49 @@ bool verify_package(Package* package, RecoveryUI* ui) { } return true; } + +bool SetupPackageMount(const std::string& package_path, bool* should_use_fuse) { + CHECK(should_use_fuse != nullptr); + + if (package_path.empty()) { + return false; + } + + *should_use_fuse = true; + if (package_path[0] == '@') { + auto block_map_path = package_path.substr(1); + if (ensure_path_mounted(block_map_path) != 0) { + LOG(ERROR) << "Failed to mount " << block_map_path; + return false; + } + // uncrypt only produces block map only if the package stays on /data. + *should_use_fuse = false; + return true; + } + + // Package is not a block map file. + if (ensure_path_mounted(package_path) != 0) { + LOG(ERROR) << "Failed to mount " << package_path; + return false; + } + + // Reject the package if the input path doesn't equal the canonicalized path. + // e.g. /cache/../sdcard/update_package. + std::error_code ec; + auto canonical_path = std::filesystem::canonical(package_path, ec); + if (ec) { + LOG(ERROR) << "Failed to get canonical of " << package_path << ", " << ec.message(); + return false; + } + if (canonical_path.string() != package_path) { + LOG(ERROR) << "Installation aborts. The canonical path " << canonical_path.string() + << " doesn't equal the original path " << package_path; + return false; + } + + constexpr const char* CACHE_ROOT = "/cache"; + if (android::base::StartsWith(package_path, CACHE_ROOT)) { + *should_use_fuse = false; + } + return true; +} |