From: Cherry Zhang Date: Fri, 29 May 2020 05:59:09 +0000 (-0400) Subject: cmd/link: flush file mapping before unmapping X-Git-Tag: go1.15beta1~77 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=13bc6d4223515ac05afadc13728fb12d7c80f015;p=gostls13.git 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 --- 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)