mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/cgo: make sure pointers passed to C escape to heap
Fixes #10303. Change-Id: Ia68d3566ba3ebeea6e18e388446bd9b8c431e156 Reviewed-on: https://go-review.googlesource.com/10814 Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
a3b9797baa
commit
2c2770c3d4
4 changed files with 100 additions and 1 deletions
|
|
@ -79,6 +79,13 @@ func (p *Package) writeDefs() {
|
|||
}
|
||||
fmt.Fprintf(fgo2, "func _Cgo_ptr(ptr unsafe.Pointer) unsafe.Pointer { return ptr }\n\n")
|
||||
|
||||
if !*gccgo {
|
||||
fmt.Fprintf(fgo2, "//go:linkname _Cgo_always_false runtime.cgoAlwaysFalse\n")
|
||||
fmt.Fprintf(fgo2, "var _Cgo_always_false bool\n")
|
||||
fmt.Fprintf(fgo2, "//go:linkname _Cgo_use runtime.cgoUse\n")
|
||||
fmt.Fprintf(fgo2, "func _Cgo_use(interface{})\n")
|
||||
}
|
||||
|
||||
typedefNames := make([]string, 0, len(typedef))
|
||||
for name := range typedef {
|
||||
typedefNames = append(typedefNames, name)
|
||||
|
|
@ -428,7 +435,7 @@ func (p *Package) writeDefsFunc(fgo2 io.Writer, n *Name) {
|
|||
return
|
||||
}
|
||||
|
||||
// C wrapper calls into gcc, passing a pointer to the argument frame.
|
||||
// Wrapper calls into gcc, passing a pointer to the argument frame.
|
||||
fmt.Fprintf(fgo2, "//go:cgo_import_static %s\n", cname)
|
||||
fmt.Fprintf(fgo2, "//go:linkname __cgofn_%s %s\n", cname, cname)
|
||||
fmt.Fprintf(fgo2, "var __cgofn_%s byte\n", cname)
|
||||
|
|
@ -463,6 +470,11 @@ func (p *Package) writeDefsFunc(fgo2 io.Writer, n *Name) {
|
|||
if n.AddError {
|
||||
fmt.Fprintf(fgo2, "\tif errno != 0 { r2 = syscall.Errno(errno) }\n")
|
||||
}
|
||||
fmt.Fprintf(fgo2, "\tif _Cgo_always_false {\n")
|
||||
for i := range d.Type.Params.List {
|
||||
fmt.Fprintf(fgo2, "\t\t_Cgo_use(p%d)\n", i)
|
||||
}
|
||||
fmt.Fprintf(fgo2, "\t}\n")
|
||||
fmt.Fprintf(fgo2, "\treturn\n")
|
||||
fmt.Fprintf(fgo2, "}\n")
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue