mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
golang/xenlight: fix StringList toC conversion
The current implementation of StringList.toC does not correctly account for how libxl_string_list is expected to be laid out in C, which is clear when one looks at libxl_string_list_length in libxl.c. In particular, StringList.toC does not account for the extra memory that should be allocated for the "sentinel" entry. And, when using the "slice trick" to create a slice that can address C memory, the unsafe.Pointer conversion should be on a C.libxl_string_list, not *C.libxl_string_list. Fix these problems by (1) allocating an extra slot in the slice used to address the C memory, and explicity set the last entry to nil so the C memory will be zeroed out, and (2) dereferencing csl in the unsafe.Pointer conversion. Signed-off-by: Nick Rosbrook <rosbrookn@ainfosec.com> Reviewed-by: George Dunlap <george.dunlap@citrix.com>
This commit is contained in:
1 parent
b291ce703b
commit
1422d8db1b
1 file changed
+3
-2
@@ -491,13 +491,14 @@ func (sl *StringList) fromC(csl *C.libxl_string_list) error {
|
||||
|
||||
func (sl StringList) toC(csl *C.libxl_string_list) error {
|
||||
var char *C.char
|
||||
size := len(sl)
|
||||
size := len(sl) + 1
|
||||
*csl = (C.libxl_string_list)(C.malloc(C.ulong(size) * C.ulong(unsafe.Sizeof(char))))
|
||||
clist := (*[1 << 30]*C.char)(unsafe.Pointer(csl))[:size:size]
|
||||
clist := (*[1 << 30]*C.char)(unsafe.Pointer(*csl))[:size:size]
|
||||
|
||||
for i, v := range sl {
|
||||
clist[i] = C.CString(v)
|
||||
}
|
||||
clist[len(clist)-1] = nil
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||