From: Ana Bobillo <[email protected]>

tcg2_measure_gpt_data() now measures the GPT that part_get_gpt() gives,
whose entries are always sizeof(gpt_entry) bytes, as
validate_gpt_header() refuses any other size. So index them as an array
rather than stepping by sizeof_partition_entry, and read
num_partition_entries with le32_to_cpu(), as the rest of the GPT code
does.

No functional change on a little-endian machine.

Suggested-by: Simon Glass <[email protected]>
Signed-off-by: Ana Bobillo <[email protected]>
---
Changes in v3:
- New patch (Simon)

 lib/efi_loader/efi_tcg2.c | 24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)

diff --git a/lib/efi_loader/efi_tcg2.c b/lib/efi_loader/efi_tcg2.c
index 97fce462138..4045af9afa3 100644
--- a/lib/efi_loader/efi_tcg2.c
+++ b/lib/efi_loader/efi_tcg2.c
@@ -1168,8 +1168,8 @@ tcg2_measure_gpt_data(struct udevice *dev,
        efi_guid_t null_guid = NULL_GUID;
        gpt_header *gpt_h;
        gpt_entry *entry = NULL;
-       gpt_entry *gpt_e;
        u32 num_of_valid_entry = 0;
+       u32 num_entries;
        u32 event_size;
        u32 i;
 
@@ -1235,17 +1235,15 @@ tcg2_measure_gpt_data(struct udevice *dev,
        }
 
        /* count valid GPT entry */
-       gpt_e = entry;
-       for (i = 0; i < gpt_h->num_partition_entries; i++) {
-               if (guidcmp(&null_guid, &gpt_e->partition_type_guid))
+       num_entries = le32_to_cpu(gpt_h->num_partition_entries);
+       for (i = 0; i < num_entries; i++) {
+               if (guidcmp(&null_guid, &entry[i].partition_type_guid))
                        num_of_valid_entry++;
-
-               gpt_e = (gpt_entry *)((u8 *)gpt_e + 
gpt_h->sizeof_partition_entry);
        }
 
        /* prepare event data for measurement */
        event_size = sizeof(struct efi_gpt_data) +
-               (num_of_valid_entry * gpt_h->sizeof_partition_entry);
+               (num_of_valid_entry * sizeof(gpt_entry));
        event = calloc(1, event_size);
        if (!event) {
                ret = EFI_OUT_OF_RESOURCES;
@@ -1255,17 +1253,13 @@ tcg2_measure_gpt_data(struct udevice *dev,
        put_unaligned_le64(num_of_valid_entry, &event->number_of_partitions);
 
        /* copy valid GPT entry */
-       gpt_e = entry;
        num_of_valid_entry = 0;
-       for (i = 0; i < gpt_h->num_partition_entries; i++) {
-               if (guidcmp(&null_guid, &gpt_e->partition_type_guid)) {
-                       memcpy((u8 *)event->partitions +
-                              (num_of_valid_entry * 
gpt_h->sizeof_partition_entry),
-                              gpt_e, gpt_h->sizeof_partition_entry);
+       for (i = 0; i < num_entries; i++) {
+               if (guidcmp(&null_guid, &entry[i].partition_type_guid)) {
+                       memcpy(&event->partitions[num_of_valid_entry],
+                              &entry[i], sizeof(gpt_entry));
                        num_of_valid_entry++;
                }
-
-               gpt_e = (gpt_entry *)((u8 *)gpt_e + 
gpt_h->sizeof_partition_entry);
        }
 
        ret = measure_event(dev, 5, EV_EFI_GPT_EVENT, event_size, (u8 *)event);

Reply via email to