From dca328d55cd562e95be03cf0e402fd179b3a02a5 Mon Sep 17 00:00:00 2001 From: Hridya Valsaraju Date: Mon, 24 Sep 2018 16:01:35 -0700 Subject: [PATCH] Support 'fastboot getvar unlocked' command. Test: fastboot getvar unlocked. Bug: 78793464 Change-Id: Ie59c6db90a503e9a6e9ac1c416e4ee5deac60479 --- fastboot/device/commands.cpp | 23 +++++++++++++++++++++++ fastboot/device/utility.cpp | 7 +++++++ fastboot/device/utility.h | 1 + fastboot/device/variables.cpp | 2 +- 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp index 0ec09945b..99142271c 100644 --- a/fastboot/device/commands.cpp +++ b/fastboot/device/commands.cpp @@ -159,6 +159,12 @@ bool FlashHandler(FastbootDevice* device, const std::vector& args) if (args.size() < 2) { return device->WriteStatus(FastbootResult::FAIL, "Invalid arguments"); } + + if (GetDeviceLockStatus()) { + return device->WriteStatus(FastbootResult::FAIL, + "Flashing is not allowed on locked devices"); + } + int ret = Flash(device, args[1]); if (ret < 0) { return device->WriteStatus(FastbootResult::FAIL, strerror(-ret)); @@ -304,6 +310,10 @@ bool CreatePartitionHandler(FastbootDevice* device, const std::vectorWriteFail("Invalid partition name and size"); } + if (GetDeviceLockStatus()) { + return device->WriteStatus(FastbootResult::FAIL, "Command not available on locked devices"); + } + uint64_t partition_size; std::string partition_name = args[1]; if (!android::base::ParseUint(args[2].c_str(), &partition_size)) { @@ -344,6 +354,10 @@ bool DeletePartitionHandler(FastbootDevice* device, const std::vectorWriteFail("Invalid partition name and size"); } + if (GetDeviceLockStatus()) { + return device->WriteStatus(FastbootResult::FAIL, "Command not available on locked devices"); + } + PartitionBuilder builder(device); if (!builder.Valid()) { return device->WriteFail("Could not open super partition"); @@ -360,6 +374,10 @@ bool ResizePartitionHandler(FastbootDevice* device, const std::vectorWriteFail("Invalid partition name and size"); } + if (GetDeviceLockStatus()) { + return device->WriteStatus(FastbootResult::FAIL, "Command not available on locked devices"); + } + uint64_t partition_size; std::string partition_name = args[1]; if (!android::base::ParseUint(args[2].c_str(), &partition_size)) { @@ -388,6 +406,11 @@ bool UpdateSuperHandler(FastbootDevice* device, const std::vector& if (args.size() < 2) { return device->WriteFail("Invalid arguments"); } + + if (GetDeviceLockStatus()) { + return device->WriteStatus(FastbootResult::FAIL, "Command not available on locked devices"); + } + bool wipe = (args.size() >= 3 && args[2] == "wipe"); return UpdateSuper(device, args[1], wipe); } diff --git a/fastboot/device/utility.cpp b/fastboot/device/utility.cpp index 261a2026c..02f6f2ca8 100644 --- a/fastboot/device/utility.cpp +++ b/fastboot/device/utility.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -159,3 +160,9 @@ std::vector ListPartitions(FastbootDevice* device) { } return partitions; } + +bool GetDeviceLockStatus() { + std::string cmdline; + android::base::ReadFileToString("/proc/cmdline", &cmdline); + return cmdline.find("androidboot.verifiedbootstate=orange") == std::string::npos; +} diff --git a/fastboot/device/utility.h b/fastboot/device/utility.h index 4f0d0791e..bb08f726b 100644 --- a/fastboot/device/utility.h +++ b/fastboot/device/utility.h @@ -58,3 +58,4 @@ bool LogicalPartitionExists(const std::string& name, const std::string& slot_suf bool OpenPartition(FastbootDevice* device, const std::string& name, PartitionHandle* handle); bool GetSlotNumber(const std::string& slot, android::hardware::boot::V1_0::Slot* number); std::vector ListPartitions(FastbootDevice* device); +bool GetDeviceLockStatus(); diff --git a/fastboot/device/variables.cpp b/fastboot/device/variables.cpp index 75352489e..002e04349 100644 --- a/fastboot/device/variables.cpp +++ b/fastboot/device/variables.cpp @@ -148,7 +148,7 @@ bool GetMaxDownloadSize(FastbootDevice* /* device */, const std::vector& /* args */, std::string* message) { - *message = "yes"; + *message = GetDeviceLockStatus() ? "no" : "yes"; return true; }