From 8cb916f71d7d397905b9d8a5a0ea5c22871ac867 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Sat, 26 Apr 2014 22:16:38 -0700 Subject: [PATCH] cmd/cgo: fix C.CString for strings containing null terminators under gccgo Previously we used strndup(3) to implement C.CString for gccgo. This is wrong because strndup assumes the string to be null terminated, and stops at the first null terminator. Instead, use malloc and memmove to create a copy of the string, as we do in the gc implementation. LGTM=iant R=iant CC=golang-codereviews https://golang.org/cl/96790047 --- src/cmd/cgo/out.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 0c32e4ca15..3f04f13611 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -1225,7 +1225,10 @@ struct __go_string __go_byte_array_to_string(const void* p, intgo len); struct __go_open_array __go_string_to_byte_array (struct __go_string str); const char *_cgoPREFIX_Cfunc_CString(struct __go_string s) { - return strndup((const char*)s.__data, s.__length); + char *p = malloc(s.__length+1); + memmove(p, s.__data, s.__length); + p[s.__length] = 0; + return p; } struct __go_string _cgoPREFIX_Cfunc_GoString(char *p) { -- 2.50.0