]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
setupapi: Fix struct size mismatches
authorSimon Rozman <simon@rozman.si>
Fri, 19 Apr 2019 08:05:04 +0000 (10:05 +0200)
committerSimon Rozman <simon@rozman.si>
Fri, 19 Apr 2019 08:08:11 +0000 (10:08 +0200)
Signed-off-by: Simon Rozman <simon@rozman.si>
tun/wintun/setupapi/setupapi_windows.go
tun/wintun/setupapi/types_windows.go
tun/wintun/setupapi/types_windows_386.go [new file with mode: 0644]
tun/wintun/setupapi/types_windows_amd64.go [new file with mode: 0644]

index 8524558257c64e5d652bd3f9f5c242b0c366f59c..dec9da20fa87669c4963f1314b821c57e64c8fea 100644 (file)
@@ -34,7 +34,7 @@ func SetupDiCreateDeviceInfoListEx(classGUID *windows.GUID, hwndParent uintptr,
 // SetupDiGetDeviceInfoListDetail function retrieves information associated with a device information set including the class GUID, remote computer handle, and remote computer name.
 func SetupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo) (deviceInfoSetDetailData *DevInfoListDetailData, err error) {
        data := &DevInfoListDetailData{}
-       data.size = uint32(unsafe.Sizeof(*data))
+       data.size = sizeofDevInfoListDetailData
 
        return data, setupDiGetDeviceInfoListDetail(deviceInfoSet, data)
 }
@@ -155,10 +155,7 @@ func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoDa
        var bufLen uint32
 
        data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0]))
-
-       // unsafe.Sizeof(data) >= sizeof(SP_DRVINFO_DETAIL_DATA) due to Go trailing padding. SetupAPI expects exactly sizeof(SP_DRVINFO_DETAIL_DATA).
-       sizeAPI := ((unsafe.Sizeof(uintptr(0)) - 1) | (unsafe.Offsetof(data.hardwareID) + unsafe.Sizeof(data.hardwareID) - 1) + 1)
-       data.size = uint32(sizeAPI)
+       data.size = sizeofDrvInfoDetailData
 
        err := setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, bufCapacity, &bufLen)
        if err == nil {
@@ -171,7 +168,7 @@ func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoDa
                // The buffer was too small. Now that we got the required size, create another one big enough and retry.
                buf := make([]byte, bufLen)
                data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0]))
-               data.size = uint32(sizeAPI)
+               data.size = sizeofDrvInfoDetailData
 
                err = setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, bufLen, &bufLen)
                if err == nil {
index a04237d4978f2d3d9c94c0a475fc5c11f7add81b..863bd7b6e531830ee7a0da1674da19a221bbe6cd 100644 (file)
@@ -60,7 +60,7 @@ type DevInfoData struct {
 
 // DevInfoListDetailData is a structure for detailed information on a device information set (used for SetupDiGetDeviceInfoListDetail which supercedes the functionality of SetupDiGetDeviceInfoListClass).
 type DevInfoListDetailData struct {
-       size                uint32
+       size                uint32 // Warning: unsafe.Sizeof(DevInfoListDetailData) > sizeof(SP_DEVINFO_LIST_DETAIL_DATA) when GOARCH == 386 => use sizeofDevInfoListDetailData const.
        ClassGUID           windows.GUID
        RemoteMachineHandle windows.Handle
        remoteMachineName   [SP_MAX_MACHINENAME_LENGTH]uint16
@@ -371,7 +371,7 @@ func (data *DrvInfoData) IsNewer(driverDate windows.Filetime, driverVersion uint
 
 // DrvInfoDetailData is driver information details structure (provides detailed information about a particular driver information structure)
 type DrvInfoDetailData struct {
-       size            uint32 // On input, this must be exactly the sizeof(DrvInfoDetailData). On output, we set this member to the actual size of structure data.
+       size            uint32 // Warning: unsafe.Sizeof(DrvInfoDetailData) > sizeof(SP_DRVINFO_DETAIL_DATA) when GOARCH == 386 => use sizeofDrvInfoDetailData const.
        InfDate         windows.Filetime
        compatIDsOffset uint32
        compatIDsLength uint32
diff --git a/tun/wintun/setupapi/types_windows_386.go b/tun/wintun/setupapi/types_windows_386.go
new file mode 100644 (file)
index 0000000..132f921
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
+ */
+
+package setupapi
+
+const (
+       sizeofDevInfoListDetailData uint32 = 550
+       sizeofDrvInfoDetailData     uint32 = 1570
+)
diff --git a/tun/wintun/setupapi/types_windows_amd64.go b/tun/wintun/setupapi/types_windows_amd64.go
new file mode 100644 (file)
index 0000000..d4dd65c
--- /dev/null
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
+ */
+
+package setupapi
+
+const (
+       sizeofDevInfoListDetailData uint32 = 560
+       sizeofDrvInfoDetailData     uint32 = 1584
+)