layers: Fix white_list string comparison data
Existing extension name comparisons produced false positives when
extensions shared common roots. Moved to a set of explicit strings.
Change-Id: I2951927ddfaedce1e7a9784d3b261a1fab830103
diff --git a/layers/vk_layer_utils.cpp b/layers/vk_layer_utils.cpp
index 7f5dbf5..e25a10e 100644
--- a/layers/vk_layer_utils.cpp
+++ b/layers/vk_layer_utils.cpp
@@ -73,12 +73,8 @@
return result;
}
-// Utility function for finding a text string in another string
-VK_LAYER_EXPORT bool white_list(const char *item, const char *list) {
- std::string candidate(item);
- std::string white_list(list);
- return (white_list.find(candidate) != std::string::npos);
-}
+// Utility function for determining if a string is in a set of strings
+VK_LAYER_EXPORT bool white_list(const char *item, const std::set<std::string> &list) { return (list.find(item) != list.end()); }
// Debug callbacks get created in three ways:
// o Application-defined debug callbacks
diff --git a/layers/vk_layer_utils.h b/layers/vk_layer_utils.h
index b4e95ac..710cc78 100644
--- a/layers/vk_layer_utils.h
+++ b/layers/vk_layer_utils.h
@@ -23,6 +23,7 @@
#include <stdbool.h>
#include <string>
#include <vector>
+#include <set>
#include "vk_format_utils.h"
#include "vk_layer_logging.h"
@@ -134,7 +135,7 @@
const VkAllocationCallbacks *pAllocator, const char *layer_identifier);
VK_LAYER_EXPORT VkStringErrorFlags vk_string_validate(const int max_length, const char *char_array);
-VK_LAYER_EXPORT bool white_list(const char *item, const char *whitelist);
+VK_LAYER_EXPORT bool white_list(const char *item, const std::set<std::string> &whitelist);
static inline int u_ffs(int val) {
#ifdef WIN32
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index e47d759..d4187ae 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -498,6 +498,7 @@
'#include <string>',
'#include <unordered_map>',
'#include <utility>',
+ '#include <set>',
'',
'#include <vulkan/vulkan.h>',
'']
@@ -638,9 +639,9 @@
'};'])
# Output reference lists of instance/device extension names
- struct.extend(['', 'static const char * const k%sExtensionNames = ' % type])
- struct.extend([guarded(info['ifdef'], ' %s' % info['define']) for ext_name, info in extension_items])
- struct.extend([';', ''])
+ struct.extend(['', 'static const std::set<std::string> k%sExtensionNames = {' % type])
+ struct.extend([guarded(info['ifdef'], ' %s,' % info['define']) for ext_name, info in extension_items])
+ struct.extend(['};', ''])
output.extend(struct)
output.extend(['', '#endif // VK_EXTENSION_HELPER_H_'])