Messages in this thread | | | From | Kees Cook <> | Date | Sun, 17 Feb 2019 08:53:21 -0800 | Subject | Re: [PATCH v3 4/6] x86/mm/KASLR: Fix the wrong calculation of memory region initial size |
| |
On Sat, Feb 16, 2019 at 6:03 AM Baoquan He <bhe@redhat.com> wrote: > > In memory region KASLR, __PHYSICAL_MASK_SHIFT is taken to calculate > the initial size of the direct mapping region. This is correct in > the old code where __PHYSICAL_MASK_SHIFT was equal to MAX_PHYSMEM_BITS, > 46 bits, and only 4-level mode was supported. > > Later, in commit b83ce5ee91471d ("x86/mm/64: Make __PHYSICAL_MASK_SHIFT > always 52"), __PHYSICAL_MASK_SHIFT was changed to be always 52 bits, no > matter it's 5-level or 4-level. This is wrong for 4-level paging. Then > when we adapt physical memory region size based on available memory, it > will overflow if the amount of system RAM and the padding is bigger > than 64 TB. > > In fact, here MAX_PHYSMEM_BITS should be used instead. Fix it by > replacing __PHYSICAL_MASK_SHIFT with MAX_PHYSMEM_BITS. > > Fixes: b83ce5ee9147 ("x86/mm/64: Make __PHYSICAL_MASK_SHIFT always 52") > Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> > Reviewed-by: Thomas Garnier <thgarnie@google.com> > Signed-off-by: Baoquan He <bhe@redhat.com>
Nice catch! I wish I had a system with >64TB RAM. ;)
Acked-by: Kees Cook <keescook@chromium.org>
> --- > arch/x86/mm/kaslr.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/mm/kaslr.c b/arch/x86/mm/kaslr.c > index bf680929fe26..97768df923e3 100644 > --- a/arch/x86/mm/kaslr.c > +++ b/arch/x86/mm/kaslr.c > @@ -137,7 +137,7 @@ void __init kernel_randomize_memory(void) > if (!kaslr_memory_enabled()) > return; > > - kaslr_regions[0].size_tb = 1 << (__PHYSICAL_MASK_SHIFT - TB_SHIFT); > + kaslr_regions[0].size_tb = 1 << (MAX_PHYSMEM_BITS - TB_SHIFT); > kaslr_regions[1].size_tb = VMALLOC_SIZE_TB; > > /* > -- > 2.17.2 >
-- Kees Cook
| |