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