In gengotypes.py, the toC functions only set C string fields when
the Go strings are non-empty. However, to prevent segfaults in some
cases, these fields should always at least be set to nil so that the C
memory is zeroed out.
Update gengotypes.py so that the generated code always sets these fields
to nil first, and then proceeds to check if the Go string is non-empty.
And, commit the new generated code.
Signed-off-by: Nick Rosbrook <rosbrookn@ainfosec.com>
---
tools/golang/xenlight/gengotypes.py | 1 +
tools/golang/xenlight/helpers.gen.go | 160 +++++++++++++++++++++++++++
2 files changed, 161 insertions(+)
diff --git a/tools/golang/xenlight/gengotypes.py b/tools/golang/xenlight/gengotypes.py
index 3e40c3d5dc..e6daa9b92f 100644
--- a/tools/golang/xenlight/gengotypes.py
+++ b/tools/golang/xenlight/gengotypes.py
@@ -527,6 +527,7 @@ def xenlight_golang_convert_to_C(ty = None, outer_name = None,
elif gotypename == 'string':
# Use the cgo helper for converting C strings.
+ s += '{0}.{1} = nil\n'.format(cvarname, cname)
s += 'if {0}.{1} != "" {{\n'.format(govarname,goname)
s += '{0}.{1} = C.CString({2}.{3})}}\n'.format(cvarname,cname,
govarname,goname)
diff --git a/tools/golang/xenlight/helpers.gen.go b/tools/golang/xenlight/helpers.gen.go
index b454b12d52..5222898fb8 100644
--- a/tools/golang/xenlight/helpers.gen.go
+++ b/tools/golang/xenlight/helpers.gen.go
@@ -154,8 +154,10 @@ C.libxl_vnc_info_dispose(xc)}
if err := x.Enable.toC(&xc.enable); err != nil {
return fmt.Errorf("converting field Enable: %v", err)
}
+xc.listen = nil
if x.Listen != "" {
xc.listen = C.CString(x.Listen)}
+xc.passwd = nil
if x.Passwd != "" {
xc.passwd = C.CString(x.Passwd)}
xc.display = C.int(x.Display)
@@ -216,11 +218,13 @@ return fmt.Errorf("converting field Enable: %v", err)
}
xc.port = C.int(x.Port)
xc.tls_port = C.int(x.TlsPort)
+xc.host = nil
if x.Host != "" {
xc.host = C.CString(x.Host)}
if err := x.DisableTicketing.toC(&xc.disable_ticketing); err != nil {
return fmt.Errorf("converting field DisableTicketing: %v", err)
}
+xc.passwd = nil
if x.Passwd != "" {
xc.passwd = C.CString(x.Passwd)}
if err := x.AgentMouse.toC(&xc.agent_mouse); err != nil {
@@ -233,8 +237,10 @@ if err := x.ClipboardSharing.toC(&xc.clipboard_sharing); err != nil {
return fmt.Errorf("converting field ClipboardSharing: %v", err)
}
xc.usbredirection = C.int(x.Usbredirection)
+xc.image_compression = nil
if x.ImageCompression != "" {
xc.image_compression = C.CString(x.ImageCompression)}
+xc.streaming_video = nil
if x.StreamingVideo != "" {
xc.streaming_video = C.CString(x.StreamingVideo)}
@@ -278,8 +284,10 @@ return fmt.Errorf("converting field Enable: %v", err)
if err := x.Opengl.toC(&xc.opengl); err != nil {
return fmt.Errorf("converting field Opengl: %v", err)
}
+xc.display = nil
if x.Display != "" {
xc.display = C.CString(x.Display)}
+xc.xauthority = nil
if x.Xauthority != "" {
xc.xauthority = C.CString(x.Xauthority)}
@@ -337,6 +345,7 @@ return fmt.Errorf("converting field Uuid: %v", err)
}
xc.domid = C.libxl_domid(x.Domid)
xc.ssidref = C.uint32_t(x.Ssidref)
+xc.ssid_label = nil
if x.SsidLabel != "" {
xc.ssid_label = C.CString(x.SsidLabel)}
xc.running = C.bool(x.Running)
@@ -391,6 +400,7 @@ C.libxl_cpupoolinfo_dispose(xc)}
}()
xc.poolid = C.uint32_t(x.Poolid)
+xc.pool_name = nil
if x.PoolName != "" {
xc.pool_name = C.CString(x.PoolName)}
xc.sched = C.libxl_scheduler(x.Sched)
@@ -458,9 +468,11 @@ if err != nil{
C.libxl_channelinfo_dispose(xc)}
}()
+xc.backend = nil
if x.Backend != "" {
xc.backend = C.CString(x.Backend)}
xc.backend_id = C.uint32_t(x.BackendId)
+xc.frontend = nil
if x.Frontend != "" {
xc.frontend = C.CString(x.Frontend)}
xc.frontend_id = C.uint32_t(x.FrontendId)
@@ -478,6 +490,7 @@ if !ok {
return errors.New("wrong type for union key connection")
}
var pty C.libxl_channelinfo_connection_union_pty
+pty.path = nil
if tmp.Path != "" {
pty.path = C.CString(tmp.Path)}
ptyBytes := C.GoBytes(unsafe.Pointer(&pty),C.sizeof_libxl_channelinfo_connection_union_pty)
@@ -563,24 +576,33 @@ C.libxl_version_info_dispose(xc)}
xc.xen_version_major = C.int(x.XenVersionMajor)
xc.xen_version_minor = C.int(x.XenVersionMinor)
+xc.xen_version_extra = nil
if x.XenVersionExtra != "" {
xc.xen_version_extra = C.CString(x.XenVersionExtra)}
+xc.compiler = nil
if x.Compiler != "" {
xc.compiler = C.CString(x.Compiler)}
+xc.compile_by = nil
if x.CompileBy != "" {
xc.compile_by = C.CString(x.CompileBy)}
+xc.compile_domain = nil
if x.CompileDomain != "" {
xc.compile_domain = C.CString(x.CompileDomain)}
+xc.compile_date = nil
if x.CompileDate != "" {
xc.compile_date = C.CString(x.CompileDate)}
+xc.capabilities = nil
if x.Capabilities != "" {
xc.capabilities = C.CString(x.Capabilities)}
+xc.changeset = nil
if x.Changeset != "" {
xc.changeset = C.CString(x.Changeset)}
xc.virt_start = C.uint64_t(x.VirtStart)
xc.pagesize = C.int(x.Pagesize)
+xc.commandline = nil
if x.Commandline != "" {
xc.commandline = C.CString(x.Commandline)}
+xc.build_id = nil
if x.BuildId != "" {
xc.build_id = C.CString(x.BuildId)}
@@ -650,8 +672,10 @@ if err := x.Oos.toC(&xc.oos); err != nil {
return fmt.Errorf("converting field Oos: %v", err)
}
xc.ssidref = C.uint32_t(x.Ssidref)
+xc.ssid_label = nil
if x.SsidLabel != "" {
xc.ssid_label = C.CString(x.SsidLabel)}
+xc.name = nil
if x.Name != "" {
xc.name = C.CString(x.Name)}
xc.domid = C.libxl_domid(x.Domid)
@@ -665,6 +689,7 @@ if err := x.Platformdata.toC(&xc.platformdata); err != nil {
return fmt.Errorf("converting field Platformdata: %v", err)
}
xc.poolid = C.uint32_t(x.Poolid)
+xc.pool_name = nil
if x.PoolName != "" {
xc.pool_name = C.CString(x.PoolName)}
if err := x.RunHotplugScripts.toC(&xc.run_hotplug_scripts); err != nil {
@@ -712,6 +737,7 @@ C.libxl_domain_restore_params_dispose(xc)}
xc.checkpointed_stream = C.int(x.CheckpointedStream)
xc.stream_version = C.uint32_t(x.StreamVersion)
+xc.colo_proxy_script = nil
if x.ColoProxyScript != "" {
xc.colo_proxy_script = C.CString(x.ColoProxyScript)}
if err := x.UserspaceColoProxy.toC(&xc.userspace_colo_proxy); err != nil {
@@ -1312,6 +1338,7 @@ xc.shadow_memkb = C.uint64_t(x.ShadowMemkb)
xc.iommu_memkb = C.uint64_t(x.IommuMemkb)
xc.rtc_timeoffset = C.uint32_t(x.RtcTimeoffset)
xc.exec_ssidref = C.uint32_t(x.ExecSsidref)
+xc.exec_ssid_label = nil
if x.ExecSsidLabel != "" {
xc.exec_ssid_label = C.CString(x.ExecSsidLabel)}
if err := x.Localtime.toC(&xc.localtime); err != nil {
@@ -1323,6 +1350,7 @@ return fmt.Errorf("converting field DisableMigrate: %v", err)
if err := x.Cpuid.toC(&xc.cpuid); err != nil {
return fmt.Errorf("converting field Cpuid: %v", err)
}
+xc.blkdev_start = nil
if x.BlkdevStart != "" {
xc.blkdev_start = C.CString(x.BlkdevStart)}
if numVnumaNodes := len(x.VnumaNodes); numVnumaNodes > 0 {
@@ -1342,15 +1370,20 @@ if err := x.DeviceModelStubdomain.toC(&xc.device_model_stubdomain); err != nil {
return fmt.Errorf("converting field DeviceModelStubdomain: %v", err)
}
xc.stubdomain_memkb = C.uint64_t(x.StubdomainMemkb)
+xc.stubdomain_kernel = nil
if x.StubdomainKernel != "" {
xc.stubdomain_kernel = C.CString(x.StubdomainKernel)}
+xc.stubdomain_ramdisk = nil
if x.StubdomainRamdisk != "" {
xc.stubdomain_ramdisk = C.CString(x.StubdomainRamdisk)}
+xc.device_model = nil
if x.DeviceModel != "" {
xc.device_model = C.CString(x.DeviceModel)}
xc.device_model_ssidref = C.uint32_t(x.DeviceModelSsidref)
+xc.device_model_ssid_label = nil
if x.DeviceModelSsidLabel != "" {
xc.device_model_ssid_label = C.CString(x.DeviceModelSsidLabel)}
+xc.device_model_user = nil
if x.DeviceModelUser != "" {
xc.device_model_user = C.CString(x.DeviceModelUser)}
if err := x.Extra.toC(&xc.extra); err != nil {
@@ -1397,17 +1430,22 @@ if err := x.ClaimMode.toC(&xc.claim_mode); err != nil {
return fmt.Errorf("converting field ClaimMode: %v", err)
}
xc.event_channels = C.uint32_t(x.EventChannels)
+xc.kernel = nil
if x.Kernel != "" {
xc.kernel = C.CString(x.Kernel)}
+xc.cmdline = nil
if x.Cmdline != "" {
xc.cmdline = C.CString(x.Cmdline)}
+xc.ramdisk = nil
if x.Ramdisk != "" {
xc.ramdisk = C.CString(x.Ramdisk)}
+xc.device_tree = nil
if x.DeviceTree != "" {
xc.device_tree = C.CString(x.DeviceTree)}
if err := x.Acpi.toC(&xc.acpi); err != nil {
return fmt.Errorf("converting field Acpi: %v", err)
}
+xc.bootloader = nil
if x.Bootloader != "" {
xc.bootloader = C.CString(x.Bootloader)}
if err := x.BootloaderArgs.toC(&xc.bootloader_args); err != nil {
@@ -1432,6 +1470,7 @@ if !ok {
return errors.New("wrong type for union key type")
}
var hvm C.libxl_domain_build_info_type_union_hvm
+hvm.firmware = nil
if tmp.Firmware != "" {
hvm.firmware = C.CString(tmp.Firmware)}
hvm.bios = C.libxl_bios_type(tmp.Bios)
@@ -1465,6 +1504,7 @@ return fmt.Errorf("converting field ViridianEnable: %v", err)
if err := tmp.ViridianDisable.toC(&hvm.viridian_disable); err != nil {
return fmt.Errorf("converting field ViridianDisable: %v", err)
}
+hvm.timeoffset = nil
if tmp.Timeoffset != "" {
hvm.timeoffset = C.CString(tmp.Timeoffset)}
if err := tmp.Hpet.toC(&hvm.hpet); err != nil {
@@ -1481,10 +1521,13 @@ return fmt.Errorf("converting field NestedHvm: %v", err)
if err := tmp.Altp2M.toC(&hvm.altp2m); err != nil {
return fmt.Errorf("converting field Altp2M: %v", err)
}
+hvm.system_firmware = nil
if tmp.SystemFirmware != "" {
hvm.system_firmware = C.CString(tmp.SystemFirmware)}
+hvm.smbios_firmware = nil
if tmp.SmbiosFirmware != "" {
hvm.smbios_firmware = C.CString(tmp.SmbiosFirmware)}
+hvm.acpi_firmware = nil
if tmp.AcpiFirmware != "" {
hvm.acpi_firmware = C.CString(tmp.AcpiFirmware)}
hvm.hdtype = C.libxl_hdtype(tmp.Hdtype)
@@ -1497,6 +1540,7 @@ return fmt.Errorf("converting field Vga: %v", err)
if err := tmp.Vnc.toC(&hvm.vnc); err != nil {
return fmt.Errorf("converting field Vnc: %v", err)
}
+hvm.keymap = nil
if tmp.Keymap != "" {
hvm.keymap = C.CString(tmp.Keymap)}
if err := tmp.Sdl.toC(&hvm.sdl); err != nil {
@@ -1509,19 +1553,23 @@ if err := tmp.GfxPassthru.toC(&hvm.gfx_passthru); err != nil {
return fmt.Errorf("converting field GfxPassthru: %v", err)
}
hvm.gfx_passthru_kind = C.libxl_gfx_passthru_kind(tmp.GfxPassthruKind)
+hvm.serial = nil
if tmp.Serial != "" {
hvm.serial = C.CString(tmp.Serial)}
+hvm.boot = nil
if tmp.Boot != "" {
hvm.boot = C.CString(tmp.Boot)}
if err := tmp.Usb.toC(&hvm.usb); err != nil {
return fmt.Errorf("converting field Usb: %v", err)
}
hvm.usbversion = C.int(tmp.Usbversion)
+hvm.usbdevice = nil
if tmp.Usbdevice != "" {
hvm.usbdevice = C.CString(tmp.Usbdevice)}
if err := tmp.VkbDevice.toC(&hvm.vkb_device); err != nil {
return fmt.Errorf("converting field VkbDevice: %v", err)
}
+hvm.soundhw = nil
if tmp.Soundhw != "" {
hvm.soundhw = C.CString(tmp.Soundhw)}
if err := tmp.XenPlatformPci.toC(&hvm.xen_platform_pci); err != nil {
@@ -1550,18 +1598,23 @@ if !ok {
return errors.New("wrong type for union key type")
}
var pv C.libxl_domain_build_info_type_union_pv
+pv.kernel = nil
if tmp.Kernel != "" {
pv.kernel = C.CString(tmp.Kernel)}
pv.slack_memkb = C.uint64_t(tmp.SlackMemkb)
+pv.bootloader = nil
if tmp.Bootloader != "" {
pv.bootloader = C.CString(tmp.Bootloader)}
if err := tmp.BootloaderArgs.toC(&pv.bootloader_args); err != nil {
return fmt.Errorf("converting field BootloaderArgs: %v", err)
}
+pv.cmdline = nil
if tmp.Cmdline != "" {
pv.cmdline = C.CString(tmp.Cmdline)}
+pv.ramdisk = nil
if tmp.Ramdisk != "" {
pv.ramdisk = C.CString(tmp.Ramdisk)}
+pv.features = nil
if tmp.Features != "" {
pv.features = C.CString(tmp.Features)}
if err := tmp.E820Host.toC(&pv.e820_host); err != nil {
@@ -1578,10 +1631,13 @@ var pvh C.libxl_domain_build_info_type_union_pvh
if err := tmp.Pvshim.toC(&pvh.pvshim); err != nil {
return fmt.Errorf("converting field Pvshim: %v", err)
}
+pvh.pvshim_path = nil
if tmp.PvshimPath != "" {
pvh.pvshim_path = C.CString(tmp.PvshimPath)}
+pvh.pvshim_cmdline = nil
if tmp.PvshimCmdline != "" {
pvh.pvshim_cmdline = C.CString(tmp.PvshimCmdline)}
+pvh.pvshim_extra = nil
if tmp.PvshimExtra != "" {
pvh.pvshim_extra = C.CString(tmp.PvshimExtra)}
pvhBytes := C.GoBytes(unsafe.Pointer(&pvh),C.sizeof_libxl_domain_build_info_type_union_pvh)
@@ -1635,6 +1691,7 @@ C.libxl_device_vfb_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
xc.devid = C.libxl_devid(x.Devid)
@@ -1644,6 +1701,7 @@ return fmt.Errorf("converting field Vnc: %v", err)
if err := x.Sdl.toC(&xc.sdl); err != nil {
return fmt.Errorf("converting field Sdl: %v", err)
}
+xc.keymap = nil
if x.Keymap != "" {
xc.keymap = C.CString(x.Keymap)}
@@ -1689,10 +1747,12 @@ C.libxl_device_vkb_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
xc.devid = C.libxl_devid(x.Devid)
xc.backend_type = C.libxl_vkb_backend(x.BackendType)
+xc.unique_id = nil
if x.UniqueId != "" {
xc.unique_id = C.CString(x.UniqueId)}
xc.feature_disable_keyboard = C.bool(x.FeatureDisableKeyboard)
@@ -1758,14 +1818,18 @@ C.libxl_device_disk_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
+xc.pdev_path = nil
if x.PdevPath != "" {
xc.pdev_path = C.CString(x.PdevPath)}
+xc.vdev = nil
if x.Vdev != "" {
xc.vdev = C.CString(x.Vdev)}
xc.backend = C.libxl_disk_backend(x.Backend)
xc.format = C.libxl_disk_format(x.Format)
+xc.script = nil
if x.Script != "" {
xc.script = C.CString(x.Script)}
xc.removable = C.int(x.Removable)
@@ -1781,13 +1845,17 @@ return fmt.Errorf("converting field ColoEnable: %v", err)
if err := x.ColoRestoreEnable.toC(&xc.colo_restore_enable); err != nil {
return fmt.Errorf("converting field ColoRestoreEnable: %v", err)
}
+xc.colo_host = nil
if x.ColoHost != "" {
xc.colo_host = C.CString(x.ColoHost)}
xc.colo_port = C.int(x.ColoPort)
+xc.colo_export = nil
if x.ColoExport != "" {
xc.colo_export = C.CString(x.ColoExport)}
+xc.active_disk = nil
if x.ActiveDisk != "" {
xc.active_disk = C.CString(x.ActiveDisk)}
+xc.hidden_disk = nil
if x.HiddenDisk != "" {
xc.hidden_disk = C.CString(x.HiddenDisk)}
@@ -1883,124 +1951,180 @@ C.libxl_device_nic_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
xc.devid = C.libxl_devid(x.Devid)
xc.mtu = C.int(x.Mtu)
+xc.model = nil
if x.Model != "" {
xc.model = C.CString(x.Model)}
if err := x.Mac.toC(&xc.mac); err != nil {
return fmt.Errorf("converting field Mac: %v", err)
}
+xc.ip = nil
if x.Ip != "" {
xc.ip = C.CString(x.Ip)}
+xc.bridge = nil
if x.Bridge != "" {
xc.bridge = C.CString(x.Bridge)}
+xc.ifname = nil
if x.Ifname != "" {
xc.ifname = C.CString(x.Ifname)}
+xc.script = nil
if x.Script != "" {
xc.script = C.CString(x.Script)}
xc.nictype = C.libxl_nic_type(x.Nictype)
xc.rate_bytes_per_interval = C.uint64_t(x.RateBytesPerInterval)
xc.rate_interval_usecs = C.uint32_t(x.RateIntervalUsecs)
+xc.gatewaydev = nil
if x.Gatewaydev != "" {
xc.gatewaydev = C.CString(x.Gatewaydev)}
+xc.coloft_forwarddev = nil
if x.ColoftForwarddev != "" {
xc.coloft_forwarddev = C.CString(x.ColoftForwarddev)}
+xc.colo_sock_mirror_id = nil
if x.ColoSockMirrorId != "" {
xc.colo_sock_mirror_id = C.CString(x.ColoSockMirrorId)}
+xc.colo_sock_mirror_ip = nil
if x.ColoSockMirrorIp != "" {
xc.colo_sock_mirror_ip = C.CString(x.ColoSockMirrorIp)}
+xc.colo_sock_mirror_port = nil
if x.ColoSockMirrorPort != "" {
xc.colo_sock_mirror_port = C.CString(x.ColoSockMirrorPort)}
+xc.colo_sock_compare_pri_in_id = nil
if x.ColoSockComparePriInId != "" {
xc.colo_sock_compare_pri_in_id = C.CString(x.ColoSockComparePriInId)}
+xc.colo_sock_compare_pri_in_ip = nil
if x.ColoSockComparePriInIp != "" {
xc.colo_sock_compare_pri_in_ip = C.CString(x.ColoSockComparePriInIp)}
+xc.colo_sock_compare_pri_in_port = nil
if x.ColoSockComparePriInPort != "" {
xc.colo_sock_compare_pri_in_port = C.CString(x.ColoSockComparePriInPort)}
+xc.colo_sock_compare_sec_in_id = nil
if x.ColoSockCompareSecInId != "" {
xc.colo_sock_compare_sec_in_id = C.CString(x.ColoSockCompareSecInId)}
+xc.colo_sock_compare_sec_in_ip = nil
if x.ColoSockCompareSecInIp != "" {
xc.colo_sock_compare_sec_in_ip = C.CString(x.ColoSockCompareSecInIp)}
+xc.colo_sock_compare_sec_in_port = nil
if x.ColoSockCompareSecInPort != "" {
xc.colo_sock_compare_sec_in_port = C.CString(x.ColoSockCompareSecInPort)}
+xc.colo_sock_compare_notify_id = nil
if x.ColoSockCompareNotifyId != "" {
xc.colo_sock_compare_notify_id = C.CString(x.ColoSockCompareNotifyId)}
+xc.colo_sock_compare_notify_ip = nil
if x.ColoSockCompareNotifyIp != "" {
xc.colo_sock_compare_notify_ip = C.CString(x.ColoSockCompareNotifyIp)}
+xc.colo_sock_compare_notify_port = nil
if x.ColoSockCompareNotifyPort != "" {
xc.colo_sock_compare_notify_port = C.CString(x.ColoSockCompareNotifyPort)}
+xc.colo_sock_redirector0_id = nil
if x.ColoSockRedirector0Id != "" {
xc.colo_sock_redirector0_id = C.CString(x.ColoSockRedirector0Id)}
+xc.colo_sock_redirector0_ip = nil
if x.ColoSockRedirector0Ip != "" {
xc.colo_sock_redirector0_ip = C.CString(x.ColoSockRedirector0Ip)}
+xc.colo_sock_redirector0_port = nil
if x.ColoSockRedirector0Port != "" {
xc.colo_sock_redirector0_port = C.CString(x.ColoSockRedirector0Port)}
+xc.colo_sock_redirector1_id = nil
if x.ColoSockRedirector1Id != "" {
xc.colo_sock_redirector1_id = C.CString(x.ColoSockRedirector1Id)}
+xc.colo_sock_redirector1_ip = nil
if x.ColoSockRedirector1Ip != "" {
xc.colo_sock_redirector1_ip = C.CString(x.ColoSockRedirector1Ip)}
+xc.colo_sock_redirector1_port = nil
if x.ColoSockRedirector1Port != "" {
xc.colo_sock_redirector1_port = C.CString(x.ColoSockRedirector1Port)}
+xc.colo_sock_redirector2_id = nil
if x.ColoSockRedirector2Id != "" {
xc.colo_sock_redirector2_id = C.CString(x.ColoSockRedirector2Id)}
+xc.colo_sock_redirector2_ip = nil
if x.ColoSockRedirector2Ip != "" {
xc.colo_sock_redirector2_ip = C.CString(x.ColoSockRedirector2Ip)}
+xc.colo_sock_redirector2_port = nil
if x.ColoSockRedirector2Port != "" {
xc.colo_sock_redirector2_port = C.CString(x.ColoSockRedirector2Port)}
+xc.colo_filter_mirror_queue = nil
if x.ColoFilterMirrorQueue != "" {
xc.colo_filter_mirror_queue = C.CString(x.ColoFilterMirrorQueue)}
+xc.colo_filter_mirror_outdev = nil
if x.ColoFilterMirrorOutdev != "" {
xc.colo_filter_mirror_outdev = C.CString(x.ColoFilterMirrorOutdev)}
+xc.colo_filter_redirector0_queue = nil
if x.ColoFilterRedirector0Queue != "" {
xc.colo_filter_redirector0_queue = C.CString(x.ColoFilterRedirector0Queue)}
+xc.colo_filter_redirector0_indev = nil
if x.ColoFilterRedirector0Indev != "" {
xc.colo_filter_redirector0_indev = C.CString(x.ColoFilterRedirector0Indev)}
+xc.colo_filter_redirector0_outdev = nil
if x.ColoFilterRedirector0Outdev != "" {
xc.colo_filter_redirector0_outdev = C.CString(x.ColoFilterRedirector0Outdev)}
+xc.colo_filter_redirector1_queue = nil
if x.ColoFilterRedirector1Queue != "" {
xc.colo_filter_redirector1_queue = C.CString(x.ColoFilterRedirector1Queue)}
+xc.colo_filter_redirector1_indev = nil
if x.ColoFilterRedirector1Indev != "" {
xc.colo_filter_redirector1_indev = C.CString(x.ColoFilterRedirector1Indev)}
+xc.colo_filter_redirector1_outdev = nil
if x.ColoFilterRedirector1Outdev != "" {
xc.colo_filter_redirector1_outdev = C.CString(x.ColoFilterRedirector1Outdev)}
+xc.colo_compare_pri_in = nil
if x.ColoComparePriIn != "" {
xc.colo_compare_pri_in = C.CString(x.ColoComparePriIn)}
+xc.colo_compare_sec_in = nil
if x.ColoCompareSecIn != "" {
xc.colo_compare_sec_in = C.CString(x.ColoCompareSecIn)}
+xc.colo_compare_out = nil
if x.ColoCompareOut != "" {
xc.colo_compare_out = C.CString(x.ColoCompareOut)}
+xc.colo_compare_notify_dev = nil
if x.ColoCompareNotifyDev != "" {
xc.colo_compare_notify_dev = C.CString(x.ColoCompareNotifyDev)}
+xc.colo_sock_sec_redirector0_id = nil
if x.ColoSockSecRedirector0Id != "" {
xc.colo_sock_sec_redirector0_id = C.CString(x.ColoSockSecRedirector0Id)}
+xc.colo_sock_sec_redirector0_ip = nil
if x.ColoSockSecRedirector0Ip != "" {
xc.colo_sock_sec_redirector0_ip = C.CString(x.ColoSockSecRedirector0Ip)}
+xc.colo_sock_sec_redirector0_port = nil
if x.ColoSockSecRedirector0Port != "" {
xc.colo_sock_sec_redirector0_port = C.CString(x.ColoSockSecRedirector0Port)}
+xc.colo_sock_sec_redirector1_id = nil
if x.ColoSockSecRedirector1Id != "" {
xc.colo_sock_sec_redirector1_id = C.CString(x.ColoSockSecRedirector1Id)}
+xc.colo_sock_sec_redirector1_ip = nil
if x.ColoSockSecRedirector1Ip != "" {
xc.colo_sock_sec_redirector1_ip = C.CString(x.ColoSockSecRedirector1Ip)}
+xc.colo_sock_sec_redirector1_port = nil
if x.ColoSockSecRedirector1Port != "" {
xc.colo_sock_sec_redirector1_port = C.CString(x.ColoSockSecRedirector1Port)}
+xc.colo_filter_sec_redirector0_queue = nil
if x.ColoFilterSecRedirector0Queue != "" {
xc.colo_filter_sec_redirector0_queue = C.CString(x.ColoFilterSecRedirector0Queue)}
+xc.colo_filter_sec_redirector0_indev = nil
if x.ColoFilterSecRedirector0Indev != "" {
xc.colo_filter_sec_redirector0_indev = C.CString(x.ColoFilterSecRedirector0Indev)}
+xc.colo_filter_sec_redirector0_outdev = nil
if x.ColoFilterSecRedirector0Outdev != "" {
xc.colo_filter_sec_redirector0_outdev = C.CString(x.ColoFilterSecRedirector0Outdev)}
+xc.colo_filter_sec_redirector1_queue = nil
if x.ColoFilterSecRedirector1Queue != "" {
xc.colo_filter_sec_redirector1_queue = C.CString(x.ColoFilterSecRedirector1Queue)}
+xc.colo_filter_sec_redirector1_indev = nil
if x.ColoFilterSecRedirector1Indev != "" {
xc.colo_filter_sec_redirector1_indev = C.CString(x.ColoFilterSecRedirector1Indev)}
+xc.colo_filter_sec_redirector1_outdev = nil
if x.ColoFilterSecRedirector1Outdev != "" {
xc.colo_filter_sec_redirector1_outdev = C.CString(x.ColoFilterSecRedirector1Outdev)}
+xc.colo_filter_sec_rewriter0_queue = nil
if x.ColoFilterSecRewriter0Queue != "" {
xc.colo_filter_sec_rewriter0_queue = C.CString(x.ColoFilterSecRewriter0Queue)}
+xc.colo_checkpoint_host = nil
if x.ColoCheckpointHost != "" {
xc.colo_checkpoint_host = C.CString(x.ColoCheckpointHost)}
+xc.colo_checkpoint_port = nil
if x.ColoCheckpointPort != "" {
xc.colo_checkpoint_port = C.CString(x.ColoCheckpointPort)}
@@ -2053,6 +2177,7 @@ xc.power_mgmt = C.bool(x.PowerMgmt)
xc.permissive = C.bool(x.Permissive)
xc.seize = C.bool(x.Seize)
xc.rdm_policy = C.libxl_rdm_reserve_policy(x.RdmPolicy)
+xc.name = nil
if x.Name != "" {
xc.name = C.CString(x.Name)}
@@ -2126,6 +2251,7 @@ xc.devid = C.libxl_devid(x.Devid)
xc.version = C.int(x.Version)
xc.ports = C.int(x.Ports)
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
@@ -2223,6 +2349,7 @@ if err != nil{
C.libxl_device_dtdev_dispose(xc)}
}()
+xc.path = nil
if x.Path != "" {
xc.path = C.CString(x.Path)}
@@ -2259,6 +2386,7 @@ C.libxl_device_vtpm_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
xc.devid = C.libxl_devid(x.Devid)
@@ -2299,12 +2427,16 @@ C.libxl_device_p9_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
+xc.tag = nil
if x.Tag != "" {
xc.tag = C.CString(x.Tag)}
+xc.path = nil
if x.Path != "" {
xc.path = C.CString(x.Path)}
+xc.security_model = nil
if x.SecurityModel != "" {
xc.security_model = C.CString(x.SecurityModel)}
xc.devid = C.libxl_devid(x.Devid)
@@ -2339,6 +2471,7 @@ C.libxl_device_pvcallsif_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
xc.devid = C.libxl_devid(x.Devid)
@@ -2399,9 +2532,11 @@ C.libxl_device_channel_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
xc.devid = C.libxl_devid(x.Devid)
+xc.name = nil
if x.Name != "" {
xc.name = C.CString(x.Name)}
xc.connection = C.libxl_channel_connection(x.Connection)
@@ -2416,6 +2551,7 @@ if !ok {
return errors.New("wrong type for union key connection")
}
var socket C.libxl_device_channel_connection_union_socket
+socket.path = nil
if tmp.Path != "" {
socket.path = C.CString(tmp.Path)}
socketBytes := C.GoBytes(unsafe.Pointer(&socket),C.sizeof_libxl_device_channel_connection_union_socket)
@@ -2452,6 +2588,7 @@ if err != nil{
C.libxl_connector_param_dispose(xc)}
}()
+xc.unique_id = nil
if x.UniqueId != "" {
xc.unique_id = C.CString(x.UniqueId)}
xc.width = C.uint32_t(x.Width)
@@ -2497,6 +2634,7 @@ C.libxl_device_vdispl_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
xc.devid = C.libxl_devid(x.Devid)
@@ -2608,6 +2746,7 @@ if err != nil{
C.libxl_vsnd_stream_dispose(xc)}
}()
+xc.unique_id = nil
if x.UniqueId != "" {
xc.unique_id = C.CString(x.UniqueId)}
xc._type = C.libxl_vsnd_stream_type(x.Type)
@@ -2654,6 +2793,7 @@ if err != nil{
C.libxl_vsnd_pcm_dispose(xc)}
}()
+xc.name = nil
if x.Name != "" {
xc.name = C.CString(x.Name)}
if err := x.Params.toC(&xc.params); err != nil {
@@ -2714,11 +2854,14 @@ C.libxl_device_vsnd_dispose(xc)}
}()
xc.backend_domid = C.libxl_domid(x.BackendDomid)
+xc.backend_domname = nil
if x.BackendDomname != "" {
xc.backend_domname = C.CString(x.BackendDomname)}
xc.devid = C.libxl_devid(x.Devid)
+xc.short_name = nil
if x.ShortName != "" {
xc.short_name = C.CString(x.ShortName)}
+xc.long_name = nil
if x.LongName != "" {
xc.long_name = C.CString(x.LongName)}
if err := x.Params.toC(&xc.params); err != nil {
@@ -3103,9 +3246,11 @@ if err != nil{
C.libxl_diskinfo_dispose(xc)}
}()
+xc.backend = nil
if x.Backend != "" {
xc.backend = C.CString(x.Backend)}
xc.backend_id = C.uint32_t(x.BackendId)
+xc.frontend = nil
if x.Frontend != "" {
xc.frontend = C.CString(x.Frontend)}
xc.frontend_id = C.uint32_t(x.FrontendId)
@@ -3149,9 +3294,11 @@ if err != nil{
C.libxl_nicinfo_dispose(xc)}
}()
+xc.backend = nil
if x.Backend != "" {
xc.backend = C.CString(x.Backend)}
xc.backend_id = C.uint32_t(x.BackendId)
+xc.frontend = nil
if x.Frontend != "" {
xc.frontend = C.CString(x.Frontend)}
xc.frontend_id = C.uint32_t(x.FrontendId)
@@ -3198,9 +3345,11 @@ if err != nil{
C.libxl_vtpminfo_dispose(xc)}
}()
+xc.backend = nil
if x.Backend != "" {
xc.backend = C.CString(x.Backend)}
xc.backend_id = C.uint32_t(x.BackendId)
+xc.frontend = nil
if x.Frontend != "" {
xc.frontend = C.CString(x.Frontend)}
xc.frontend_id = C.uint32_t(x.FrontendId)
@@ -3254,9 +3403,11 @@ xc._type = C.libxl_usbctrl_type(x.Type)
xc.devid = C.libxl_devid(x.Devid)
xc.version = C.int(x.Version)
xc.ports = C.int(x.Ports)
+xc.backend = nil
if x.Backend != "" {
xc.backend = C.CString(x.Backend)}
xc.backend_id = C.uint32_t(x.BackendId)
+xc.frontend = nil
if x.Frontend != "" {
xc.frontend = C.CString(x.Frontend)}
xc.frontend_id = C.uint32_t(x.FrontendId)
@@ -3422,6 +3573,7 @@ if err != nil{
C.libxl_connectorinfo_dispose(xc)}
}()
+xc.unique_id = nil
if x.UniqueId != "" {
xc.unique_id = C.CString(x.UniqueId)}
xc.width = C.uint32_t(x.Width)
@@ -3473,9 +3625,11 @@ if err != nil{
C.libxl_vdisplinfo_dispose(xc)}
}()
+xc.backend = nil
if x.Backend != "" {
xc.backend = C.CString(x.Backend)}
xc.backend_id = C.uint32_t(x.BackendId)
+xc.frontend = nil
if x.Frontend != "" {
xc.frontend = C.CString(x.Frontend)}
xc.frontend_id = C.uint32_t(x.FrontendId)
@@ -3611,9 +3765,11 @@ if err != nil{
C.libxl_vsndinfo_dispose(xc)}
}()
+xc.backend = nil
if x.Backend != "" {
xc.backend = C.CString(x.Backend)}
xc.backend_id = C.uint32_t(x.BackendId)
+xc.frontend = nil
if x.Frontend != "" {
xc.frontend = C.CString(x.Frontend)}
xc.frontend_id = C.uint32_t(x.FrontendId)
@@ -3664,9 +3820,11 @@ if err != nil{
C.libxl_vkbinfo_dispose(xc)}
}()
+xc.backend = nil
if x.Backend != "" {
xc.backend = C.CString(x.Backend)}
xc.backend_id = C.uint32_t(x.BackendId)
+xc.frontend = nil
if x.Frontend != "" {
xc.frontend = C.CString(x.Frontend)}
xc.frontend_id = C.uint32_t(x.FrontendId)
@@ -3902,6 +4060,7 @@ return fmt.Errorf("converting field Compression: %v", err)
if err := x.Netbuf.toC(&xc.netbuf); err != nil {
return fmt.Errorf("converting field Netbuf: %v", err)
}
+xc.netbufscript = nil
if x.Netbufscript != "" {
xc.netbufscript = C.CString(x.Netbufscript)}
if err := x.Diskbuf.toC(&xc.diskbuf); err != nil {
@@ -4035,6 +4194,7 @@ if !ok {
return errors.New("wrong type for union key type")
}
var disk_eject C.libxl_event_type_union_disk_eject
+disk_eject.vdev = nil
if tmp.Vdev != "" {
disk_eject.vdev = C.CString(tmp.Vdev)}
if err := tmp.Disk.toC(&disk_eject.disk); err != nil {
--
2.17.1
> On May 24, 2021, at 9:36 PM, Nick Rosbrook <rosbrookn@gmail.com> wrote:
>
> In gengotypes.py, the toC functions only set C string fields when
> the Go strings are non-empty. However, to prevent segfaults in some
> cases, these fields should always at least be set to nil so that the C
> memory is zeroed out.
>
> Update gengotypes.py so that the generated code always sets these fields
> to nil first, and then proceeds to check if the Go string is non-empty.
> And, commit the new generated code.
>
> Signed-off-by: Nick Rosbrook <rosbrookn@ainfosec.com>
So wait — if you do
var foo C.typename
Then golang won’t automatically zero out `foo`?
That seems like a bug really; but assuming this fixes real behavior you’ve encountered:
Reviewed-by: George Dunlap <george.dunlap@citrix.com>
> ---
> tools/golang/xenlight/gengotypes.py | 1 +
> tools/golang/xenlight/helpers.gen.go | 160 +++++++++++++++++++++++++++
> 2 files changed, 161 insertions(+)
>
> diff --git a/tools/golang/xenlight/gengotypes.py b/tools/golang/xenlight/gengotypes.py
> index 3e40c3d5dc..e6daa9b92f 100644
> --- a/tools/golang/xenlight/gengotypes.py
> +++ b/tools/golang/xenlight/gengotypes.py
> @@ -527,6 +527,7 @@ def xenlight_golang_convert_to_C(ty = None, outer_name = None,
>
> elif gotypename == 'string':
> # Use the cgo helper for converting C strings.
> + s += '{0}.{1} = nil\n'.format(cvarname, cname)
> s += 'if {0}.{1} != "" {{\n'.format(govarname,goname)
> s += '{0}.{1} = C.CString({2}.{3})}}\n'.format(cvarname,cname,
> govarname,goname)
> diff --git a/tools/golang/xenlight/helpers.gen.go b/tools/golang/xenlight/helpers.gen.go
> index b454b12d52..5222898fb8 100644
> --- a/tools/golang/xenlight/helpers.gen.go
> +++ b/tools/golang/xenlight/helpers.gen.go
> @@ -154,8 +154,10 @@ C.libxl_vnc_info_dispose(xc)}
> if err := x.Enable.toC(&xc.enable); err != nil {
> return fmt.Errorf("converting field Enable: %v", err)
> }
> +xc.listen = nil
> if x.Listen != "" {
> xc.listen = C.CString(x.Listen)}
> +xc.passwd = nil
> if x.Passwd != "" {
> xc.passwd = C.CString(x.Passwd)}
> xc.display = C.int(x.Display)
> @@ -216,11 +218,13 @@ return fmt.Errorf("converting field Enable: %v", err)
> }
> xc.port = C.int(x.Port)
> xc.tls_port = C.int(x.TlsPort)
> +xc.host = nil
> if x.Host != "" {
> xc.host = C.CString(x.Host)}
> if err := x.DisableTicketing.toC(&xc.disable_ticketing); err != nil {
> return fmt.Errorf("converting field DisableTicketing: %v", err)
> }
> +xc.passwd = nil
> if x.Passwd != "" {
> xc.passwd = C.CString(x.Passwd)}
> if err := x.AgentMouse.toC(&xc.agent_mouse); err != nil {
> @@ -233,8 +237,10 @@ if err := x.ClipboardSharing.toC(&xc.clipboard_sharing); err != nil {
> return fmt.Errorf("converting field ClipboardSharing: %v", err)
> }
> xc.usbredirection = C.int(x.Usbredirection)
> +xc.image_compression = nil
> if x.ImageCompression != "" {
> xc.image_compression = C.CString(x.ImageCompression)}
> +xc.streaming_video = nil
> if x.StreamingVideo != "" {
> xc.streaming_video = C.CString(x.StreamingVideo)}
>
> @@ -278,8 +284,10 @@ return fmt.Errorf("converting field Enable: %v", err)
> if err := x.Opengl.toC(&xc.opengl); err != nil {
> return fmt.Errorf("converting field Opengl: %v", err)
> }
> +xc.display = nil
> if x.Display != "" {
> xc.display = C.CString(x.Display)}
> +xc.xauthority = nil
> if x.Xauthority != "" {
> xc.xauthority = C.CString(x.Xauthority)}
>
> @@ -337,6 +345,7 @@ return fmt.Errorf("converting field Uuid: %v", err)
> }
> xc.domid = C.libxl_domid(x.Domid)
> xc.ssidref = C.uint32_t(x.Ssidref)
> +xc.ssid_label = nil
> if x.SsidLabel != "" {
> xc.ssid_label = C.CString(x.SsidLabel)}
> xc.running = C.bool(x.Running)
> @@ -391,6 +400,7 @@ C.libxl_cpupoolinfo_dispose(xc)}
> }()
>
> xc.poolid = C.uint32_t(x.Poolid)
> +xc.pool_name = nil
> if x.PoolName != "" {
> xc.pool_name = C.CString(x.PoolName)}
> xc.sched = C.libxl_scheduler(x.Sched)
> @@ -458,9 +468,11 @@ if err != nil{
> C.libxl_channelinfo_dispose(xc)}
> }()
>
> +xc.backend = nil
> if x.Backend != "" {
> xc.backend = C.CString(x.Backend)}
> xc.backend_id = C.uint32_t(x.BackendId)
> +xc.frontend = nil
> if x.Frontend != "" {
> xc.frontend = C.CString(x.Frontend)}
> xc.frontend_id = C.uint32_t(x.FrontendId)
> @@ -478,6 +490,7 @@ if !ok {
> return errors.New("wrong type for union key connection")
> }
> var pty C.libxl_channelinfo_connection_union_pty
> +pty.path = nil
> if tmp.Path != "" {
> pty.path = C.CString(tmp.Path)}
> ptyBytes := C.GoBytes(unsafe.Pointer(&pty),C.sizeof_libxl_channelinfo_connection_union_pty)
> @@ -563,24 +576,33 @@ C.libxl_version_info_dispose(xc)}
>
> xc.xen_version_major = C.int(x.XenVersionMajor)
> xc.xen_version_minor = C.int(x.XenVersionMinor)
> +xc.xen_version_extra = nil
> if x.XenVersionExtra != "" {
> xc.xen_version_extra = C.CString(x.XenVersionExtra)}
> +xc.compiler = nil
> if x.Compiler != "" {
> xc.compiler = C.CString(x.Compiler)}
> +xc.compile_by = nil
> if x.CompileBy != "" {
> xc.compile_by = C.CString(x.CompileBy)}
> +xc.compile_domain = nil
> if x.CompileDomain != "" {
> xc.compile_domain = C.CString(x.CompileDomain)}
> +xc.compile_date = nil
> if x.CompileDate != "" {
> xc.compile_date = C.CString(x.CompileDate)}
> +xc.capabilities = nil
> if x.Capabilities != "" {
> xc.capabilities = C.CString(x.Capabilities)}
> +xc.changeset = nil
> if x.Changeset != "" {
> xc.changeset = C.CString(x.Changeset)}
> xc.virt_start = C.uint64_t(x.VirtStart)
> xc.pagesize = C.int(x.Pagesize)
> +xc.commandline = nil
> if x.Commandline != "" {
> xc.commandline = C.CString(x.Commandline)}
> +xc.build_id = nil
> if x.BuildId != "" {
> xc.build_id = C.CString(x.BuildId)}
>
> @@ -650,8 +672,10 @@ if err := x.Oos.toC(&xc.oos); err != nil {
> return fmt.Errorf("converting field Oos: %v", err)
> }
> xc.ssidref = C.uint32_t(x.Ssidref)
> +xc.ssid_label = nil
> if x.SsidLabel != "" {
> xc.ssid_label = C.CString(x.SsidLabel)}
> +xc.name = nil
> if x.Name != "" {
> xc.name = C.CString(x.Name)}
> xc.domid = C.libxl_domid(x.Domid)
> @@ -665,6 +689,7 @@ if err := x.Platformdata.toC(&xc.platformdata); err != nil {
> return fmt.Errorf("converting field Platformdata: %v", err)
> }
> xc.poolid = C.uint32_t(x.Poolid)
> +xc.pool_name = nil
> if x.PoolName != "" {
> xc.pool_name = C.CString(x.PoolName)}
> if err := x.RunHotplugScripts.toC(&xc.run_hotplug_scripts); err != nil {
> @@ -712,6 +737,7 @@ C.libxl_domain_restore_params_dispose(xc)}
>
> xc.checkpointed_stream = C.int(x.CheckpointedStream)
> xc.stream_version = C.uint32_t(x.StreamVersion)
> +xc.colo_proxy_script = nil
> if x.ColoProxyScript != "" {
> xc.colo_proxy_script = C.CString(x.ColoProxyScript)}
> if err := x.UserspaceColoProxy.toC(&xc.userspace_colo_proxy); err != nil {
> @@ -1312,6 +1338,7 @@ xc.shadow_memkb = C.uint64_t(x.ShadowMemkb)
> xc.iommu_memkb = C.uint64_t(x.IommuMemkb)
> xc.rtc_timeoffset = C.uint32_t(x.RtcTimeoffset)
> xc.exec_ssidref = C.uint32_t(x.ExecSsidref)
> +xc.exec_ssid_label = nil
> if x.ExecSsidLabel != "" {
> xc.exec_ssid_label = C.CString(x.ExecSsidLabel)}
> if err := x.Localtime.toC(&xc.localtime); err != nil {
> @@ -1323,6 +1350,7 @@ return fmt.Errorf("converting field DisableMigrate: %v", err)
> if err := x.Cpuid.toC(&xc.cpuid); err != nil {
> return fmt.Errorf("converting field Cpuid: %v", err)
> }
> +xc.blkdev_start = nil
> if x.BlkdevStart != "" {
> xc.blkdev_start = C.CString(x.BlkdevStart)}
> if numVnumaNodes := len(x.VnumaNodes); numVnumaNodes > 0 {
> @@ -1342,15 +1370,20 @@ if err := x.DeviceModelStubdomain.toC(&xc.device_model_stubdomain); err != nil {
> return fmt.Errorf("converting field DeviceModelStubdomain: %v", err)
> }
> xc.stubdomain_memkb = C.uint64_t(x.StubdomainMemkb)
> +xc.stubdomain_kernel = nil
> if x.StubdomainKernel != "" {
> xc.stubdomain_kernel = C.CString(x.StubdomainKernel)}
> +xc.stubdomain_ramdisk = nil
> if x.StubdomainRamdisk != "" {
> xc.stubdomain_ramdisk = C.CString(x.StubdomainRamdisk)}
> +xc.device_model = nil
> if x.DeviceModel != "" {
> xc.device_model = C.CString(x.DeviceModel)}
> xc.device_model_ssidref = C.uint32_t(x.DeviceModelSsidref)
> +xc.device_model_ssid_label = nil
> if x.DeviceModelSsidLabel != "" {
> xc.device_model_ssid_label = C.CString(x.DeviceModelSsidLabel)}
> +xc.device_model_user = nil
> if x.DeviceModelUser != "" {
> xc.device_model_user = C.CString(x.DeviceModelUser)}
> if err := x.Extra.toC(&xc.extra); err != nil {
> @@ -1397,17 +1430,22 @@ if err := x.ClaimMode.toC(&xc.claim_mode); err != nil {
> return fmt.Errorf("converting field ClaimMode: %v", err)
> }
> xc.event_channels = C.uint32_t(x.EventChannels)
> +xc.kernel = nil
> if x.Kernel != "" {
> xc.kernel = C.CString(x.Kernel)}
> +xc.cmdline = nil
> if x.Cmdline != "" {
> xc.cmdline = C.CString(x.Cmdline)}
> +xc.ramdisk = nil
> if x.Ramdisk != "" {
> xc.ramdisk = C.CString(x.Ramdisk)}
> +xc.device_tree = nil
> if x.DeviceTree != "" {
> xc.device_tree = C.CString(x.DeviceTree)}
> if err := x.Acpi.toC(&xc.acpi); err != nil {
> return fmt.Errorf("converting field Acpi: %v", err)
> }
> +xc.bootloader = nil
> if x.Bootloader != "" {
> xc.bootloader = C.CString(x.Bootloader)}
> if err := x.BootloaderArgs.toC(&xc.bootloader_args); err != nil {
> @@ -1432,6 +1470,7 @@ if !ok {
> return errors.New("wrong type for union key type")
> }
> var hvm C.libxl_domain_build_info_type_union_hvm
> +hvm.firmware = nil
> if tmp.Firmware != "" {
> hvm.firmware = C.CString(tmp.Firmware)}
> hvm.bios = C.libxl_bios_type(tmp.Bios)
> @@ -1465,6 +1504,7 @@ return fmt.Errorf("converting field ViridianEnable: %v", err)
> if err := tmp.ViridianDisable.toC(&hvm.viridian_disable); err != nil {
> return fmt.Errorf("converting field ViridianDisable: %v", err)
> }
> +hvm.timeoffset = nil
> if tmp.Timeoffset != "" {
> hvm.timeoffset = C.CString(tmp.Timeoffset)}
> if err := tmp.Hpet.toC(&hvm.hpet); err != nil {
> @@ -1481,10 +1521,13 @@ return fmt.Errorf("converting field NestedHvm: %v", err)
> if err := tmp.Altp2M.toC(&hvm.altp2m); err != nil {
> return fmt.Errorf("converting field Altp2M: %v", err)
> }
> +hvm.system_firmware = nil
> if tmp.SystemFirmware != "" {
> hvm.system_firmware = C.CString(tmp.SystemFirmware)}
> +hvm.smbios_firmware = nil
> if tmp.SmbiosFirmware != "" {
> hvm.smbios_firmware = C.CString(tmp.SmbiosFirmware)}
> +hvm.acpi_firmware = nil
> if tmp.AcpiFirmware != "" {
> hvm.acpi_firmware = C.CString(tmp.AcpiFirmware)}
> hvm.hdtype = C.libxl_hdtype(tmp.Hdtype)
> @@ -1497,6 +1540,7 @@ return fmt.Errorf("converting field Vga: %v", err)
> if err := tmp.Vnc.toC(&hvm.vnc); err != nil {
> return fmt.Errorf("converting field Vnc: %v", err)
> }
> +hvm.keymap = nil
> if tmp.Keymap != "" {
> hvm.keymap = C.CString(tmp.Keymap)}
> if err := tmp.Sdl.toC(&hvm.sdl); err != nil {
> @@ -1509,19 +1553,23 @@ if err := tmp.GfxPassthru.toC(&hvm.gfx_passthru); err != nil {
> return fmt.Errorf("converting field GfxPassthru: %v", err)
> }
> hvm.gfx_passthru_kind = C.libxl_gfx_passthru_kind(tmp.GfxPassthruKind)
> +hvm.serial = nil
> if tmp.Serial != "" {
> hvm.serial = C.CString(tmp.Serial)}
> +hvm.boot = nil
> if tmp.Boot != "" {
> hvm.boot = C.CString(tmp.Boot)}
> if err := tmp.Usb.toC(&hvm.usb); err != nil {
> return fmt.Errorf("converting field Usb: %v", err)
> }
> hvm.usbversion = C.int(tmp.Usbversion)
> +hvm.usbdevice = nil
> if tmp.Usbdevice != "" {
> hvm.usbdevice = C.CString(tmp.Usbdevice)}
> if err := tmp.VkbDevice.toC(&hvm.vkb_device); err != nil {
> return fmt.Errorf("converting field VkbDevice: %v", err)
> }
> +hvm.soundhw = nil
> if tmp.Soundhw != "" {
> hvm.soundhw = C.CString(tmp.Soundhw)}
> if err := tmp.XenPlatformPci.toC(&hvm.xen_platform_pci); err != nil {
> @@ -1550,18 +1598,23 @@ if !ok {
> return errors.New("wrong type for union key type")
> }
> var pv C.libxl_domain_build_info_type_union_pv
> +pv.kernel = nil
> if tmp.Kernel != "" {
> pv.kernel = C.CString(tmp.Kernel)}
> pv.slack_memkb = C.uint64_t(tmp.SlackMemkb)
> +pv.bootloader = nil
> if tmp.Bootloader != "" {
> pv.bootloader = C.CString(tmp.Bootloader)}
> if err := tmp.BootloaderArgs.toC(&pv.bootloader_args); err != nil {
> return fmt.Errorf("converting field BootloaderArgs: %v", err)
> }
> +pv.cmdline = nil
> if tmp.Cmdline != "" {
> pv.cmdline = C.CString(tmp.Cmdline)}
> +pv.ramdisk = nil
> if tmp.Ramdisk != "" {
> pv.ramdisk = C.CString(tmp.Ramdisk)}
> +pv.features = nil
> if tmp.Features != "" {
> pv.features = C.CString(tmp.Features)}
> if err := tmp.E820Host.toC(&pv.e820_host); err != nil {
> @@ -1578,10 +1631,13 @@ var pvh C.libxl_domain_build_info_type_union_pvh
> if err := tmp.Pvshim.toC(&pvh.pvshim); err != nil {
> return fmt.Errorf("converting field Pvshim: %v", err)
> }
> +pvh.pvshim_path = nil
> if tmp.PvshimPath != "" {
> pvh.pvshim_path = C.CString(tmp.PvshimPath)}
> +pvh.pvshim_cmdline = nil
> if tmp.PvshimCmdline != "" {
> pvh.pvshim_cmdline = C.CString(tmp.PvshimCmdline)}
> +pvh.pvshim_extra = nil
> if tmp.PvshimExtra != "" {
> pvh.pvshim_extra = C.CString(tmp.PvshimExtra)}
> pvhBytes := C.GoBytes(unsafe.Pointer(&pvh),C.sizeof_libxl_domain_build_info_type_union_pvh)
> @@ -1635,6 +1691,7 @@ C.libxl_device_vfb_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> xc.devid = C.libxl_devid(x.Devid)
> @@ -1644,6 +1701,7 @@ return fmt.Errorf("converting field Vnc: %v", err)
> if err := x.Sdl.toC(&xc.sdl); err != nil {
> return fmt.Errorf("converting field Sdl: %v", err)
> }
> +xc.keymap = nil
> if x.Keymap != "" {
> xc.keymap = C.CString(x.Keymap)}
>
> @@ -1689,10 +1747,12 @@ C.libxl_device_vkb_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> xc.devid = C.libxl_devid(x.Devid)
> xc.backend_type = C.libxl_vkb_backend(x.BackendType)
> +xc.unique_id = nil
> if x.UniqueId != "" {
> xc.unique_id = C.CString(x.UniqueId)}
> xc.feature_disable_keyboard = C.bool(x.FeatureDisableKeyboard)
> @@ -1758,14 +1818,18 @@ C.libxl_device_disk_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> +xc.pdev_path = nil
> if x.PdevPath != "" {
> xc.pdev_path = C.CString(x.PdevPath)}
> +xc.vdev = nil
> if x.Vdev != "" {
> xc.vdev = C.CString(x.Vdev)}
> xc.backend = C.libxl_disk_backend(x.Backend)
> xc.format = C.libxl_disk_format(x.Format)
> +xc.script = nil
> if x.Script != "" {
> xc.script = C.CString(x.Script)}
> xc.removable = C.int(x.Removable)
> @@ -1781,13 +1845,17 @@ return fmt.Errorf("converting field ColoEnable: %v", err)
> if err := x.ColoRestoreEnable.toC(&xc.colo_restore_enable); err != nil {
> return fmt.Errorf("converting field ColoRestoreEnable: %v", err)
> }
> +xc.colo_host = nil
> if x.ColoHost != "" {
> xc.colo_host = C.CString(x.ColoHost)}
> xc.colo_port = C.int(x.ColoPort)
> +xc.colo_export = nil
> if x.ColoExport != "" {
> xc.colo_export = C.CString(x.ColoExport)}
> +xc.active_disk = nil
> if x.ActiveDisk != "" {
> xc.active_disk = C.CString(x.ActiveDisk)}
> +xc.hidden_disk = nil
> if x.HiddenDisk != "" {
> xc.hidden_disk = C.CString(x.HiddenDisk)}
>
> @@ -1883,124 +1951,180 @@ C.libxl_device_nic_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> xc.devid = C.libxl_devid(x.Devid)
> xc.mtu = C.int(x.Mtu)
> +xc.model = nil
> if x.Model != "" {
> xc.model = C.CString(x.Model)}
> if err := x.Mac.toC(&xc.mac); err != nil {
> return fmt.Errorf("converting field Mac: %v", err)
> }
> +xc.ip = nil
> if x.Ip != "" {
> xc.ip = C.CString(x.Ip)}
> +xc.bridge = nil
> if x.Bridge != "" {
> xc.bridge = C.CString(x.Bridge)}
> +xc.ifname = nil
> if x.Ifname != "" {
> xc.ifname = C.CString(x.Ifname)}
> +xc.script = nil
> if x.Script != "" {
> xc.script = C.CString(x.Script)}
> xc.nictype = C.libxl_nic_type(x.Nictype)
> xc.rate_bytes_per_interval = C.uint64_t(x.RateBytesPerInterval)
> xc.rate_interval_usecs = C.uint32_t(x.RateIntervalUsecs)
> +xc.gatewaydev = nil
> if x.Gatewaydev != "" {
> xc.gatewaydev = C.CString(x.Gatewaydev)}
> +xc.coloft_forwarddev = nil
> if x.ColoftForwarddev != "" {
> xc.coloft_forwarddev = C.CString(x.ColoftForwarddev)}
> +xc.colo_sock_mirror_id = nil
> if x.ColoSockMirrorId != "" {
> xc.colo_sock_mirror_id = C.CString(x.ColoSockMirrorId)}
> +xc.colo_sock_mirror_ip = nil
> if x.ColoSockMirrorIp != "" {
> xc.colo_sock_mirror_ip = C.CString(x.ColoSockMirrorIp)}
> +xc.colo_sock_mirror_port = nil
> if x.ColoSockMirrorPort != "" {
> xc.colo_sock_mirror_port = C.CString(x.ColoSockMirrorPort)}
> +xc.colo_sock_compare_pri_in_id = nil
> if x.ColoSockComparePriInId != "" {
> xc.colo_sock_compare_pri_in_id = C.CString(x.ColoSockComparePriInId)}
> +xc.colo_sock_compare_pri_in_ip = nil
> if x.ColoSockComparePriInIp != "" {
> xc.colo_sock_compare_pri_in_ip = C.CString(x.ColoSockComparePriInIp)}
> +xc.colo_sock_compare_pri_in_port = nil
> if x.ColoSockComparePriInPort != "" {
> xc.colo_sock_compare_pri_in_port = C.CString(x.ColoSockComparePriInPort)}
> +xc.colo_sock_compare_sec_in_id = nil
> if x.ColoSockCompareSecInId != "" {
> xc.colo_sock_compare_sec_in_id = C.CString(x.ColoSockCompareSecInId)}
> +xc.colo_sock_compare_sec_in_ip = nil
> if x.ColoSockCompareSecInIp != "" {
> xc.colo_sock_compare_sec_in_ip = C.CString(x.ColoSockCompareSecInIp)}
> +xc.colo_sock_compare_sec_in_port = nil
> if x.ColoSockCompareSecInPort != "" {
> xc.colo_sock_compare_sec_in_port = C.CString(x.ColoSockCompareSecInPort)}
> +xc.colo_sock_compare_notify_id = nil
> if x.ColoSockCompareNotifyId != "" {
> xc.colo_sock_compare_notify_id = C.CString(x.ColoSockCompareNotifyId)}
> +xc.colo_sock_compare_notify_ip = nil
> if x.ColoSockCompareNotifyIp != "" {
> xc.colo_sock_compare_notify_ip = C.CString(x.ColoSockCompareNotifyIp)}
> +xc.colo_sock_compare_notify_port = nil
> if x.ColoSockCompareNotifyPort != "" {
> xc.colo_sock_compare_notify_port = C.CString(x.ColoSockCompareNotifyPort)}
> +xc.colo_sock_redirector0_id = nil
> if x.ColoSockRedirector0Id != "" {
> xc.colo_sock_redirector0_id = C.CString(x.ColoSockRedirector0Id)}
> +xc.colo_sock_redirector0_ip = nil
> if x.ColoSockRedirector0Ip != "" {
> xc.colo_sock_redirector0_ip = C.CString(x.ColoSockRedirector0Ip)}
> +xc.colo_sock_redirector0_port = nil
> if x.ColoSockRedirector0Port != "" {
> xc.colo_sock_redirector0_port = C.CString(x.ColoSockRedirector0Port)}
> +xc.colo_sock_redirector1_id = nil
> if x.ColoSockRedirector1Id != "" {
> xc.colo_sock_redirector1_id = C.CString(x.ColoSockRedirector1Id)}
> +xc.colo_sock_redirector1_ip = nil
> if x.ColoSockRedirector1Ip != "" {
> xc.colo_sock_redirector1_ip = C.CString(x.ColoSockRedirector1Ip)}
> +xc.colo_sock_redirector1_port = nil
> if x.ColoSockRedirector1Port != "" {
> xc.colo_sock_redirector1_port = C.CString(x.ColoSockRedirector1Port)}
> +xc.colo_sock_redirector2_id = nil
> if x.ColoSockRedirector2Id != "" {
> xc.colo_sock_redirector2_id = C.CString(x.ColoSockRedirector2Id)}
> +xc.colo_sock_redirector2_ip = nil
> if x.ColoSockRedirector2Ip != "" {
> xc.colo_sock_redirector2_ip = C.CString(x.ColoSockRedirector2Ip)}
> +xc.colo_sock_redirector2_port = nil
> if x.ColoSockRedirector2Port != "" {
> xc.colo_sock_redirector2_port = C.CString(x.ColoSockRedirector2Port)}
> +xc.colo_filter_mirror_queue = nil
> if x.ColoFilterMirrorQueue != "" {
> xc.colo_filter_mirror_queue = C.CString(x.ColoFilterMirrorQueue)}
> +xc.colo_filter_mirror_outdev = nil
> if x.ColoFilterMirrorOutdev != "" {
> xc.colo_filter_mirror_outdev = C.CString(x.ColoFilterMirrorOutdev)}
> +xc.colo_filter_redirector0_queue = nil
> if x.ColoFilterRedirector0Queue != "" {
> xc.colo_filter_redirector0_queue = C.CString(x.ColoFilterRedirector0Queue)}
> +xc.colo_filter_redirector0_indev = nil
> if x.ColoFilterRedirector0Indev != "" {
> xc.colo_filter_redirector0_indev = C.CString(x.ColoFilterRedirector0Indev)}
> +xc.colo_filter_redirector0_outdev = nil
> if x.ColoFilterRedirector0Outdev != "" {
> xc.colo_filter_redirector0_outdev = C.CString(x.ColoFilterRedirector0Outdev)}
> +xc.colo_filter_redirector1_queue = nil
> if x.ColoFilterRedirector1Queue != "" {
> xc.colo_filter_redirector1_queue = C.CString(x.ColoFilterRedirector1Queue)}
> +xc.colo_filter_redirector1_indev = nil
> if x.ColoFilterRedirector1Indev != "" {
> xc.colo_filter_redirector1_indev = C.CString(x.ColoFilterRedirector1Indev)}
> +xc.colo_filter_redirector1_outdev = nil
> if x.ColoFilterRedirector1Outdev != "" {
> xc.colo_filter_redirector1_outdev = C.CString(x.ColoFilterRedirector1Outdev)}
> +xc.colo_compare_pri_in = nil
> if x.ColoComparePriIn != "" {
> xc.colo_compare_pri_in = C.CString(x.ColoComparePriIn)}
> +xc.colo_compare_sec_in = nil
> if x.ColoCompareSecIn != "" {
> xc.colo_compare_sec_in = C.CString(x.ColoCompareSecIn)}
> +xc.colo_compare_out = nil
> if x.ColoCompareOut != "" {
> xc.colo_compare_out = C.CString(x.ColoCompareOut)}
> +xc.colo_compare_notify_dev = nil
> if x.ColoCompareNotifyDev != "" {
> xc.colo_compare_notify_dev = C.CString(x.ColoCompareNotifyDev)}
> +xc.colo_sock_sec_redirector0_id = nil
> if x.ColoSockSecRedirector0Id != "" {
> xc.colo_sock_sec_redirector0_id = C.CString(x.ColoSockSecRedirector0Id)}
> +xc.colo_sock_sec_redirector0_ip = nil
> if x.ColoSockSecRedirector0Ip != "" {
> xc.colo_sock_sec_redirector0_ip = C.CString(x.ColoSockSecRedirector0Ip)}
> +xc.colo_sock_sec_redirector0_port = nil
> if x.ColoSockSecRedirector0Port != "" {
> xc.colo_sock_sec_redirector0_port = C.CString(x.ColoSockSecRedirector0Port)}
> +xc.colo_sock_sec_redirector1_id = nil
> if x.ColoSockSecRedirector1Id != "" {
> xc.colo_sock_sec_redirector1_id = C.CString(x.ColoSockSecRedirector1Id)}
> +xc.colo_sock_sec_redirector1_ip = nil
> if x.ColoSockSecRedirector1Ip != "" {
> xc.colo_sock_sec_redirector1_ip = C.CString(x.ColoSockSecRedirector1Ip)}
> +xc.colo_sock_sec_redirector1_port = nil
> if x.ColoSockSecRedirector1Port != "" {
> xc.colo_sock_sec_redirector1_port = C.CString(x.ColoSockSecRedirector1Port)}
> +xc.colo_filter_sec_redirector0_queue = nil
> if x.ColoFilterSecRedirector0Queue != "" {
> xc.colo_filter_sec_redirector0_queue = C.CString(x.ColoFilterSecRedirector0Queue)}
> +xc.colo_filter_sec_redirector0_indev = nil
> if x.ColoFilterSecRedirector0Indev != "" {
> xc.colo_filter_sec_redirector0_indev = C.CString(x.ColoFilterSecRedirector0Indev)}
> +xc.colo_filter_sec_redirector0_outdev = nil
> if x.ColoFilterSecRedirector0Outdev != "" {
> xc.colo_filter_sec_redirector0_outdev = C.CString(x.ColoFilterSecRedirector0Outdev)}
> +xc.colo_filter_sec_redirector1_queue = nil
> if x.ColoFilterSecRedirector1Queue != "" {
> xc.colo_filter_sec_redirector1_queue = C.CString(x.ColoFilterSecRedirector1Queue)}
> +xc.colo_filter_sec_redirector1_indev = nil
> if x.ColoFilterSecRedirector1Indev != "" {
> xc.colo_filter_sec_redirector1_indev = C.CString(x.ColoFilterSecRedirector1Indev)}
> +xc.colo_filter_sec_redirector1_outdev = nil
> if x.ColoFilterSecRedirector1Outdev != "" {
> xc.colo_filter_sec_redirector1_outdev = C.CString(x.ColoFilterSecRedirector1Outdev)}
> +xc.colo_filter_sec_rewriter0_queue = nil
> if x.ColoFilterSecRewriter0Queue != "" {
> xc.colo_filter_sec_rewriter0_queue = C.CString(x.ColoFilterSecRewriter0Queue)}
> +xc.colo_checkpoint_host = nil
> if x.ColoCheckpointHost != "" {
> xc.colo_checkpoint_host = C.CString(x.ColoCheckpointHost)}
> +xc.colo_checkpoint_port = nil
> if x.ColoCheckpointPort != "" {
> xc.colo_checkpoint_port = C.CString(x.ColoCheckpointPort)}
>
> @@ -2053,6 +2177,7 @@ xc.power_mgmt = C.bool(x.PowerMgmt)
> xc.permissive = C.bool(x.Permissive)
> xc.seize = C.bool(x.Seize)
> xc.rdm_policy = C.libxl_rdm_reserve_policy(x.RdmPolicy)
> +xc.name = nil
> if x.Name != "" {
> xc.name = C.CString(x.Name)}
>
> @@ -2126,6 +2251,7 @@ xc.devid = C.libxl_devid(x.Devid)
> xc.version = C.int(x.Version)
> xc.ports = C.int(x.Ports)
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
>
> @@ -2223,6 +2349,7 @@ if err != nil{
> C.libxl_device_dtdev_dispose(xc)}
> }()
>
> +xc.path = nil
> if x.Path != "" {
> xc.path = C.CString(x.Path)}
>
> @@ -2259,6 +2386,7 @@ C.libxl_device_vtpm_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> xc.devid = C.libxl_devid(x.Devid)
> @@ -2299,12 +2427,16 @@ C.libxl_device_p9_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> +xc.tag = nil
> if x.Tag != "" {
> xc.tag = C.CString(x.Tag)}
> +xc.path = nil
> if x.Path != "" {
> xc.path = C.CString(x.Path)}
> +xc.security_model = nil
> if x.SecurityModel != "" {
> xc.security_model = C.CString(x.SecurityModel)}
> xc.devid = C.libxl_devid(x.Devid)
> @@ -2339,6 +2471,7 @@ C.libxl_device_pvcallsif_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> xc.devid = C.libxl_devid(x.Devid)
> @@ -2399,9 +2532,11 @@ C.libxl_device_channel_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> xc.devid = C.libxl_devid(x.Devid)
> +xc.name = nil
> if x.Name != "" {
> xc.name = C.CString(x.Name)}
> xc.connection = C.libxl_channel_connection(x.Connection)
> @@ -2416,6 +2551,7 @@ if !ok {
> return errors.New("wrong type for union key connection")
> }
> var socket C.libxl_device_channel_connection_union_socket
> +socket.path = nil
> if tmp.Path != "" {
> socket.path = C.CString(tmp.Path)}
> socketBytes := C.GoBytes(unsafe.Pointer(&socket),C.sizeof_libxl_device_channel_connection_union_socket)
> @@ -2452,6 +2588,7 @@ if err != nil{
> C.libxl_connector_param_dispose(xc)}
> }()
>
> +xc.unique_id = nil
> if x.UniqueId != "" {
> xc.unique_id = C.CString(x.UniqueId)}
> xc.width = C.uint32_t(x.Width)
> @@ -2497,6 +2634,7 @@ C.libxl_device_vdispl_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> xc.devid = C.libxl_devid(x.Devid)
> @@ -2608,6 +2746,7 @@ if err != nil{
> C.libxl_vsnd_stream_dispose(xc)}
> }()
>
> +xc.unique_id = nil
> if x.UniqueId != "" {
> xc.unique_id = C.CString(x.UniqueId)}
> xc._type = C.libxl_vsnd_stream_type(x.Type)
> @@ -2654,6 +2793,7 @@ if err != nil{
> C.libxl_vsnd_pcm_dispose(xc)}
> }()
>
> +xc.name = nil
> if x.Name != "" {
> xc.name = C.CString(x.Name)}
> if err := x.Params.toC(&xc.params); err != nil {
> @@ -2714,11 +2854,14 @@ C.libxl_device_vsnd_dispose(xc)}
> }()
>
> xc.backend_domid = C.libxl_domid(x.BackendDomid)
> +xc.backend_domname = nil
> if x.BackendDomname != "" {
> xc.backend_domname = C.CString(x.BackendDomname)}
> xc.devid = C.libxl_devid(x.Devid)
> +xc.short_name = nil
> if x.ShortName != "" {
> xc.short_name = C.CString(x.ShortName)}
> +xc.long_name = nil
> if x.LongName != "" {
> xc.long_name = C.CString(x.LongName)}
> if err := x.Params.toC(&xc.params); err != nil {
> @@ -3103,9 +3246,11 @@ if err != nil{
> C.libxl_diskinfo_dispose(xc)}
> }()
>
> +xc.backend = nil
> if x.Backend != "" {
> xc.backend = C.CString(x.Backend)}
> xc.backend_id = C.uint32_t(x.BackendId)
> +xc.frontend = nil
> if x.Frontend != "" {
> xc.frontend = C.CString(x.Frontend)}
> xc.frontend_id = C.uint32_t(x.FrontendId)
> @@ -3149,9 +3294,11 @@ if err != nil{
> C.libxl_nicinfo_dispose(xc)}
> }()
>
> +xc.backend = nil
> if x.Backend != "" {
> xc.backend = C.CString(x.Backend)}
> xc.backend_id = C.uint32_t(x.BackendId)
> +xc.frontend = nil
> if x.Frontend != "" {
> xc.frontend = C.CString(x.Frontend)}
> xc.frontend_id = C.uint32_t(x.FrontendId)
> @@ -3198,9 +3345,11 @@ if err != nil{
> C.libxl_vtpminfo_dispose(xc)}
> }()
>
> +xc.backend = nil
> if x.Backend != "" {
> xc.backend = C.CString(x.Backend)}
> xc.backend_id = C.uint32_t(x.BackendId)
> +xc.frontend = nil
> if x.Frontend != "" {
> xc.frontend = C.CString(x.Frontend)}
> xc.frontend_id = C.uint32_t(x.FrontendId)
> @@ -3254,9 +3403,11 @@ xc._type = C.libxl_usbctrl_type(x.Type)
> xc.devid = C.libxl_devid(x.Devid)
> xc.version = C.int(x.Version)
> xc.ports = C.int(x.Ports)
> +xc.backend = nil
> if x.Backend != "" {
> xc.backend = C.CString(x.Backend)}
> xc.backend_id = C.uint32_t(x.BackendId)
> +xc.frontend = nil
> if x.Frontend != "" {
> xc.frontend = C.CString(x.Frontend)}
> xc.frontend_id = C.uint32_t(x.FrontendId)
> @@ -3422,6 +3573,7 @@ if err != nil{
> C.libxl_connectorinfo_dispose(xc)}
> }()
>
> +xc.unique_id = nil
> if x.UniqueId != "" {
> xc.unique_id = C.CString(x.UniqueId)}
> xc.width = C.uint32_t(x.Width)
> @@ -3473,9 +3625,11 @@ if err != nil{
> C.libxl_vdisplinfo_dispose(xc)}
> }()
>
> +xc.backend = nil
> if x.Backend != "" {
> xc.backend = C.CString(x.Backend)}
> xc.backend_id = C.uint32_t(x.BackendId)
> +xc.frontend = nil
> if x.Frontend != "" {
> xc.frontend = C.CString(x.Frontend)}
> xc.frontend_id = C.uint32_t(x.FrontendId)
> @@ -3611,9 +3765,11 @@ if err != nil{
> C.libxl_vsndinfo_dispose(xc)}
> }()
>
> +xc.backend = nil
> if x.Backend != "" {
> xc.backend = C.CString(x.Backend)}
> xc.backend_id = C.uint32_t(x.BackendId)
> +xc.frontend = nil
> if x.Frontend != "" {
> xc.frontend = C.CString(x.Frontend)}
> xc.frontend_id = C.uint32_t(x.FrontendId)
> @@ -3664,9 +3820,11 @@ if err != nil{
> C.libxl_vkbinfo_dispose(xc)}
> }()
>
> +xc.backend = nil
> if x.Backend != "" {
> xc.backend = C.CString(x.Backend)}
> xc.backend_id = C.uint32_t(x.BackendId)
> +xc.frontend = nil
> if x.Frontend != "" {
> xc.frontend = C.CString(x.Frontend)}
> xc.frontend_id = C.uint32_t(x.FrontendId)
> @@ -3902,6 +4060,7 @@ return fmt.Errorf("converting field Compression: %v", err)
> if err := x.Netbuf.toC(&xc.netbuf); err != nil {
> return fmt.Errorf("converting field Netbuf: %v", err)
> }
> +xc.netbufscript = nil
> if x.Netbufscript != "" {
> xc.netbufscript = C.CString(x.Netbufscript)}
> if err := x.Diskbuf.toC(&xc.diskbuf); err != nil {
> @@ -4035,6 +4194,7 @@ if !ok {
> return errors.New("wrong type for union key type")
> }
> var disk_eject C.libxl_event_type_union_disk_eject
> +disk_eject.vdev = nil
> if tmp.Vdev != "" {
> disk_eject.vdev = C.CString(tmp.Vdev)}
> if err := tmp.Disk.toC(&disk_eject.disk); err != nil {
> --
> 2.17.1
>
On Fri, Jun 18, 2021 at 11:00:26AM +0000, George Dunlap wrote: > > > > On May 24, 2021, at 9:36 PM, Nick Rosbrook <rosbrookn@gmail.com> wrote: > > > > In gengotypes.py, the toC functions only set C string fields when > > the Go strings are non-empty. However, to prevent segfaults in some > > cases, these fields should always at least be set to nil so that the C > > memory is zeroed out. > > > > Update gengotypes.py so that the generated code always sets these fields > > to nil first, and then proceeds to check if the Go string is non-empty. > > And, commit the new generated code. > > > > Signed-off-by: Nick Rosbrook <rosbrookn@ainfosec.com> > > So wait — if you do > > var foo C.typename > > Then golang won’t automatically zero out `foo`? > > That seems like a bug really; but assuming this fixes real behavior you’ve encountered: I would have to dig in again to figure out exactly what Go/cgo is doing here, and whether or not this is a bug. But, the behavior I observed was that without these nil assignments, I would sometimes get segfaults in libxl_string_copy. This patch ensures that libxl__str_dup is not called in the empty string case, thus avoiding the segfault. > > Reviewed-by: George Dunlap <george.dunlap@citrix.com> Thanks, NR
> On Jun 21, 2021, at 5:11 PM, Nick Rosbrook <rosbrookn@gmail.com> wrote: > > On Fri, Jun 18, 2021 at 11:00:26AM +0000, George Dunlap wrote: >> >> >>> On May 24, 2021, at 9:36 PM, Nick Rosbrook <rosbrookn@gmail.com> wrote: >>> >>> In gengotypes.py, the toC functions only set C string fields when >>> the Go strings are non-empty. However, to prevent segfaults in some >>> cases, these fields should always at least be set to nil so that the C >>> memory is zeroed out. >>> >>> Update gengotypes.py so that the generated code always sets these fields >>> to nil first, and then proceeds to check if the Go string is non-empty. >>> And, commit the new generated code. >>> >>> Signed-off-by: Nick Rosbrook <rosbrookn@ainfosec.com> >> >> So wait — if you do >> >> var foo C.typename >> >> Then golang won’t automatically zero out `foo`? >> >> That seems like a bug really; but assuming this fixes real behavior you’ve encountered: > > I would have to dig in again to figure out exactly what Go/cgo is doing > here, and whether or not this is a bug. But, the behavior I observed was > that without these nil assignments, I would sometimes get segfaults in > libxl_string_copy. This patch ensures that libxl__str_dup is not called > in the empty string case, thus avoiding the segfault. I skimmed through the CGo page again when I was looking at this, and didn’t see anything specified about what happens if something is passed to a C function before being used by golang. If you get a chance, I think it would be good to try to file a ticket with the golang project, pointing out the observed behavior, and asking them to either: 1. Document that the golang compiler may not initialize a structure before passing it in to a C function 2. Document that it *will* initialize values to zero, and fix the bug. -George
On Thu, Jul 01, 2021 at 02:09:47PM +0000, George Dunlap wrote: > > > > On Jun 21, 2021, at 5:11 PM, Nick Rosbrook <rosbrookn@gmail.com> wrote: > > > > On Fri, Jun 18, 2021 at 11:00:26AM +0000, George Dunlap wrote: > >> > >> > >>> On May 24, 2021, at 9:36 PM, Nick Rosbrook <rosbrookn@gmail.com> wrote: > >>> > >>> In gengotypes.py, the toC functions only set C string fields when > >>> the Go strings are non-empty. However, to prevent segfaults in some > >>> cases, these fields should always at least be set to nil so that the C > >>> memory is zeroed out. > >>> > >>> Update gengotypes.py so that the generated code always sets these fields > >>> to nil first, and then proceeds to check if the Go string is non-empty. > >>> And, commit the new generated code. > >>> > >>> Signed-off-by: Nick Rosbrook <rosbrookn@ainfosec.com> > >> > >> So wait — if you do > >> > >> var foo C.typename > >> > >> Then golang won’t automatically zero out `foo`? > >> > >> That seems like a bug really; but assuming this fixes real behavior you’ve encountered: > > > > I would have to dig in again to figure out exactly what Go/cgo is doing > > here, and whether or not this is a bug. But, the behavior I observed was > > that without these nil assignments, I would sometimes get segfaults in > > libxl_string_copy. This patch ensures that libxl__str_dup is not called > > in the empty string case, thus avoiding the segfault. > > I skimmed through the CGo page again when I was looking at this, and didn’t see anything specified about what happens if something is passed to a C function before being used by golang. If you get a chance, I think it would be good to try to file a ticket with the golang project, pointing out the observed behavior, and asking them to either: > > 1. Document that the golang compiler may not initialize a structure before passing it in to a C function > > 2. Document that it *will* initialize values to zero, and fix the bug. > Sorry for the late reply. But that's a good idea, I can try and come up with a reproducible example and open an issue. Thanks, NR
© 2016 - 2026 Red Hat, Inc.