diff options
author | Ian Lance Taylor <iant@golang.org> | 2016-01-29 15:43:24 -0800 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2016-02-01 20:38:07 +0000 |
commit | b3c05f08a97ac89064d3edbf4efb7bea671c2c18 (patch) | |
tree | 2c6ef1660928adb3d99ad4734322f6536ff7af18 /src/runtime/cgo_mmap.go | |
parent | d37d76af43f590935b13f2d33b07ef51c2976354 (diff) | |
download | go-b3c05f08a97ac89064d3edbf4efb7bea671c2c18.tar.gz go-b3c05f08a97ac89064d3edbf4efb7bea671c2c18.zip |
runtime: avoid write barrier in cgo mmap code
Tested by hand with a runtime/cgo modified to return an mmap failure
after 10 calls.
This is an interim patch. For 1.7 we should fix mmap properly to avoid
using the same value as both a pointer and an errno value.
Fixes #14149.
Change-Id: I8f2bbd47d711e283001ba73296f1c34a26c59241
Reviewed-on: https://go-review.googlesource.com/19084
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/runtime/cgo_mmap.go')
-rw-r--r-- | src/runtime/cgo_mmap.go | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/runtime/cgo_mmap.go b/src/runtime/cgo_mmap.go index ef5501ca5f..c0396bdde5 100644 --- a/src/runtime/cgo_mmap.go +++ b/src/runtime/cgo_mmap.go @@ -15,12 +15,19 @@ import "unsafe" //go:linkname _cgo_mmap _cgo_mmap var _cgo_mmap unsafe.Pointer -func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (ret unsafe.Pointer) { +func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) unsafe.Pointer { if _cgo_mmap != nil { + // Make ret a uintptr so that writing to it in the + // function literal does not trigger a write barrier. + // A write barrier here could break because of the way + // that mmap uses the same value both as a pointer and + // an errno value. + // TODO: Fix mmap to return two values. + var ret uintptr systemstack(func() { ret = callCgoMmap(addr, n, prot, flags, fd, off) }) - return + return unsafe.Pointer(ret) } return sysMmap(addr, n, prot, flags, fd, off) } @@ -31,4 +38,4 @@ func sysMmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) // cgoMmap calls the mmap function in the runtime/cgo package on the // callCgoMmap calls the mmap function in the runtime/cgo package // using the GCC calling convention. It is implemented in assembly. -func callCgoMmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) unsafe.Pointer +func callCgoMmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) uintptr |