]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: allow for C pointers between arena_start and arena_used in cgo check
authorRuss Cox <rsc@golang.org>
Wed, 13 Jan 2016 17:23:44 +0000 (12:23 -0500)
committerRuss Cox <rsc@golang.org>
Wed, 13 Jan 2016 19:06:28 +0000 (19:06 +0000)
Fixes #13928.

Change-Id: Ia04c6bdef5ae6924d03982682ee195048f8f387f
Reviewed-on: https://go-review.googlesource.com/18611
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/runtime/cgocall.go

index 3b395fb8cdd7f62cd0431948a9c5a7811a8dd192..210d1862f95f8c7548f7ff7f95fbe2bc023e26c9 100644 (file)
@@ -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)