From bc52a620fe716974ca1ea1d48c804df15af766ad Mon Sep 17 00:00:00 2001 From: Bowgo Tsai Date: Mon, 10 Jun 2019 13:54:30 +0530 Subject: QcomModulePkg: avb: Allow system partition to be absent On devices with dynamic partitions, 'system' partition might not exist. Therefore, we should not add root=$(ANDROID_SYSTEM_PARTUUID) in kernel cmdline and resolve it for devices without system partition. Bug: 119551429 Test: m libavb_host_unittest && ../../out/host/linux-x86/nativetest64/libavb_host_unittest/libavb_host_unittest Git-repo: https://source.codeaurora.org/quic/la/platform/external/avb Git-Commit: 5abd6bc2578968d24406d834471adfd995a0c2e9 Change-Id: I767fb1b18182663d8401cf0e8d19930d45c4b83a --- QcomModulePkg/Library/avb/libavb/avb_slot_verify.c | 44 +++++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c b/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c index db650e094c..b410fec3d6 100644 --- a/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c +++ b/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c @@ -1280,6 +1280,35 @@ out: return ret; } +static bool has_system_partition(AvbOps* ops, const char* ab_suffix) { + char part_name[PART_NAME_MAX_SIZE]; + char* system_part_name = "system"; + char guid_buf[37]; + AvbIOResult io_ret; + + if (!avb_str_concat(part_name, + sizeof part_name, + system_part_name, + avb_strlen(system_part_name), + ab_suffix, + avb_strlen(ab_suffix))) { + avb_error("System partition name and suffix does not fit.\n"); + return false; + } + + io_ret = ops->get_unique_guid_for_partition( + ops, part_name, guid_buf, sizeof guid_buf); + if (io_ret == AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION) { + avb_debug("No system partition.\n"); + return false; + } else if (io_ret != AVB_IO_RESULT_OK) { + avb_error("Error getting unique GUID for system partition.\n"); + return false; + } + + return true; +} + AvbSlotVerifyResult avb_slot_verify(AvbOps* ops, const char* const* requested_partitions, const char* ab_suffix, @@ -1382,11 +1411,16 @@ AvbSlotVerifyResult avb_slot_verify(AvbOps* ops, * that the system partition is mounted. */ avb_assert(slot_data->cmdline == NULL); - slot_data->cmdline = - avb_strdup("root=PARTUUID=$(ANDROID_SYSTEM_PARTUUID)"); - if (slot_data->cmdline == NULL) { - ret = AVB_SLOT_VERIFY_RESULT_ERROR_OOM; - goto fail; + // Devices with dynamic partitions won't have system partition. + // Instead, it has a large super partition to accommodate *.img files. + // See b/119551429 for details. + if (has_system_partition(ops, ab_suffix)) { + slot_data->cmdline = + avb_strdup("root=PARTUUID=$(ANDROID_SYSTEM_PARTUUID)"); + if (slot_data->cmdline == NULL) { + ret = AVB_SLOT_VERIFY_RESULT_ERROR_OOM; + goto fail; + } } } else { /* Add options - any failure in append_options() is either an -- cgit v1.2.3 From b06e539ad428438cdf3a7215c41b2a37749a3ec3 Mon Sep 17 00:00:00 2001 From: Bowgo Tsai Date: Mon, 10 Jun 2019 13:56:02 +0530 Subject: QcomModulePkg: avb: Fix AvbSlotVerifyData->cmdline might be NULL When AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED is set, AvbSlotVerifyData->cmdline should be a NUL-terminated string instead of NULL. Bug: 119551429 Test: atest libavb_host_unittest Git-repo: https://source.codeaurora.org/quic/la/platform/external/avb Git-Commit: 9ba3b6613b4e5130fa01a11d984c6b5f0eb3af05 Change-Id: If9cc5feb4f59b0f6b73b577fbff84bb34e514304 --- QcomModulePkg/Library/avb/libavb/avb_slot_verify.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c b/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c index b410fec3d6..62bf5f17f6 100644 --- a/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c +++ b/QcomModulePkg/Library/avb/libavb/avb_slot_verify.c @@ -1417,10 +1417,13 @@ AvbSlotVerifyResult avb_slot_verify(AvbOps* ops, if (has_system_partition(ops, ab_suffix)) { slot_data->cmdline = avb_strdup("root=PARTUUID=$(ANDROID_SYSTEM_PARTUUID)"); - if (slot_data->cmdline == NULL) { - ret = AVB_SLOT_VERIFY_RESULT_ERROR_OOM; - goto fail; - } + } else { + // The |cmdline| field should be a NUL-terminated string. + slot_data->cmdline = avb_strdup(""); + } + if (slot_data->cmdline == NULL) { + ret = AVB_SLOT_VERIFY_RESULT_ERROR_OOM; + goto fail; } } else { /* Add options - any failure in append_options() is either an @@ -1437,7 +1440,7 @@ AvbSlotVerifyResult avb_slot_verify(AvbOps* ops, } } /* Substitute $(ANDROID_SYSTEM_PARTUUID) and friends. */ - if (slot_data->cmdline != NULL) { + if (slot_data->cmdline != NULL && avb_strlen(slot_data->cmdline) != 0) { char* new_cmdline; new_cmdline = sub_cmdline( ops, slot_data->cmdline, ab_suffix, using_boot_for_vbmeta); -- cgit v1.2.3