runtime: fix a heap corruption where some blocks were not marked as reachable

This is a rather critical error and I wonder why it hasn't been
discovered earlier.
This commit is contained in:
Ayke van Laethem
2019-06-20 13:12:35 +02:00
committed by Ron Evans
parent 46872a70b1
commit ed7c242a09
+6 -1
View File
@@ -119,7 +119,7 @@ func (b gcBlock) findHead() gcBlock {
// findNext returns the first block just past the end of the tail. This may or
// may not be the head of an object.
func (b gcBlock) findNext() gcBlock {
if b.state() == blockStateHead {
if b.state() == blockStateHead || b.state() == blockStateMark {
b++
}
for b.state() == blockStateTail {
@@ -303,6 +303,11 @@ func markRoots(start, end uintptr) {
if gcDebug {
println("mark from", start, "to", end, int(end-start))
}
if gcAsserts {
if start >= end {
runtimePanic("gc: unexpected range to mark")
}
}
for addr := start; addr != end; addr += unsafe.Sizeof(addr) {
root := *(*uintptr)(unsafe.Pointer(addr))