Author: khornicek Date: Thu Feb 2 19:41:19 2017 New Revision: 73669 URL: http://svn.reactos.org/svn/reactos?rev=73669&view=rev Log: [SETUPAPI] - remove logically dead code in SetupDiGetClassImageIndex, CID 500046 - prevent null pointer dereference in SetupDiGetClassDevPropertySheetsA, CID 500676 - use strsafe functions in SETUP_CreateDevicesListFromEnumerator, CID 514263 - fix a check and adjust the logic in SetupDiLoadClassIcon to remove dead code and possible null pointer dereference CID 1250279, CID 1250287
Modified: trunk/reactos/dll/win32/setupapi/devclass.c Modified: trunk/reactos/dll/win32/setupapi/devclass.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/setupapi/devclass.c?rev=73669&r1=73668&r2=73669&view=diff ============================================================================== --- trunk/reactos/dll/win32/setupapi/devclass.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/setupapi/devclass.c [iso-8859-1] Thu Feb 2 19:41:19 2017 @@ -23,6 +23,7 @@ #include <wingdi.h> #include <shellapi.h> +#include <strsafe.h> /* Unicode constants */ static const WCHAR BackSlash[] = {'\\',0}; @@ -164,10 +165,16 @@ rc = RegOpenKeyExW(hEnumeratorKey, KeyBuffer, 0, KEY_ENUMERATE_SUB_KEYS, &hDeviceIdKey); if (rc != ERROR_SUCCESS) goto cleanup; - strcpyW(InstancePath, Enumerator); - strcatW(InstancePath, BackSlash); - strcatW(InstancePath, KeyBuffer); - strcatW(InstancePath, BackSlash); + + if (FAILED(StringCbCopyW(InstancePath, _countof(InstancePath), Enumerator)) || + FAILED(StringCbCatW(InstancePath, _countof(InstancePath), BackSlash)) || + FAILED(StringCbCatW(InstancePath, _countof(InstancePath), KeyBuffer)) || + FAILED(StringCbCatW(InstancePath, _countof(InstancePath), BackSlash))) + { + rc = ERROR_GEN_FAILURE; + goto cleanup; + } + pEndOfInstancePath = &InstancePath[strlenW(InstancePath)]; /* Enumerate instance IDs (subkeys of hDeviceIdKey) */ @@ -406,8 +413,6 @@ SetLastError(ERROR_INVALID_USER_BUFFER); else if (list->magic != SETUP_CLASS_IMAGE_LIST_MAGIC) SetLastError(ERROR_INVALID_USER_BUFFER); - else if (!ImageIndex) - SetLastError(ERROR_INVALID_PARAMETER); else { DWORD i; @@ -784,13 +789,9 @@ if (LargeIcon) { if(!SETUP_GetClassIconInfo(ClassGuid, &iconIndex, &DllName)) - return FALSE; - - if (DllName && ExtractIconExW(DllName, -iconIndex, &hIcon, NULL, 1) == 1 && hIcon != NULL) - { - ret = TRUE; - } - else + goto cleanup; + + if (!DllName || ExtractIconExW(DllName, -iconIndex, &hIcon, NULL, 1) != 1 || hIcon == NULL) { /* load the default unknown device icon if ExtractIcon failed */ if(DllName) @@ -798,16 +799,17 @@ hIcon = LoadImage(hInstance, MAKEINTRESOURCE(iconIndex), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); - if(!LargeIcon) - goto cleanup; - } + if(!hIcon) + goto cleanup; + } + + *LargeIcon = hIcon; } if (MiniIconIndex) *MiniIconIndex = iconIndex; ret = TRUE; - *LargeIcon = hIcon; cleanup: @@ -1180,9 +1182,12 @@ PropertySheetHeader, PropertySheetHeaderPageListSize, RequiredSize, PropertySheetType); - psh.dwFlags = PropertySheetHeader->dwFlags; - psh.phpage = PropertySheetHeader->phpage; - psh.nPages = PropertySheetHeader->nPages; + if(PropertySheetHeader) + { + psh.dwFlags = PropertySheetHeader->dwFlags; + psh.phpage = PropertySheetHeader->phpage; + psh.nPages = PropertySheetHeader->nPages; + } ret = SetupDiGetClassDevPropertySheetsW(DeviceInfoSet, DeviceInfoData, PropertySheetHeader ? &psh : NULL, PropertySheetHeaderPageListSize, RequiredSize,