diff options
author | Keith Randall <khr@golang.org> | 2015-02-14 15:46:36 -0800 |
---|---|---|
committer | Andrew Gerrand <adg@golang.org> | 2015-02-17 23:37:56 +0000 |
commit | e4acac3dfb97479e339fbf587af488bd6886cf09 (patch) | |
tree | c99de3c87fdf0f352ad47109a24de2e2c9c1d6a4 | |
parent | 3e5977f99d3e77a326ee1cef711c3e099285fba8 (diff) | |
download | go-git-e4acac3dfb97479e339fbf587af488bd6886cf09.tar.gz |
[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.c | 3 |
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) |