From e1d7c370bc01199905a5073ee6a3d033aac9595c Mon Sep 17 00:00:00 2001 From: Caleb Connolly Date: Tue, 18 Mar 2025 14:10:52 +0000 Subject: [PATCH] properly error if run on a non-A/B device Detect the case where there are no A/B partitions and print an error about it rather than erroneously continuing execution. Signed-off-by: Caleb Connolly --- bootctrl.h | 3 ++- bootctrl_impl.c | 6 ++++-- qbootctl.c | 20 ++++++++++++-------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/bootctrl.h b/bootctrl.h index beb9d23..fcbd807 100644 --- a/bootctrl.h +++ b/bootctrl.h @@ -51,8 +51,9 @@ struct boot_control_module { * The returned value is always guaranteed to be strictly less than the * value returned by getNumberSlots. Slots start at 0 and * finish at getNumberSlots() - 1 + * Returns -ENOENT on devices with no slots. */ - unsigned (*getCurrentSlot)(); + int (*getCurrentSlot)(); /* * (*markBootSuccessful)() marks the specified slot diff --git a/bootctrl_impl.c b/bootctrl_impl.c index 516547f..5586f72 100644 --- a/bootctrl_impl.c +++ b/bootctrl_impl.c @@ -358,13 +358,15 @@ unsigned get_active_boot_slot() * (e.g. because we booted via a secondary bootloader that removes Android cmdline args) then we * assume that the active slot is the current slot */ -static unsigned int get_current_or_active_slot() +static int get_current_or_active_slot() { uint32_t num_slots = 0; char bootSlotProp[MAX_CMDLINE_SIZE] = { '\0' }; unsigned i = 0; num_slots = get_number_slots(); - if (num_slots <= 1) { + if (num_slots == 0) + return -ENOENT; + if (num_slots == 1) { // Slot 0 is the only slot around. return 0; } diff --git a/qbootctl.c b/qbootctl.c index 463ff25..a369fbc 100644 --- a/qbootctl.c +++ b/qbootctl.c @@ -115,10 +115,9 @@ int get_slot_info(struct slot_info *slots) return 0; } -void dump_info() +static void dump_info(int current_slot) { struct slot_info slots[2] = { { 0 } }; - int current_slot = impl->getCurrentSlot(); get_slot_info(slots); @@ -135,7 +134,7 @@ void dump_info() int main(int argc, char **argv) { int optflag; - int slot = -1; + int slot = -1, current_slot; int rc; bool ignore_missing_bsg = false; @@ -144,9 +143,15 @@ int main(int argc, char **argv) return 1; } + current_slot = impl->getCurrentSlot(); + if (current_slot < 0) { + fprintf(stderr, "No slots found, is this an A/B device?\n"); + return 1; + } + switch (argc) { case 1: - dump_info(); + dump_info(current_slot); return 0; case 2: break; @@ -157,14 +162,13 @@ int main(int argc, char **argv) return usage(); } - if (slot < 0) - slot = impl->getCurrentSlot(); - optflag = getopt(argc, argv, "hcmas:ub:n:x"); + if (slot < 0 || optflag == 'c') + slot = current_slot; + switch (optflag) { case 'c': - slot = impl->getCurrentSlot(); printf("Current slot: %s\n", impl->getSuffix(slot)); return 0; case 'a':