Blame SOURCES/0472-util-mkimage-Improve-data_size-value-calculation.patch

468bd4
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
468bd4
From: Peter Jones <pjones@redhat.com>
468bd4
Date: Thu, 11 Feb 2021 17:07:33 +0100
468bd4
Subject: [PATCH] util/mkimage: Improve data_size value calculation
468bd4
468bd4
According to "Microsoft Portable Executable and Common Object File Format
468bd4
Specification", the Optional Header SizeOfInitializedData field contains:
468bd4
468bd4
  Size of the initialized data section, or the sum of all such sections if
468bd4
  there are multiple data sections.
468bd4
468bd4
Make this explicit by adding the GRUB kernel data size to the sum of all
468bd4
the modules sizes. The ALIGN_UP() is not required by the PE spec but do
468bd4
it to avoid alignment issues.
468bd4
468bd4
Signed-off-by: Peter Jones <pjones@redhat.com>
468bd4
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
468bd4
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
468bd4
---
468bd4
 util/mkimage.c | 6 +++++-
468bd4
 1 file changed, 5 insertions(+), 1 deletion(-)
468bd4
468bd4
diff --git a/util/mkimage.c b/util/mkimage.c
468bd4
index e73a5864b22..f22b398d973 100644
468bd4
--- a/util/mkimage.c
468bd4
+++ b/util/mkimage.c
468bd4
@@ -1248,6 +1248,7 @@ grub_install_generate_image (const char *dir, const char *prefix,
468bd4
 	void *pe_img;
468bd4
 	grub_uint8_t *header;
468bd4
 	void *sections;
468bd4
+	size_t scn_size;
468bd4
 	size_t pe_size;
468bd4
 	struct grub_pe32_coff_header *c;
468bd4
 	struct grub_pe32_section_table *text_section, *data_section;
468bd4
@@ -1350,7 +1351,10 @@ grub_install_generate_image (const char *dir, const char *prefix,
468bd4
 						| GRUB_PE32_SCN_MEM_EXECUTE
468bd4
 						| GRUB_PE32_SCN_MEM_READ);
468bd4
 
468bd4
-	PE_OHDR (o32, o64, data_size) = grub_host_to_target32 (reloc_addr - layout.exec_size - header_size);
468bd4
+	scn_size = ALIGN_UP (layout.kernel_size - layout.exec_size, GRUB_PE32_FILE_ALIGNMENT);
468bd4
+	PE_OHDR (o32, o64, data_size) = grub_host_to_target32 (scn_size +
468bd4
+							       ALIGN_UP (total_module_size,
468bd4
+									 GRUB_PE32_FILE_ALIGNMENT));
468bd4
 
468bd4
 	data_section = text_section + 1;
468bd4
 	strcpy (data_section->name, ".data");