Skip to content

Commit 1f12fdf

Browse files
derek-gerstmannDerek Gerstmann
authored andcommitted
[vulkan] Fix heap buffer overflow in Vulkan extension handling discovered by ASAN (halide#7740)
Fix heap buffer overflow in Vulkan extension handling discovered by ASAN Co-authored-by: Derek Gerstmann <dgerstmann@adobe.com>
1 parent c18243d commit 1f12fdf

File tree

3 files changed

+17
-17
lines changed

3 files changed

+17
-17
lines changed

src/runtime/internal/string_table.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class StringTable {
2828
void clear(void *user_context);
2929

3030
// fills the contents of the table (copies strings from given array)
31-
void fill(void *user_context, const char **array, size_t coun);
31+
void fill(void *user_context, const char **array, size_t count);
3232

3333
// assign the entry at given index the given string
3434
void assign(void *user_context, size_t index, const char *str, size_t length = 0); // if length is zero, strlen is used
@@ -88,9 +88,10 @@ StringTable::~StringTable() {
8888

8989
void StringTable::resize(void *user_context, size_t capacity) {
9090
pointers.resize(user_context, capacity);
91-
while (contents.size() < capacity) {
91+
contents.resize(user_context, capacity);
92+
for (size_t n = 0; n < contents.size(); ++n) {
9293
StringStorage *storage_ptr = StringStorage::create(user_context, contents.current_allocator());
93-
contents.append(user_context, storage_ptr);
94+
contents.assign(user_context, n, storage_ptr);
9495
}
9596
}
9697

src/runtime/vulkan_context.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,13 +312,13 @@ int vk_create_device(void *user_context, const StringTable &requested_layers, Vk
312312
}
313313

314314
debug(user_context) << " found " << (uint32_t)required_device_extensions.size() << " required extensions for device!\n";
315-
for (int n = 0; n < (int)required_device_extensions.size(); ++n) {
315+
for (uint32_t n = 0; n < required_device_extensions.size(); ++n) {
316316
debug(user_context) << " required extension: " << required_device_extensions[n] << "\n";
317317
}
318318

319319
// enable all available optional extensions
320320
debug(user_context) << " checking for " << (uint32_t)optional_device_extensions.size() << " optional extensions for device ...\n";
321-
for (int n = 0; n < (int)optional_device_extensions.size(); ++n) {
321+
for (uint32_t n = 0; n < optional_device_extensions.size(); ++n) {
322322
if (supported_device_extensions.contains(optional_device_extensions[n])) {
323323
debug(user_context) << " optional extension: " << optional_device_extensions[n] << "\n";
324324
required_device_extensions.append(user_context, optional_device_extensions[n]);

src/runtime/vulkan_extensions.h

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,10 @@ uint32_t vk_get_supported_instance_extensions(void *user_context, StringTable &e
153153
return 0;
154154
}
155155

156+
debug(user_context) << "Vulkan: Checking vkEnumerateInstanceExtensionProperties for extensions ...\n";
157+
156158
uint32_t avail_ext_count = 0;
157159
vkEnumerateInstanceExtensionProperties(nullptr, &avail_ext_count, nullptr);
158-
debug(user_context) << "Vulkan: vkEnumerateInstanceExtensionProperties found " << avail_ext_count << " extensions ...\n";
159160

160161
if (avail_ext_count) {
161162
BlockStorage::Config config;
@@ -170,7 +171,7 @@ uint32_t vk_get_supported_instance_extensions(void *user_context, StringTable &e
170171

171172
for (uint32_t n = 0; n < avail_ext_count; ++n) {
172173
const VkExtensionProperties *properties = static_cast<const VkExtensionProperties *>(extension_properties[n]);
173-
debug(user_context) << " extension: " << properties->extensionName << "\n";
174+
debug(user_context) << " [" << n << "]: " << properties->extensionName << "\n";
174175
}
175176

176177
ext_table.resize(user_context, avail_ext_count);
@@ -179,7 +180,7 @@ uint32_t vk_get_supported_instance_extensions(void *user_context, StringTable &e
179180
ext_table.assign(user_context, n, properties->extensionName);
180181
}
181182
}
182-
183+
debug(user_context) << "Vulkan: vkEnumerateInstanceExtensionProperties found " << avail_ext_count << " extensions ...\n";
183184
return avail_ext_count;
184185
}
185186

@@ -197,11 +198,7 @@ uint32_t vk_get_optional_device_extensions(void *user_context, StringTable &ext_
197198
"VK_KHR_shader_float16_int8",
198199
"VK_KHR_shader_float_controls"};
199200
const uint32_t optional_ext_count = sizeof(optional_ext_table) / sizeof(optional_ext_table[0]);
200-
201-
ext_table.resize(user_context, optional_ext_count);
202-
for (uint32_t n = 0; n < optional_ext_count; ++n) {
203-
ext_table.assign(user_context, n, optional_ext_table[n]);
204-
}
201+
ext_table.fill(user_context, (const char **)optional_ext_table, optional_ext_count);
205202
return optional_ext_count;
206203
}
207204

@@ -212,10 +209,10 @@ uint32_t vk_get_supported_device_extensions(void *user_context, VkPhysicalDevice
212209
return 0;
213210
}
214211

212+
debug(user_context) << "Vulkan: Checking vkEnumerateDeviceExtensionProperties for extensions ...\n";
213+
215214
uint32_t avail_ext_count = 0;
216215
vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &avail_ext_count, nullptr);
217-
debug(user_context) << "Vulkan: vkEnumerateDeviceExtensionProperties found " << avail_ext_count << " extensions ...\n";
218-
219216
if (avail_ext_count > 0) {
220217
BlockStorage::Config config;
221218
config.entry_size = sizeof(VkExtensionProperties);
@@ -229,7 +226,7 @@ uint32_t vk_get_supported_device_extensions(void *user_context, VkPhysicalDevice
229226

230227
for (uint32_t n = 0; n < avail_ext_count; ++n) {
231228
const VkExtensionProperties *properties = static_cast<const VkExtensionProperties *>(extension_properties[n]);
232-
debug(user_context) << " extension: " << properties->extensionName << "\n";
229+
debug(user_context) << " [" << n << "]: " << properties->extensionName << "\n";
233230
}
234231

235232
ext_table.resize(user_context, avail_ext_count);
@@ -239,17 +236,19 @@ uint32_t vk_get_supported_device_extensions(void *user_context, VkPhysicalDevice
239236
}
240237
}
241238

239+
debug(user_context) << "Vulkan: vkEnumerateDeviceExtensionProperties found " << avail_ext_count << " extensions ...\n";
242240
return avail_ext_count;
243241
}
244242

245243
bool vk_validate_required_extension_support(void *user_context,
246244
const StringTable &required_extensions,
247245
const StringTable &supported_extensions) {
246+
debug(user_context) << "Vulkan: Validating " << uint32_t(required_extensions.size()) << " extensions ...\n";
248247
bool validated = true;
249248
for (uint32_t n = 0; n < required_extensions.size(); ++n) {
250249
const char *extension = required_extensions[n];
251250
if (!supported_extensions.contains(extension)) {
252-
debug(user_context) << "Vulkan: Missing required extension: '" << extension << "'! \n";
251+
debug(user_context) << "Vulkan: Missing required extension: '" << extension << "'!\n";
253252
validated = false;
254253
}
255254
}

0 commit comments

Comments
 (0)