aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorDavid Crawshaw <crawshaw@golang.org>2016-09-19 14:08:21 -0400
committerDavid Crawshaw <crawshaw@golang.org>2016-09-23 02:16:17 +0000
commitb4c9829c2299772eb0aaffcd437085f9f43e7166 (patch)
tree29127eb66f75a8a8eb354436d03ebee7917c3253 /src/runtime
parent9d8522fdc72ecc8eaa2d318a2cc04abde9beeb42 (diff)
downloadgo-b4c9829c2299772eb0aaffcd437085f9f43e7166.tar.xz
runtime: check plugin-loaded moduledata addresses
Inspired by difficulties with plugin support on darwin. Change-Id: I2cef8410837946454e75d00e94e46791f03f2267 Reviewed-on: https://go-review.googlesource.com/29391 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/plugin.go21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/runtime/plugin.go b/src/runtime/plugin.go
index 2e01650824..4a85a1f500 100644
--- a/src/runtime/plugin.go
+++ b/src/runtime/plugin.go
@@ -19,6 +19,22 @@ func plugin_lastmoduleinit() map[string]interface{} {
throw("runtime: plugin already initialized")
}
+ if fmd := &firstmoduledata; inRange(fmd.text, fmd.etext, md.text, md.etext) ||
+ inRange(fmd.bss, fmd.ebss, md.bss, md.ebss) ||
+ inRange(fmd.data, fmd.edata, md.data, md.edata) ||
+ inRange(fmd.types, fmd.etypes, md.types, md.etypes) {
+ println("plugin: new module data overlaps with firstmoduledata")
+ println("\tfirstmoduledata.text-etext=", hex(fmd.text), "-", hex(fmd.etext))
+ println("\tfirstmoduledata.bss-ebss=", hex(fmd.bss), "-", hex(fmd.ebss))
+ println("\tfirstmoduledata.data-edata=", hex(fmd.data), "-", hex(fmd.edata))
+ println("\tfirstmoduledata.types-etypes=", hex(fmd.types), "-", hex(fmd.etypes))
+ println("\tmd.text-etext=", hex(md.text), "-", hex(md.etext))
+ println("\tmd.bss-ebss=", hex(md.bss), "-", hex(md.ebss))
+ println("\tmd.data-edata=", hex(md.data), "-", hex(md.edata))
+ println("\tmd.types-etypes=", hex(md.types), "-", hex(md.etypes))
+ throw("plugin: new module data overlaps with firstmoduledata")
+ }
+
// Initialize the freshly loaded module.
typelinksinit()
md.gcdatamask = progToPointerMask((*byte)(unsafe.Pointer(md.gcdata)), md.edata-md.data)
@@ -55,6 +71,11 @@ func plugin_lastmoduleinit() map[string]interface{} {
return syms
}
+// inRange reports whether v0 or v1 are in the range [r0, r1].
+func inRange(r0, r1, v0, v1 uintptr) bool {
+ return (v0 >= r0 && v0 <= r1) || (v1 >= r0 && v1 <= r1)
+}
+
// A ptabEntry is generated by the compiler for each exported function
// and global variable in the main package of a plugin. It is used to
// initialize the plugin module's symbol map.