aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2015-02-14 15:46:36 -0800
committerAndrew Gerrand <adg@golang.org>2015-02-17 23:37:56 +0000
commite4acac3dfb97479e339fbf587af488bd6886cf09 (patch)
treec99de3c87fdf0f352ad47109a24de2e2c9c1d6a4
parent3e5977f99d3e77a326ee1cef711c3e099285fba8 (diff)
downloadgo-e4acac3dfb97479e339fbf587af488bd6886cf09.tar.gz
go-e4acac3dfb97479e339fbf587af488bd6886cf09.zip
[release-branch.go1.4] runtime: don't fail if we find a pointer to an invalid span on 32 bit
The 32-bit heap may have holes in it. Pointers to (non-heap) objects in those holes shouldn't cause the GC to throw. This change is somewhat of a band-aid fix for 1.4.2. We should do a more thorough fix for tip (keep track of the holes in the heap with special MSpans, say). Update #9872 Change-Id: Ife9ba27b77ae6ac5a6792d249c68893b3df62134 Reviewed-on: https://go-review.googlesource.com/4920 Run-TryBot: Keith Randall <khr@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
-rw-r--r--src/runtime/mgc0.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/runtime/mgc0.c b/src/runtime/mgc0.c
index 7754bad89d..083beec229 100644
--- a/src/runtime/mgc0.c
+++ b/src/runtime/mgc0.c
@@ -350,6 +350,9 @@ scanblock(byte *b, uintptr n, byte *ptrmask)
x -= (uintptr)arena_start>>PageShift;
s = runtime·mheap.spans[x];
if(s == nil || k < s->start || obj >= s->limit || s->state != MSpanInUse) {
+ // Sometimes 32-bit heaps have holes. See issue 9872
+ if(PtrSize == 4 && s == nil)
+ continue;
// Stack pointers lie within the arena bounds but are not part of the GC heap.
// Ignore them.
if(s != nil && s->state == MSpanStack)