From 1151473077fb03df798d4eb57a22fa820f9e41f8 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 14 Apr 2016 13:40:35 -0400 Subject: [PATCH] runtime: check that sysUnused is always physical-page aligned If sysUnused is passed an address or length that is not aligned to the physical page boundary, the kernel will unmap more memory than the caller wanted. Add a check for this. For #9993. Change-Id: I68ff03032e7b65cf0a853fe706ce21dc7f2aaaf8 Reviewed-on: https://go-review.googlesource.com/22065 Reviewed-by: Rick Hudson Reviewed-by: Dave Cheney Reviewed-by: Michael Hudson-Doyle --- src/runtime/mem_linux.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/runtime/mem_linux.go b/src/runtime/mem_linux.go index 1ee13bd7e6..61fdcee543 100644 --- a/src/runtime/mem_linux.go +++ b/src/runtime/mem_linux.go @@ -132,6 +132,13 @@ func sysUnused(v unsafe.Pointer, n uintptr) { } } + if uintptr(v)&(sys.PhysPageSize-1) != 0 || n&(sys.PhysPageSize-1) != 0 { + // madvise will round this to any physical page + // *covered* by this range, so an unaligned madvise + // will release more memory than intended. + throw("unaligned sysUnused") + } + madvise(v, n, _MADV_DONTNEED) } -- 2.48.1