mirror of
https://github.com/golang/go
synced 2024-11-18 07:04:52 -07:00
runtime: make pcln table check not trigger next to foreign code
Foreign code can be arbitrarily aligned, so the function before it can have arbitrarily much padding. We can't call pcvalue on values in the padding. Fixes #11653. Change-Id: I7d57f813ae5a2409d1520fcc909af3eeef2da131 Reviewed-on: https://go-review.googlesource.com/12550 Reviewed-by: Rob Pike <r@golang.org>
This commit is contained in:
parent
aad4fe4d8f
commit
74ec5bf2d8
@ -134,11 +134,20 @@ func moduledataverify1(datap *moduledata) {
|
||||
// The very end might be just padding that is not covered by the tables.
|
||||
// No architecture rounds function entries to more than 16 bytes,
|
||||
// but if one came along we'd need to subtract more here.
|
||||
end := datap.ftab[i+1].entry - 16
|
||||
if end < datap.ftab[i].entry {
|
||||
end = datap.ftab[i].entry
|
||||
}
|
||||
// But don't use the next PC if it corresponds to a foreign object chunk
|
||||
// (no pcln table, f2.pcln == 0). That chunk might have an alignment
|
||||
// more than 16 bytes.
|
||||
f := (*_func)(unsafe.Pointer(&datap.pclntable[datap.ftab[i].funcoff]))
|
||||
end := f.entry
|
||||
if i+1 < nftab {
|
||||
f2 := (*_func)(unsafe.Pointer(&datap.pclntable[datap.ftab[i+1].funcoff]))
|
||||
if f2.pcln != 0 {
|
||||
end = f2.entry - 16
|
||||
if end < f.entry {
|
||||
end = f.entry
|
||||
}
|
||||
}
|
||||
}
|
||||
pcvalue(f, f.pcfile, end, true)
|
||||
pcvalue(f, f.pcln, end, true)
|
||||
pcvalue(f, f.pcsp, end, true)
|
||||
|
Loading…
Reference in New Issue
Block a user