diff --git a/fastboot/device/commands.cpp b/fastboot/device/commands.cpp index 48c935a73..b7cafac4a 100644 --- a/fastboot/device/commands.cpp +++ b/fastboot/device/commands.cpp @@ -180,6 +180,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)); @@ -325,6 +331,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)) { @@ -365,6 +375,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"); @@ -381,6 +395,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)) { @@ -409,6 +427,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; }