From a7a11dd60db9f244e1a10bd0d5aecc041f36161f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 24 Dec 2017 22:37:19 +0100 Subject: [PATCH] [SETUPLIB] Improve the bootloader 'validity' checks -- Addendum to f06734e5 (r74512). Adapted from PR #89 by Serge Gautherie. This should improve the situation described in CORE-12672 and CORE-4870. --- base/setup/lib/bootsup.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/base/setup/lib/bootsup.c b/base/setup/lib/bootsup.c index 2f7b43fee3a..5f0f694779e 100644 --- a/base/setup/lib/bootsup.c +++ b/base/setup/lib/bootsup.c @@ -551,7 +551,6 @@ IsThereAValidBootSector( HANDLE FileHandle; LARGE_INTEGER FileOffset; PUCHAR BootSector; - ULONG Instruction; /* Allocate buffer for bootsector */ BootSector = RtlAllocateHeap(ProcessHeap, 0, SECTORSIZE); @@ -593,17 +592,18 @@ IsThereAValidBootSector( if (!NT_SUCCESS(Status)) goto Quit; - /* Check the instruction; we use a ULONG to read three bytes */ - Instruction = (*(PULONG)BootSector) & 0x00FFFFFF; - IsValid = (Instruction != 0x00000000); - - /* Check the bootsector signature */ - IsValid &= (*(PUSHORT)(BootSector + 0x1fe) == 0xaa55); + /* Check for the existence of the bootsector signature */ + IsValid = (*(PUSHORT)(BootSector + 0x1FE) == 0xAA55); + if (IsValid) + { + /* Check for the first instruction encoded on three bytes */ + IsValid = (((*(PULONG)BootSector) & 0x00FFFFFF) != 0x00000000); + } Quit: /* Free the boot sector */ RtlFreeHeap(ProcessHeap, 0, BootSector); - return IsValid; // Status; + return IsValid; } static -- 2.17.1