mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-03 02:27:48 +00:00
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:
committed by
Ron Evans
parent
46872a70b1
commit
ed7c242a09
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user