Add return value checks for adapterAdd.
authorNikhil Joshi <nikhilj@nvidia.com>
Tue, 3 Sep 2019 05:11:25 +0000 (10:41 +0530)
committerNikhil Joshi <nikhilj@nvidia.com>
Tue, 3 Sep 2019 12:00:16 +0000 (17:30 +0530)
Return boolean result from adapterAdd API
and add checks for success of this API
for better error reporting.

loader/windows/icd_windows.c
loader/windows/icd_windows_dxgk.c
loader/windows/icd_windows_hkr.c
loader/windows/icd_windows_hkr.h

index cf6ff73..f89fa25 100644 (file)
@@ -41,8 +41,9 @@ static WinAdapter* pWinAdapterBegin = NULL;
 static WinAdapter* pWinAdapterEnd = NULL;
 static WinAdapter* pWinAdapterCapacity = NULL;
 
-void adapterAdd(const char* szName, LUID luid)
+BOOL adapterAdd(const char* szName, LUID luid)
 {
+    BOOL result = TRUE; 
     if (pWinAdapterEnd == pWinAdapterCapacity)
     {
         size_t oldCapacity = pWinAdapterCapacity - pWinAdapterBegin;
@@ -51,10 +52,13 @@ void adapterAdd(const char* szName, LUID luid)
         {
             newCapacity = 1;
         }
-        newCapacity *= 2;
+       else 
+            newCapacity *= 2;
 
         WinAdapter* pNewBegin = malloc(newCapacity * sizeof(*pWinAdapterBegin));
-        if (pNewBegin)
+        if (!pNewBegin)
+           result = FALSE;
+       else
         {
             if (pWinAdapterBegin)
             {
@@ -69,13 +73,17 @@ void adapterAdd(const char* szName, LUID luid)
     if (pWinAdapterEnd != pWinAdapterCapacity)
     {
         size_t nameLen = (strlen(szName) + 1)*sizeof(szName[0]);
-        if (pWinAdapterEnd->szName = malloc(nameLen))
-        {
+        pWinAdapterEnd->szName = malloc(nameLen);
+       if (!pWinAdapterEnd->szName)
+           result = FALSE;
+       else 
+       {
             memcpy(pWinAdapterEnd->szName, szName, nameLen);
             pWinAdapterEnd->luid = luid;
             ++pWinAdapterEnd;
         }
     }
+    return result;
 }
 
 /*
@@ -89,6 +97,7 @@ void adapterAdd(const char* szName, LUID luid)
 BOOL CALLBACK khrIcdOsVendorsEnumerate(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContext)
 {
     LONG result;
+    BOOL status = FALSE;
     const char* platformsName = "SOFTWARE\\Khronos\\OpenCL\\Vendors";
     HKEY platformsKey = NULL;
     DWORD dwIndex;
@@ -157,7 +166,7 @@ BOOL CALLBACK khrIcdOsVendorsEnumerate(PINIT_ONCE InitOnce, PVOID Parameter, PVO
                 continue;
             }
             // add the library
-            adapterAdd(cszLibraryName, ZeroLuid);
+            status |= adapterAdd(cszLibraryName, ZeroLuid);
         }
     }
 
@@ -207,7 +216,7 @@ BOOL CALLBACK khrIcdOsVendorsEnumerate(PINIT_ONCE InitOnce, PVOID Parameter, PVO
     {
         KHR_ICD_TRACE("Failed to close platforms key %s, ignoring\n", platformsName);
     }
-    return TRUE;
+    return status;
 }
 
 // go through the list of vendors only once
index 542f2ea..cf59f68 100644 (file)
@@ -35,6 +35,7 @@ typedef LONG NTSTATUS;
 bool khrIcdOsVendorsEnumerateDXGK(void)
 {
     bool ret = false;
+    int result = 0;
 #if defined(OPENCL_ICD_LOADER_REQUIRE_WDK)
 #if defined(DXGKDDI_INTERFACE_VERSION_WDDM2_4) && (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_4)
     // Get handle to GDI Runtime
@@ -97,13 +98,17 @@ bool khrIcdOsVendorsEnumerateDXGK(void)
             queryArgs.QueryType = D3DDDI_QUERYREGISTRY_ADAPTERKEY;
             queryArgs.QueryFlags.TranslatePath = TRUE;
             queryArgs.ValueType = REG_SZ;
-            MultiByteToWideChar(
-                CP_ACP,
-                0,
-                cszOpenCLRegKeyName,
-                szOpenCLRegKeyName,
-                queryArgs.ValueName,
-                ARRAYSIZE(queryArgs.ValueName));
+           result = MultiByteToWideChar(
+                       CP_ACP,
+                       0,
+                       cszOpenCLRegKeyName,
+                       szOpenCLRegKeyName,
+                       queryArgs.ValueName,
+                       ARRAYSIZE(queryArgs.ValueName));
+           if (!result) {
+               KHR_ICD_TRACE("MultiByteToWideChar status != SUCCESS\n");
+                continue;
+           }
             D3DKMT_QUERYADAPTERINFO queryAdapterInfo = {0};
             queryAdapterInfo.hAdapter = pAdapterInfo[AdapterIndex].hAdapter;
             queryAdapterInfo.Type = KMTQAITYPE_QUERYREGISTRY;
@@ -133,7 +138,7 @@ bool khrIcdOsVendorsEnumerateDXGK(void)
                 {
                     size_t len = wcstombs(cszLibraryName, pWchar, sizeof(cszLibraryName));
                     KHR_ICD_ASSERT(len == (sizeof(cszLibraryName) - 1));
-                    adapterAdd(cszLibraryName, pAdapterInfo[AdapterIndex].AdapterLuid);
+                    ret |= adapterAdd(cszLibraryName, pAdapterInfo[AdapterIndex].AdapterLuid);
                 }
             }
             else if (Status == STATUS_INVALID_PARAMETER && pQueryArgs->Status == D3DDDI_QUERYREGISTRY_STATUS_FAIL)
@@ -143,7 +148,6 @@ bool khrIcdOsVendorsEnumerateDXGK(void)
             }
             free(pQueryBuffer);
         }
-        ret = true;
 out:
       free(pAdapterInfo);
     }
index 791dc79..060ce5b 100644 (file)
@@ -137,9 +137,7 @@ static bool ReadOpenCLKey(DEVINST dnDevNode)
 
         KHR_ICD_TRACE("    Path: %s\n", cszOclPath);
 
-        adapterAdd(cszOclPath, ZeroLuid);
-
-        bRet = true;
+        bRet |= adapterAdd(cszOclPath, ZeroLuid);
     }
 
 out:
index fcaa93a..8aef473 100644 (file)
@@ -23,7 +23,7 @@ bool khrIcdOsVendorsEnumerateHKR(void);
 
 extern const LUID ZeroLuid;
 
-void adapterAdd(const char* szName, LUID luid);
+BOOL adapterAdd(const char* szName, LUID luid);
 
 // Do not free the memory returned by this function.
 const char* GetOpenCLRegKeyName(void);