aboutsummaryrefslogtreecommitdiff
path: root/src/plugin
diff options
context:
space:
mode:
authorTodd Neal <todd@tneal.org>2017-04-11 18:52:05 -0500
committerTodd Neal <todd@tneal.org>2017-04-12 12:34:25 +0000
commit758d078fd5ab423d00f5a46028139c1d13983120 (patch)
tree5884001dd5059cad18b61ce4161d0bf602f330e0 /src/plugin
parent092405a9affad56d18ee3d28b93b706c2887ba7d (diff)
downloadgo-758d078fd5ab423d00f5a46028139c1d13983120.tar.gz
go-758d078fd5ab423d00f5a46028139c1d13983120.zip
plugin: resolve random crash when calling exported functions
open modified the plugin symbols map while ranging over it. This is normally harmless, except that the operations performed were not idempotent leading to function pointers being corrupted. Fixes #19269 Change-Id: I4b6eb1d45567161412e4a34b41f1ebf647bcc942 Reviewed-on: https://go-review.googlesource.com/40431 Run-TryBot: Todd Neal <todd@tneal.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Crawshaw <crawshaw@golang.org>
Diffstat (limited to 'src/plugin')
-rw-r--r--src/plugin/plugin_dlopen.go9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/plugin/plugin_dlopen.go b/src/plugin/plugin_dlopen.go
index c5b0a4721c..72e219e337 100644
--- a/src/plugin/plugin_dlopen.go
+++ b/src/plugin/plugin_dlopen.go
@@ -82,7 +82,6 @@ func open(name string) (*Plugin, error) {
p := &Plugin{
pluginpath: pluginpath,
loaded: make(chan struct{}),
- syms: syms,
}
plugins[filepath] = p
pluginsMu.Unlock()
@@ -97,13 +96,13 @@ func open(name string) (*Plugin, error) {
}
// Fill out the value of each plugin symbol.
+ updatedSyms := map[string]interface{}{}
for symName, sym := range syms {
isFunc := symName[0] == '.'
if isFunc {
delete(syms, symName)
symName = symName[1:]
}
-
cname := C.CString(pluginpath + "." + symName)
p := C.pluginLookup(h, cname, &cErr)
C.free(unsafe.Pointer(cname))
@@ -116,8 +115,12 @@ func open(name string) (*Plugin, error) {
} else {
(*valp)[1] = p
}
- syms[symName] = sym
+ // we can't add to syms during iteration as we'll end up processing
+ // some symbols twice with the inability to tell if the symbol is a function
+ updatedSyms[symName] = sym
}
+ p.syms = updatedSyms
+
close(p.loaded)
return p, nil
}