Prevent page faults in SetupDiDeleteDeviceInterfaceRegKey

Christopher Berner raccoonone at procyongames.com
Sun Mar 30 18:54:31 CDT 2008


---
 dlls/setupapi/devinst.c       |    5 +++--
 dlls/setupapi/tests/devinst.c |   34 ++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 936f6a7..5616860 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -2669,13 +2669,14 @@ BOOL WINAPI SetupDiDeleteDeviceInterfaceRegKey(
 
     TRACE("%p %p %d\n", DeviceInfoSet, DeviceInterfaceData, Reserved);
 
-    if (!DeviceInfoSet || DeviceInfoSet == INVALID_HANDLE_VALUE ||
+    if (!DeviceInfoSet || DeviceInfoSet == INVALID_HANDLE_VALUE || 
+            IsBadReadPtr(set, sizeof(struct DeviceInfoSet)) || 
             set->magic != SETUP_DEVICE_INFO_SET_MAGIC)
     {
         SetLastError(ERROR_INVALID_HANDLE);
         return FALSE;
     }
-    if (!DeviceInterfaceData ||
+    if (!DeviceInterfaceData || IsBadReadPtr(DeviceInterfaceData, sizeof(SP_DEVICE_INTERFACE_DATA)) ||
             DeviceInterfaceData->cbSize != sizeof(SP_DEVICE_INTERFACE_DATA) ||
             !DeviceInterfaceData->Reserved)
     {
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c
index 2704d31..9723a38 100644
--- a/dlls/setupapi/tests/devinst.c
+++ b/dlls/setupapi/tests/devinst.c
@@ -568,6 +568,39 @@ static void testCreateDeviceInterface(void)
     }
 }
 
+static void testDeleteDeviceInterfaceRegKey(void)
+{
+    BOOL ret;
+    GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04,
+        0x00,0x11,0x95,0x5c,0x2b,0xdb}};
+    HDEVINFO hdev_bad = (HDEVINFO)1, hdev_good;
+    SP_DEVINFO_DATA devinfo = { sizeof(devinfo), { 0 } };
+    PSP_DEVICE_INTERFACE_DATA interface_bad = (PSP_DEVICE_INTERFACE_DATA)1;
+    SP_DEVICE_INTERFACE_DATA interface_good = { sizeof(interface_good),{ 0 } };
+
+    hdev_good = SetupDiCreateDeviceInfoList(&guid, NULL);
+    ok(hdev_good != NULL, "SetupDiCreateDevinceInfoList failed: %d\n", GetLastError());
+    
+    ret = SetupDiCreateDeviceInfoA(hdev_good, "ROOT\\LEGACY_BOGUS\\0000", &guid, NULL, NULL, 0, &devinfo);
+    ok(ret, "SetupDiCreateDeviceInfoA failed: %d\n", GetLastError());
+    ret = SetupDiCreateDeviceInterfaceA(hdev_good, &devinfo, &guid, NULL, 0, &interface_good);
+    ok(ret, "SetupDiCreateDeviceInterfaceA failed: %d\n", GetLastError());
+
+    /* try to delete invalid HDEVINFO */
+    ret = SetupDiDeleteDeviceInterfaceRegKey(hdev_bad, &interface_good, 0);
+    ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, "Expected SetupDiDeleteDeviceInterfaceRegKey to return FALSE, got %s, \
+with error code: 6, got %d\n", ret ? "TRUE" : "FALSE", GetLastError());
+    /* try to delete invalid PSP_DEVICE_INTERFACE_DATA */
+    ret = SetupDiDeleteDeviceInterfaceRegKey(hdev_good, interface_bad, 0);
+    ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "Expected SetupDiDeleteDeviceInterfaceRegKey to return FALSE, got %s, \
+with error code: 87, got %d\n", ret ? "TRUE" : "FALSE", GetLastError());
+    /* try to delete invalid HDEVINFO and PSP_DEVICE_INTERFACE_DATA */
+    ret = SetupDiDeleteDeviceInterfaceRegKey(hdev_bad, interface_bad, 0);
+    ok(!ret && GetLastError() == ERROR_INVALID_HANDLE, "Expected SetupDiDeleteDeviceInterfaceRegKey to return FALSE, got %s, \
+with error code: 6, got %d\n", ret ? "TRUE" : "FALSE", GetLastError());
+    SetupDiDestroyDeviceInfoList(hdev_good);
+}
+
 static void testGetDeviceInterfaceDetail(void)
 {
     BOOL ret;
@@ -799,4 +832,5 @@ START_TEST(devinst)
     testCreateDeviceInterface();
     testGetDeviceInterfaceDetail();
     testDevRegKey();
+    testDeleteDeviceInterfaceRegKey();
 }
-- 
1.5.2.5


--------------050605030607060208040600--



More information about the wine-patches mailing list