]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: fix C.CString for strings containing null terminators under gccgo
authorPeter Collingbourne <pcc@google.com>
Sun, 27 Apr 2014 05:16:38 +0000 (22:16 -0700)
committerIan Lance Taylor <iant@golang.org>
Sun, 27 Apr 2014 05:16:38 +0000 (22:16 -0700)
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

index 0c32e4ca1551f19b411c5480e4c9a922e35db541..3f04f13611b78fe2df9f7dc864f04e0659e26892 100644 (file)
@@ -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) {