]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.4] runtime: don't fail if we find a pointer to an invalid span...
authorKeith Randall <khr@golang.org>
Sat, 14 Feb 2015 23:46:36 +0000 (15:46 -0800)
committerAndrew Gerrand <adg@golang.org>
Tue, 17 Feb 2015 23:37:56 +0000 (23:37 +0000)
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>
src/runtime/mgc0.c

index 7754bad89d437ea27f5881a6a7d6214419ebe846..083beec2295aa166aae7cfabe3ec289d8930c761 100644 (file)
@@ -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)