Paul Vriens : setupapi/devinst: Struct size passed needs to be exact.

Alexandre Julliard julliard at winehq.org
Mon Feb 25 14:21:30 CST 2008


Module: wine
Branch: master
Commit: 433ca7d8bd65c484107d2cd66cdc936275286b1e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=433ca7d8bd65c484107d2cd66cdc936275286b1e

Author: Paul Vriens <paul.vriens.wine at gmail.com>
Date:   Mon Feb 25 20:19:53 2008 +0100

setupapi/devinst: Struct size passed needs to be exact.

---

 dlls/setupapi/devinst.c       |    5 ++---
 dlls/setupapi/tests/devinst.c |    9 +++++++++
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 5d4b79e..0e5aad5 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -2885,9 +2885,8 @@ BOOL WINAPI SetupDiGetDeviceInterfaceDetailA(
         SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
     }
-    if (DeviceInterfaceDetailData && (DeviceInterfaceDetailData->cbSize <
-            offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA_A, DevicePath) + sizeof(char) ||
-            DeviceInterfaceDetailData->cbSize > sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A)))
+    if (DeviceInterfaceDetailData && (DeviceInterfaceDetailData->cbSize !=
+            offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA_A, DevicePath) + sizeof(char)))
     {
         SetLastError(ERROR_INVALID_USER_BUFFER);
         return FALSE;
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index 5dda333..dc6d9f7 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -641,6 +641,15 @@ static void testGetDeviceInterfaceDetail(void)
             ok(!ret && GetLastError() == ERROR_INVALID_USER_BUFFER,
              "Expected ERROR_INVALID_USER_BUFFER, got %08x\n", GetLastError());
             detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);
+            SetLastError(0xdeadbeef);
+            ret = pSetupDiGetDeviceInterfaceDetailA(set, &interfaceData, detail,
+                    size, &size, NULL);
+            ok(!ret && GetLastError() == ERROR_INVALID_USER_BUFFER,
+             "Expected ERROR_INVALID_USER_BUFFER, got %08x\n", GetLastError());
+            /* Windows 2000 and up check for the exact size. Win9x returns ERROR_INVALID_PARAMETER
+             * on every call (so doesn't get here) and NT4 doesn't have this function.
+             */
+            detail->cbSize = offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA_A, DevicePath) + sizeof(char);
             ret = pSetupDiGetDeviceInterfaceDetailA(set, &interfaceData, detail,
                     size, &size, NULL);
             ok(ret, "SetupDiGetDeviceInterfaceDetailA failed: %d\n",




More information about the wine-cvs mailing list