From 79e9552ebb62388d003c95e58c2aa1ce50ac6f0f Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 20 Mar 2018 16:17:55 +0000 Subject: [PATCH] Check for wrap-around in vm_phys_alloc_seg_contig(). It is possible to provide insane values for size in contigmalloc(9) request, which usually not reaches the phys allocator due to failing KVA allocation. But with the forthcoming 4/4 i386, where 32bit architecture has almost 4G KVA, contigmalloc(1G) is not unreasonable outright and KVA might be available sometimes. Then, the calculation of pa_end could wrap around, depending on the physical address, and the checks in vm_phys_alloc_seg_contig() would pass while the iteration in the loop after the 'done' label goes out of the vm_page_array bounds. Fix it by detecting the wrap. Reported and tested by: pho Reviewed by: alc, markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D14767 --- sys/vm/vm_phys.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/vm/vm_phys.c b/sys/vm/vm_phys.c index 7270d36e452..e5679c900e7 100644 --- a/sys/vm/vm_phys.c +++ b/sys/vm/vm_phys.c @@ -1189,6 +1189,8 @@ vm_phys_alloc_seg_contig(struct vm_phys_seg *seg, u_long npages, */ pa = VM_PAGE_TO_PHYS(m_ret); pa_end = pa + size; + if (pa_end < pa) + continue; for (;;) { pa += 1 << (PAGE_SHIFT + VM_NFREEORDER - 1);