From 13bc6d4223515ac05afadc13728fb12d7c80f015 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 29 May 2020 01:59:09 -0400 Subject: [PATCH] cmd/link: flush file mapping before unmapping Call FlushViewOfFile before unmapping the output file, for extra safety. The documentation says the function does not wait for the data to be written to disk, so it should be cheap. Fixes #38440. Change-Id: I05352f15d9305e6e7086a002f61802f74036b710 Reviewed-on: https://go-review.googlesource.com/c/go/+/235639 Reviewed-by: Austin Clements Reviewed-by: Jason A. Donenfeld --- src/cmd/link/internal/ld/outbuf_windows.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/outbuf_windows.go b/src/cmd/link/internal/ld/outbuf_windows.go index a7140cce38..807c0e227d 100644 --- a/src/cmd/link/internal/ld/outbuf_windows.go +++ b/src/cmd/link/internal/ld/outbuf_windows.go @@ -35,7 +35,13 @@ func (out *OutBuf) munmap() { if out.buf == nil { return } - err := syscall.UnmapViewOfFile(uintptr(unsafe.Pointer(&out.buf[0]))) + // Apparently unmapping without flush may cause ACCESS_DENIED error + // (see issue 38440). + err := syscall.FlushViewOfFile(uintptr(unsafe.Pointer(&out.buf[0])), 0) + if err != nil { + Exitf("FlushViewOfFile failed: %v", err) + } + err = syscall.UnmapViewOfFile(uintptr(unsafe.Pointer(&out.buf[0]))) out.buf = nil if err != nil { Exitf("UnmapViewOfFile failed: %v", err) -- 2.50.0