On Mon, Aug 26, 2019 at 09:15:39AM +0200, Borislav Petkov wrote: > On Sun, Aug 25, 2019 at 10:33:15PM -0500, Gustavo A. R. Silva wrote: > > Hi all, > > > > On 8/19/19 9:16 AM, tip-bot for Kirill A. Shutemov wrote: > > [..] > > > > > > diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c > > > index 5f2d03067ae5..2faddeb0398a 100644 > > > --- a/arch/x86/boot/compressed/pgtable_64.c > > > +++ b/arch/x86/boot/compressed/pgtable_64.c > > > @@ -72,6 +72,8 @@ static unsigned long find_trampoline_placement(void) > > > > > > /* Find the first usable memory region under bios_start. */ > > > for (i = boot_params->e820_entries - 1; i >= 0; i--) { > > > + unsigned long new; > > > + > > > entry = &boot_params->e820_table[i]; > > > > > > /* Skip all entries above bios_start. */ > > > @@ -84,15 +86,20 @@ static unsigned long find_trampoline_placement(void) > > > > > > /* Adjust bios_start to the end of the entry if needed. */ > > > if (bios_start > entry->addr + entry->size) > > > > Notice that if this condition happens to be false, we end up with an > > uninitialized variable *new*. > > Yap, good catch. :facepalm: > > What would be the right value to assign to *new* at declaration under > > this condition? > > Looking at the changed flow of the loop, how we use new instead of > bios_start and how we assign new back to bios_start, I think we should > do: > > unsigned long new = bios_start; > > at the beginning... Right. What about this: >From b613c675e6690ef5608a5abf71d90e15ced31b2b Mon Sep 17 00:00:00 2001 From: "Kirill A. Shutemov" <kirill.shutemov@xxxxxxxxxxxxxxx> Date: Mon, 26 Aug 2019 16:26:01 +0300 Subject: [PATCH] x86/boot/compressed/64: Fix missining initialization in find_trampoline_placement() Gustavo noticed that 'new' can be left uninitialized if 'bios_start' happens to be less or equal to 'entry->addr + entry->size'. Initialize the variable at the start of the iteration to current value of 'bios_start'. Signed-off-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> Reported-by: "Gustavo A. R. Silva" <gustavo@xxxxxxxxxxxxxx> Fixes: 0a46fff2f910 ("x86/boot/compressed/64: Fix boot on machines with broken E820 table") --- arch/x86/boot/compressed/pgtable_64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c index 2faddeb0398a..c8862696a47b 100644 --- a/arch/x86/boot/compressed/pgtable_64.c +++ b/arch/x86/boot/compressed/pgtable_64.c @@ -72,7 +72,7 @@ static unsigned long find_trampoline_placement(void) /* Find the first usable memory region under bios_start. */ for (i = boot_params->e820_entries - 1; i >= 0; i--) { - unsigned long new; + unsigned long new = bios_start; entry = &boot_params->e820_table[i]; -- Kirill A. Shutemov