From: Ian Lance Taylor Date: Thu, 2 Jun 2016 19:01:03 +0000 (-0700) Subject: runtime: only permit SetCgoTraceback to be called once X-Git-Tag: go1.7beta2~67 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=03abde49713b46366fa47a037040697c8fdad3bb;p=gostls13.git runtime: only permit SetCgoTraceback to be called once Accept a duplicate call, but nothing else. Change-Id: Iec24bf5ddc3b0f0c559ad2158339aca698601743 Reviewed-on: https://go-review.googlesource.com/23692 Run-TryBot: Ian Lance Taylor Reviewed-by: Dmitry Vyukov TryBot-Result: Gobot Gobot --- diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index 96f154e213..80a54407b3 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -962,12 +962,21 @@ func isSystemGoroutine(gp *g) bool { // traceback function will only be called with the context field set // to zero. If the context function is nil, then calls from Go to C // to Go will not show a traceback for the C portion of the call stack. +// +// SetCgoTraceback should be called only once, ideally from an init function. func SetCgoTraceback(version int, traceback, context, symbolizer unsafe.Pointer) { if version != 0 { panic("unsupported version") } + if cgoTraceback != nil && cgoTraceback != traceback || + cgoContext != nil && cgoContext != context || + cgoSymbolizer != nil && cgoSymbolizer != symbolizer { + panic("call SetCgoTraceback only once") + } + cgoTraceback = traceback + cgoContext = context cgoSymbolizer = symbolizer // The context function is called when a C function calls a Go @@ -978,6 +987,7 @@ func SetCgoTraceback(version int, traceback, context, symbolizer unsafe.Pointer) } var cgoTraceback unsafe.Pointer +var cgoContext unsafe.Pointer var cgoSymbolizer unsafe.Pointer // cgoTracebackArg is the type passed to cgoTraceback.