um: Limit TASK_SIZE to the addressable range

We may have a TASK_SIZE from the host that is bigger than UML is able to
address with a three-level pagetable on 64-bit. Guard against that by
clipping the maximum TASK_SIZE to the maximum addressable area.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Link: https://patch.msgid.link/20240919124511.282088-8-benjamin@sipsolutions.net
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Benjamin Berg 2024-09-19 14:45:08 +02:00 committed by Johannes Berg
parent 91f0a0c5cc
commit 830003c73d

View File

@ -331,11 +331,16 @@ int __init linux_main(int argc, char **argv)
stub_start -= PAGE_SIZE; stub_start -= PAGE_SIZE;
host_task_size = stub_start; host_task_size = stub_start;
/* Limit TASK_SIZE to what is addressable by the page table */
task_size = host_task_size;
if (task_size > (unsigned long long) PTRS_PER_PGD * PGDIR_SIZE)
task_size = PTRS_PER_PGD * PGDIR_SIZE;
/* /*
* TASK_SIZE needs to be PGDIR_SIZE aligned or else exit_mmap craps * TASK_SIZE needs to be PGDIR_SIZE aligned or else exit_mmap craps
* out * out
*/ */
task_size = host_task_size & PGDIR_MASK; task_size = task_size & PGDIR_MASK;
/* OS sanity checks that need to happen before the kernel runs */ /* OS sanity checks that need to happen before the kernel runs */
os_early_checks(); os_early_checks();