From f99b6a99d98fed8b97d7b8bc1303258ce485c2ad Mon Sep 17 00:00:00 2001
From: foreman
Date: Fri, 22 Mar 2019 18:24:01 -0400
Subject: [PATCH] P4 to Git Change 1760530 by todli@todli-win-opencl-kv1 on
2019/03/22 17:00:25
SWDEV-182808 - Prevent ICD from loading outdated amdocl binary
1. Keep track of library name in KHRicdVendorRec
2. Check if library with the same name has already been loaded before adding it in ICD list
http://ocltc.amd.com/reviews/r/16989/
Affected files ...
... //depot/stg/opencl/drivers/opencl/api/opencl/khronos/icd/icd.c#12 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/khronos/icd/icd.h#11 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/khronos/icd/icd_linux.c#11 edit
... //depot/stg/opencl/drivers/opencl/api/opencl/khronos/icd/icd_windows.c#11 edit
[ROCm/clr commit: be5b5d86c3a8d9b571c237196a82675e2c0c7672]
---
.../clr/opencl/api/opencl/khronos/icd/icd.c | 18 ++++++++++++++++++
.../clr/opencl/api/opencl/khronos/icd/icd.h | 3 +++
.../opencl/api/opencl/khronos/icd/icd_linux.c | 10 ++++++++++
.../api/opencl/khronos/icd/icd_windows.c | 12 +++++++++++-
4 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/projects/clr/opencl/api/opencl/khronos/icd/icd.c b/projects/clr/opencl/api/opencl/khronos/icd/icd.c
index fbb3120363..8405e5a5ab 100644
--- a/projects/clr/opencl/api/opencl/khronos/icd/icd.c
+++ b/projects/clr/opencl/api/opencl/khronos/icd/icd.c
@@ -75,6 +75,17 @@ void khrIcdVendorAdd(const char *libraryName)
goto Done;
}
+ // get the library's file name
+ const char *libName = libraryName;
+ const char *c;
+ for (c = libraryName; *c; ++c)
+ {
+ if ((*c == '\\') || (*c == '/'))
+ {
+ libName = c + 1;
+ }
+ }
+
// ensure that we haven't already loaded this vendor
for (vendorIterator = khrIcdVendors; vendorIterator; vendorIterator = vendorIterator->next)
{
@@ -83,6 +94,11 @@ void khrIcdVendorAdd(const char *libraryName)
KHR_ICD_TRACE("already loaded vendor %s, nothing to do here\n", libraryName);
goto Done;
}
+ if (!strcmp(vendorIterator->libName, libName))
+ {
+ KHR_ICD_TRACE("already loaded library %s, nothing to do here\n", libName);
+ goto Done;
+ }
}
// get the library's clGetExtensionFunctionAddress pointer
@@ -180,6 +196,8 @@ void khrIcdVendorAdd(const char *libraryName)
KHR_ICD_TRACE("failed get platform handle to library\n");
continue;
}
+ vendor->libName = (char *)malloc(strlen(libName) + 1);
+ strcpy(vendor->libName, libName);
vendor->clGetExtensionFunctionAddress = p_clGetExtensionFunctionAddress;
vendor->platform = platforms[i];
vendor->suffix = suffix;
diff --git a/projects/clr/opencl/api/opencl/khronos/icd/icd.h b/projects/clr/opencl/api/opencl/khronos/icd/icd.h
index 9221be4709..bb8a985dab 100644
--- a/projects/clr/opencl/api/opencl/khronos/icd/icd.h
+++ b/projects/clr/opencl/api/opencl/khronos/icd/icd.h
@@ -88,6 +88,9 @@ struct KHRicdVendorRec
// the loaded library object (true type varies on Linux versus Windows)
void *library;
+ // the file name of the library
+ char *libName;
+
// the extension suffix for this platform
char *suffix;
diff --git a/projects/clr/opencl/api/opencl/khronos/icd/icd_linux.c b/projects/clr/opencl/api/opencl/khronos/icd/icd_linux.c
index 31097f5978..b5f2959d9d 100644
--- a/projects/clr/opencl/api/opencl/khronos/icd/icd_linux.c
+++ b/projects/clr/opencl/api/opencl/khronos/icd/icd_linux.c
@@ -160,6 +160,16 @@ Cleanup:
{
closedir(dir);
}
+
+ KHRicdVendor *vendorIterator;
+ for (vendorIterator = khrIcdVendors; vendorIterator; vendorIterator = vendorIterator->next)
+ {
+ if (vendorIterator->libName != NULL)
+ {
+ free(vendorIterator->libName);
+ vendorIterator->libName = NULL;
+ }
+ }
}
// go through the list of vendors only once
diff --git a/projects/clr/opencl/api/opencl/khronos/icd/icd_windows.c b/projects/clr/opencl/api/opencl/khronos/icd/icd_windows.c
index ccdf99ccbd..93f9df8ac0 100644
--- a/projects/clr/opencl/api/opencl/khronos/icd/icd_windows.c
+++ b/projects/clr/opencl/api/opencl/khronos/icd/icd_windows.c
@@ -130,7 +130,17 @@ BOOL CALLBACK khrIcdOsVendorsEnumerate(PINIT_ONCE InitOnce, PVOID Parameter, PVO
{
KHR_ICD_TRACE("Failed to close platforms key %s, ignoring\n", platformsName);
}
-
+
+ KHRicdVendor *vendorIterator;
+ for (vendorIterator = khrIcdVendors; vendorIterator; vendorIterator = vendorIterator->next)
+ {
+ if (vendorIterator->libName != NULL)
+ {
+ free(vendorIterator->libName);
+ vendorIterator->libName = NULL;
+ }
+ }
+
return TRUE;
}