Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 58d082ff authored by Xin Li's avatar Xin Li
Browse files

DO NOT MERGE - Merge qt-qpr1-dev-plus-aosp@6304901 into stage-aosp-master

Bug: 151763422
Change-Id: I321588b16c61c4fbc31881886d4e18d0d621c0c9
parents 609b8b53 755e8757
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ cc_defaults {
    ],

    static_libs: [
        "libc++fs",
        "libinstall",
        "librecovery_fastboot",
        "libminui",
@@ -94,6 +95,7 @@ cc_library_static {
    ],

    shared_libs: [
        "libfusesideload",
        "librecovery_ui",
    ],
}
+4 −0
Original line number Diff line number Diff line
@@ -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);
+47 −0
Original line number Diff line number Diff line
@@ -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;
}
+5 −1
Original line number Diff line number Diff line
@@ -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(
+1 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ librecovery_static_libs = [
    "libhidlbase",
    "liblp",
    "libtinyxml2",
    "libc++fs",
]

// recovery image for unittests.
Loading