Skip to content

Commit

Permalink
runtime: allow for C pointers between arena_start and arena_used in c…
Browse files Browse the repository at this point in the history
…go check

Fixes #13928.

Change-Id: Ia04c6bdef5ae6924d03982682ee195048f8f387f
Reviewed-on: https://go-review.googlesource.com/18611
Reviewed-by: Ian Lance Taylor <iant@golang.org>
  • Loading branch information
rsc committed Jan 13, 2016
1 parent 166cfd2 commit dd6753a
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions src/runtime/cgocall.go
Expand Up @@ -502,11 +502,13 @@ func cgoCheckArg(t *_type, p unsafe.Pointer, indir, top bool, msg string) {
func cgoCheckUnknownPointer(p unsafe.Pointer, msg string) (base, i uintptr) {
if cgoInRange(p, mheap_.arena_start, mheap_.arena_used) {
if !inheap(uintptr(p)) {
// This pointer is either to a stack or to an
// unused span. Escape analysis should
// prevent the former and the latter should
// not happen.
panic(errorString("cgo argument has invalid Go pointer"))
// On 32-bit systems it is possible for C's allocated memory
// to have addresses between arena_start and arena_used.
// Either this pointer is a stack or an unused span or it's
// a C allocation. Escape analysis should prevent the first,
// garbage collection should prevent the second,
// and the third is completely OK.
return
}

b, hbits, span := heapBitsForObject(uintptr(p), 0, 0)
Expand Down

0 comments on commit dd6753a

Please sign in to comment.