]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: throw if C.malloc returns nil
authorIan Lance Taylor <iant@golang.org>
Mon, 24 Oct 2016 17:19:04 +0000 (10:19 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 25 Oct 2016 02:38:49 +0000 (02:38 +0000)
Change-Id: If7740ac7b6c4190db5a1ab4100d12cf16dc79c84
Reviewed-on: https://go-review.googlesource.com/31768
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
misc/cgo/errors/malloc.go [new file with mode: 0644]
misc/cgo/errors/test.bash
src/cmd/cgo/out.go

diff --git a/misc/cgo/errors/malloc.go b/misc/cgo/errors/malloc.go
new file mode 100644 (file)
index 0000000..7a69736
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that C.malloc does not return nil.
+
+package main
+
+// #include <stdlib.h>
+import "C"
+
+import (
+       "fmt"
+)
+
+func main() {
+       p := C.malloc(C.size_t(^uintptr(0)))
+       if p == nil {
+               fmt.Println("malloc: C.malloc returned nil")
+               // Just exit normally--the test script expects this
+               // program to crash, so exiting normally indicates failure.
+       }
+}
index cb442507a6470b57be58aa9eaf58ccec3e66dde0..8b892938fcb8ebaca8c88e68bc15b4f4bd52939c 100755 (executable)
@@ -59,5 +59,15 @@ if ! go run ptr.go; then
        exit 1
 fi
 
+# The malloc.go test should crash.
+rm -f malloc.out
+if go run malloc.go >malloc.out 2>&1; then
+       echo "`go run malloc.go` succeeded unexpectedly"
+       cat malloc.out
+       rm -f malloc.out
+       exit 1
+fi
+rm -f malloc.out
+
 rm -rf errs _obj
 exit 0
index 25031c8d48c4ec1186b919eb931282ca37191ab3..95f90920bf1edb5faf08e29423f56654c30ad17c 100644 (file)
@@ -1463,9 +1463,15 @@ const cMallocDefGo = `
 var __cgofn__cgoPREFIX_Cfunc__Cmalloc byte
 var _cgoPREFIX_Cfunc__Cmalloc = unsafe.Pointer(&__cgofn__cgoPREFIX_Cfunc__Cmalloc)
 
+//go:linkname runtime_throw runtime.throw
+func runtime_throw(string)
+
 //go:cgo_unsafe_args
 func _cgo_cmalloc(p0 uint64) (r1 unsafe.Pointer) {
        _cgo_runtime_cgocall(_cgoPREFIX_Cfunc__Cmalloc, uintptr(unsafe.Pointer(&p0)))
+       if r1 == nil {
+               runtime_throw("runtime: C malloc failed")
+       }
        return
 }
 `