Commit 74ec5bf2 authored by Russ Cox's avatar Russ Cox

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/12550Reviewed-by: default avatarRob Pike <r@golang.org>
parent aad4fe4d
......@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment