summaryrefslogtreecommitdiffstats
path: root/install
diff options
context:
space:
mode:
authorTianjie Xu <xunchang@google.com>2019-08-06 21:32:05 +0200
committerTianjie Xu <xunchang@google.com>2019-10-16 20:35:17 +0200
commit58a27693b22da9b93c634d053a53deb4c4a71e4e (patch)
treecba636e772425eb8680c6b9356cc4a749425c232 /install
parentMerge "otautil: Factor out the utils that're private to recovery." am: c6fb9f9df5 am: dc717a5c2b am: 2772cfcb1a (diff)
downloadandroid_bootable_recovery-58a27693b22da9b93c634d053a53deb4c4a71e4e.tar
android_bootable_recovery-58a27693b22da9b93c634d053a53deb4c4a71e4e.tar.gz
android_bootable_recovery-58a27693b22da9b93c634d053a53deb4c4a71e4e.tar.bz2
android_bootable_recovery-58a27693b22da9b93c634d053a53deb4c4a71e4e.tar.lz
android_bootable_recovery-58a27693b22da9b93c634d053a53deb4c4a71e4e.tar.xz
android_bootable_recovery-58a27693b22da9b93c634d053a53deb4c4a71e4e.tar.zst
android_bootable_recovery-58a27693b22da9b93c634d053a53deb4c4a71e4e.zip
Diffstat (limited to 'install')
-rw-r--r--install/include/install/install.h4
-rw-r--r--install/install.cpp47
2 files changed, 51 insertions, 0 deletions
diff --git a/install/include/install/install.h b/install/include/install/install.h
index b4b3a9149..c3331c8bf 100644
--- a/install/include/install/install.h
+++ b/install/include/install/install.h
@@ -67,3 +67,7 @@ bool verify_package_compatibility(ZipArchiveHandle package_zip);
// pre-device and serial number (if presents). A/B OTA specific checks: pre-build version,
// fingerprint, timestamp.
bool CheckPackageMetadata(const std::map<std::string, std::string>& metadata, OtaType ota_type);
+
+// Ensures the path to the update package is mounted. Also set the |should_use_fuse| to true if the
+// package stays on a removable media.
+bool SetupPackageMount(const std::string& package_path, bool* should_use_fuse);
diff --git a/install/install.cpp b/install/install.cpp
index 9166f9cfb..43916b3d8 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>
@@ -722,3 +723,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;
+}