grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[SECURITY PATCH 107/117] util/mkimage: Improve data_size value calculati


From: Daniel Kiper
Subject: [SECURITY PATCH 107/117] util/mkimage: Improve data_size value calculation
Date: Tue, 2 Mar 2021 19:01:54 +0100

From: Peter Jones <pjones@redhat.com>

According to "Microsoft Portable Executable and Common Object File Format
Specification", the Optional Header SizeOfInitializedData field contains:

  Size of the initialized data section, or the sum of all such sections if
  there are multiple data sections.

Make this explicit by adding the GRUB kernel data size to the sum of all
the modules sizes. The ALIGN_UP() is not required by the PE spec but do
it to avoid alignment issues.

Signed-off-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
 util/mkimage.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/util/mkimage.c b/util/mkimage.c
index deaef5666..853a52179 100644
--- a/util/mkimage.c
+++ b/util/mkimage.c
@@ -1260,6 +1260,7 @@ grub_install_generate_image (const char *dir, const char 
*prefix,
        void *pe_img;
        grub_uint8_t *header;
        void *sections;
+       size_t scn_size;
        size_t pe_size;
        struct grub_pe32_coff_header *c;
        struct grub_pe32_section_table *text_section, *data_section;
@@ -1362,7 +1363,10 @@ grub_install_generate_image (const char *dir, const char 
*prefix,
                                                | GRUB_PE32_SCN_MEM_EXECUTE
                                                | GRUB_PE32_SCN_MEM_READ);
 
-       PE_OHDR (o32, o64, data_size) = grub_host_to_target32 (reloc_addr - 
layout.exec_size - header_size);
+       scn_size = ALIGN_UP (layout.kernel_size - layout.exec_size, 
GRUB_PE32_FILE_ALIGNMENT);
+       PE_OHDR (o32, o64, data_size) = grub_host_to_target32 (scn_size +
+                                                              ALIGN_UP 
(total_module_size,
+                                                                        
GRUB_PE32_FILE_ALIGNMENT));
 
        data_section = text_section + 1;
        strcpy (data_section->name, ".data");
-- 
2.11.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]