Skip to content
Snippets Groups Projects
Commit 7829b4d3 authored by andreykproductengine's avatar andreykproductengine
Browse files

SL-3221 Safeguard against crashes in LLDXHardware

parent 246db89a
No related branches found
No related tags found
No related merge requests found
...@@ -613,6 +613,7 @@ BOOL LLDXHardware::getInfo(BOOL vram_only) ...@@ -613,6 +613,7 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
IDxDiagContainer *device_containerp = NULL; IDxDiagContainer *device_containerp = NULL;
IDxDiagContainer *file_containerp = NULL; IDxDiagContainer *file_containerp = NULL;
IDxDiagContainer *driver_containerp = NULL; IDxDiagContainer *driver_containerp = NULL;
DWORD dw_device_count;
// CoCreate a IDxDiagProvider* // CoCreate a IDxDiagProvider*
LL_DEBUGS("AppInit") << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL; LL_DEBUGS("AppInit") << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL;
...@@ -663,9 +664,18 @@ BOOL LLDXHardware::getInfo(BOOL vram_only) ...@@ -663,9 +664,18 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp); hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp);
if(FAILED(hr) || !devices_containerp) if(FAILED(hr) || !devices_containerp)
{ {
// do not release 'dirty' devices_containerp at this stage, only dx_diag_rootp
devices_containerp = NULL;
goto LCleanup; goto LCleanup;
} }
// make sure there is something inside
hr = devices_containerp->GetNumberOfChildContainers(&dw_device_count);
if (FAILED(hr) || dw_device_count == 0)
{
goto LCleanup;
}
// Get device 0 // Get device 0
LL_DEBUGS("AppInit") << "devices_containerp->GetChildContainer" << LL_ENDL; LL_DEBUGS("AppInit") << "devices_containerp->GetChildContainer" << LL_ENDL;
hr = devices_containerp->GetChildContainer(L"0", &device_containerp); hr = devices_containerp->GetChildContainer(L"0", &device_containerp);
...@@ -872,6 +882,7 @@ LLSD LLDXHardware::getDisplayInfo() ...@@ -872,6 +882,7 @@ LLSD LLDXHardware::getDisplayInfo()
IDxDiagContainer *device_containerp = NULL; IDxDiagContainer *device_containerp = NULL;
IDxDiagContainer *file_containerp = NULL; IDxDiagContainer *file_containerp = NULL;
IDxDiagContainer *driver_containerp = NULL; IDxDiagContainer *driver_containerp = NULL;
DWORD dw_device_count;
// CoCreate a IDxDiagProvider* // CoCreate a IDxDiagProvider*
LL_INFOS() << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL; LL_INFOS() << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL;
...@@ -922,9 +933,18 @@ LLSD LLDXHardware::getDisplayInfo() ...@@ -922,9 +933,18 @@ LLSD LLDXHardware::getDisplayInfo()
hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp); hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp);
if(FAILED(hr) || !devices_containerp) if(FAILED(hr) || !devices_containerp)
{ {
// do not release 'dirty' devices_containerp at this stage, only dx_diag_rootp
devices_containerp = NULL;
goto LCleanup; goto LCleanup;
} }
// make sure there is something inside
hr = devices_containerp->GetNumberOfChildContainers(&dw_device_count);
if (FAILED(hr) || dw_device_count == 0)
{
goto LCleanup;
}
// Get device 0 // Get device 0
LL_INFOS() << "devices_containerp->GetChildContainer" << LL_ENDL; LL_INFOS() << "devices_containerp->GetChildContainer" << LL_ENDL;
hr = devices_containerp->GetChildContainer(L"0", &device_containerp); hr = devices_containerp->GetChildContainer(L"0", &device_containerp);
...@@ -976,6 +996,10 @@ LLSD LLDXHardware::getDisplayInfo() ...@@ -976,6 +996,10 @@ LLSD LLDXHardware::getDisplayInfo()
} }
LCleanup: LCleanup:
if (ret.emptyMap())
{
LL_INFOS() << "Failed to get data, cleaning up" << LL_ENDL;
}
SAFE_RELEASE(file_containerp); SAFE_RELEASE(file_containerp);
SAFE_RELEASE(driver_containerp); SAFE_RELEASE(driver_containerp);
SAFE_RELEASE(device_containerp); SAFE_RELEASE(device_containerp);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment