efi_loader: simplify PE consistency check
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 30 May 2020 05:35:59 +0000 (07:35 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Wed, 3 Jun 2020 15:19:18 +0000 (17:19 +0200)
Knowing that at least one section header follows the optional header we
only need to check for the length of the 64bit header which is longer than
the 32bit header.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_image_loader.c

index c2732876b8e577ae2b6859a1226b6e2c87112f69..478aaf50d3a61173e17503e51c16778c1acbb2b4 100644 (file)
@@ -637,21 +637,18 @@ efi_status_t efi_load_pe(struct efi_loaded_image_obj *handle,
                goto err;
        }
 
-       /* assume sizeof(IMAGE_NT_HEADERS32) <= sizeof(IMAGE_NT_HEADERS64) */
-       if (efi_size < dos->e_lfanew + sizeof(IMAGE_NT_HEADERS32)) {
+       /*
+        * Check if the image section header fits into the file. Knowing that at
+        * least one section header follows we only need to check for the length
+        * of the 64bit header which is longer than the 32bit header.
+        */
+       if (efi_size < dos->e_lfanew + sizeof(IMAGE_NT_HEADERS64)) {
                printf("%s: Invalid offset for Extended Header\n", __func__);
                ret = EFI_LOAD_ERROR;
                goto err;
        }
 
        nt = (void *) ((char *)efi + dos->e_lfanew);
-       if ((nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) &&
-           (efi_size < dos->e_lfanew + sizeof(IMAGE_NT_HEADERS64))) {
-               printf("%s: Invalid offset for Extended Header\n", __func__);
-               ret = EFI_LOAD_ERROR;
-               goto err;
-       }
-
        if (nt->Signature != IMAGE_NT_SIGNATURE) {
                printf("%s: Invalid NT Signature\n", __func__);
                ret = EFI_LOAD_ERROR;