From: Alexey Makhalov Date: Fri, 17 Jul 2020 05:17:26 +0000 (+0000) Subject: relocator: Fix grub_relocator_alloc_chunk_align() top memory allocation X-Git-Tag: grub-2.06-rc1~227 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07e5b79e22fd58c5382323dd71d64aaa42f928ec;p=thirdparty%2Fgrub.git relocator: Fix grub_relocator_alloc_chunk_align() top memory allocation Current implementation of grub_relocator_alloc_chunk_align() does not allow allocation of the top byte. Assuming input args are: max_addr = 0xfffff000; size = 0x1000; And this is valid. But following overflow protection will unnecessarily move max_addr one byte down (to 0xffffefff): if (max_addr > ~size) max_addr = ~size; ~size + 1 will fix the situation. In addition, check size for non zero to do not zero max_addr. Signed-off-by: Alexey Makhalov Reviewed-by: Daniel Kiper --- diff --git a/grub-core/lib/relocator.c b/grub-core/lib/relocator.c index 5847aac36..f2c1944c2 100644 --- a/grub-core/lib/relocator.c +++ b/grub-core/lib/relocator.c @@ -1386,8 +1386,8 @@ grub_relocator_alloc_chunk_align (struct grub_relocator *rel, }; grub_addr_t min_addr2 = 0, max_addr2; - if (max_addr > ~size) - max_addr = ~size; + if (size && (max_addr > ~size)) + max_addr = ~size + 1; #ifdef GRUB_MACHINE_PCBIOS if (min_addr < 0x1000)