Loading Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ cc_defaults { ], static_libs: [ "libc++fs", "libinstall", "librecovery_fastboot", "libminui", Loading @@ -94,6 +95,7 @@ cc_library_static { ], shared_libs: [ "libfusesideload", "librecovery_ui", ], } Loading install/include/install/install.h +4 −0 Original line number Diff line number Diff line Loading @@ -63,3 +63,7 @@ bool ReadMetadataFromPackage(ZipArchiveHandle zip, std::map<std::string, std::st // 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); install/install.cpp +47 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <atomic> #include <chrono> #include <condition_variable> #include <filesystem> #include <functional> #include <limits> #include <mutex> Loading Loading @@ -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; } recovery.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -752,7 +752,11 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri ensure_path_mounted(update_package); } if (install_with_fuse) { bool should_use_fuse = false; if (!SetupPackageMount(update_package, &should_use_fuse)) { LOG(INFO) << "Failed to set up the package access, skipping installation"; status = INSTALL_ERROR; } else if (install_with_fuse || should_use_fuse) { LOG(INFO) << "Installing package " << update_package << " with fuse"; status = InstallWithFuseFromPath(update_package, ui); } else if (auto memory_package = Package::CreateMemoryPackage( Loading tests/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ librecovery_static_libs = [ "libhidlbase", "liblp", "libtinyxml2", "libc++fs", ] // recovery image for unittests. Loading Loading
Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ cc_defaults { ], static_libs: [ "libc++fs", "libinstall", "librecovery_fastboot", "libminui", Loading @@ -94,6 +95,7 @@ cc_library_static { ], shared_libs: [ "libfusesideload", "librecovery_ui", ], } Loading
install/include/install/install.h +4 −0 Original line number Diff line number Diff line Loading @@ -63,3 +63,7 @@ bool ReadMetadataFromPackage(ZipArchiveHandle zip, std::map<std::string, std::st // 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);
install/install.cpp +47 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <atomic> #include <chrono> #include <condition_variable> #include <filesystem> #include <functional> #include <limits> #include <mutex> Loading Loading @@ -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; }
recovery.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -752,7 +752,11 @@ Device::BuiltinAction start_recovery(Device* device, const std::vector<std::stri ensure_path_mounted(update_package); } if (install_with_fuse) { bool should_use_fuse = false; if (!SetupPackageMount(update_package, &should_use_fuse)) { LOG(INFO) << "Failed to set up the package access, skipping installation"; status = INSTALL_ERROR; } else if (install_with_fuse || should_use_fuse) { LOG(INFO) << "Installing package " << update_package << " with fuse"; status = InstallWithFuseFromPath(update_package, ui); } else if (auto memory_package = Package::CreateMemoryPackage( Loading
tests/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ librecovery_static_libs = [ "libhidlbase", "liblp", "libtinyxml2", "libc++fs", ] // recovery image for unittests. Loading