[arch-commits] Commit in vulkan-icd-loader/trunk (2 files)

Laurent Carlier lcarlier at gemini.archlinux.org
Sat Nov 27 09:14:31 UTC 2021


    Date: Saturday, November 27, 2021 @ 09:14:31
  Author: lcarlier
Revision: 429388

upgpkg: vulkan-icd-loader 1.2.199-2: fix segfault with mesa drivers

Added:
  vulkan-icd-loader/trunk/0001-Dont-call-ToolProps-on-drivers-without-support.patch
Modified:
  vulkan-icd-loader/trunk/PKGBUILD

-----------------------------------------------------------+
 0001-Dont-call-ToolProps-on-drivers-without-support.patch |  126 ++++++++++++
 PKGBUILD                                                  |   15 +
 2 files changed, 138 insertions(+), 3 deletions(-)

Added: 0001-Dont-call-ToolProps-on-drivers-without-support.patch
===================================================================
--- 0001-Dont-call-ToolProps-on-drivers-without-support.patch	                        (rev 0)
+++ 0001-Dont-call-ToolProps-on-drivers-without-support.patch	2021-11-27 09:14:31 UTC (rev 429388)
@@ -0,0 +1,126 @@
+From 22e9c7c538a2d2cfe2a81cb4fee6a710798b8f11 Mon Sep 17 00:00:00 2001
+From: Charles Giessen <charles at lunarg.com>
+Date: Wed, 17 Nov 2021 14:44:11 -0700
+Subject: [PATCH] Dont call ToolProps on drivers without support
+
+The loader recently added support for calling into drivers in
+vkGetPhysicalDeviceToolPropertieesEXT. However, it only used the value of
+the function pointer to determine if it was safe. It was found that Mesa
+drivers will return a non-null function pointer, even though they do not
+support the extension, and so the loader called this function pointer which
+would then segfault.
+
+The loader prevents this by first checking if the extension is supported by
+the physical device. This necessitates calling
+vkEnumerateDeviceExtensionProperties and allocating some memory on each call
+but since the number of times this function is called should be low, it is
+not an undue performance burden. In the future, the loader should cache the
+list of extensions when calling vkEnumeratePhysicalDevices so that checking if
+a extension function is supported is fast and easy.
+
+Signed-off-by: Laurent Carlier <lordheavym at gmail.com>
+---
+ loader/extension_manual.c         | 46 ++++++++++++++++++++++++++++---
+ tests/loader_regression_tests.cpp | 21 ++++++++++++--
+ 2 files changed, 61 insertions(+), 6 deletions(-)
+
+diff --git a/loader/extension_manual.c b/loader/extension_manual.c
+index 415b64b74..65c573d91 100644
+--- a/loader/extension_manual.c
++++ b/loader/extension_manual.c
+@@ -305,11 +305,49 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_GetPhysicalDeviceToolPropertiesEXT(VkP
+     struct loader_physical_device_term *phys_dev_term = (struct loader_physical_device_term *)physicalDevice;
+     struct loader_icd_term *icd_term = phys_dev_term->this_icd_term;
+ 
+-    if (icd_term->dispatch.GetPhysicalDeviceToolPropertiesEXT) {
+-        return icd_term->dispatch.GetPhysicalDeviceToolPropertiesEXT(phys_dev_term->phys_dev, pToolCount, pToolProperties);
++    bool tooling_info_supported = false;
++    uint32_t ext_count = 0;
++    VkExtensionProperties *ext_props = NULL;
++    VkResult res = VK_SUCCESS;
++    VkResult enumerate_res = VK_SUCCESS;
++
++    enumerate_res = icd_term->dispatch.EnumerateDeviceExtensionProperties(phys_dev_term->phys_dev, NULL, &ext_count, NULL);
++    if (enumerate_res != VK_SUCCESS) {
++        goto out;
+     }
+ 
++    ext_props = loader_instance_heap_alloc(icd_term->this_instance, sizeof(VkExtensionProperties) * ext_count,
++                                           VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
++    if (!ext_props) {
++        res = VK_ERROR_OUT_OF_HOST_MEMORY;
++        goto out;
++    }
++
++    enumerate_res = icd_term->dispatch.EnumerateDeviceExtensionProperties(phys_dev_term->phys_dev, NULL, &ext_count, ext_props);
++    if (enumerate_res != VK_SUCCESS) {
++        goto out;
++    }
++
++    for (uint32_t i = 0; i < ext_count; i++) {
++        if (strncmp(ext_props[i].extensionName, VK_EXT_TOOLING_INFO_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE) == 0) {
++            tooling_info_supported = true;
++            break;
++        }
++    }
++
++    if (tooling_info_supported && icd_term->dispatch.GetPhysicalDeviceToolPropertiesEXT) {
++        res = icd_term->dispatch.GetPhysicalDeviceToolPropertiesEXT(phys_dev_term->phys_dev, pToolCount, pToolProperties);
++    }
++
++out:
+     // In the case the driver didn't support the extension, make sure that the first layer doesn't find the count uninitialized
+-    *pToolCount = 0;
+-    return VK_SUCCESS;
++    if (!tooling_info_supported || !icd_term->dispatch.GetPhysicalDeviceToolPropertiesEXT) {
++        *pToolCount = 0;
++    }
++
++    if (ext_props) {
++        loader_instance_heap_free(icd_term->this_instance, ext_props);
++    }
++
++    return res;
+ }
+diff --git a/tests/loader_regression_tests.cpp b/tests/loader_regression_tests.cpp
+index d1687a4f5..469aa8925 100644
+--- a/tests/loader_regression_tests.cpp
++++ b/tests/loader_regression_tests.cpp
+@@ -849,7 +849,24 @@ TEST(ExtensionManual, ToolingProperties) {
+                                                      VK_TOOL_PURPOSE_VALIDATION_BIT_EXT,
+                                                      "This tool does not exist",
+                                                      "No-Layer"};
+-    {  // extension
++    {  // No support in driver
++        SingleICDShim env{TestICDDetails{TEST_ICD_PATH_VERSION_6}};
++        env.get_test_icd().physical_devices.push_back({});
++
++        InstWrapper inst{env.vulkan_functions};
++        inst.CheckCreate();
++
++        auto phys_dev = inst.GetPhysDev();
++
++        auto getToolProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceToolPropertiesEXT>(
++            inst.functions->vkGetInstanceProcAddr(inst, "vkGetPhysicalDeviceToolPropertiesEXT"));
++        handle_assert_has_value(getToolProperties);
++
++        uint32_t tool_count = 0;
++        ASSERT_EQ(VK_SUCCESS, getToolProperties(phys_dev, &tool_count, nullptr));
++        ASSERT_EQ(tool_count, 0);
++    }
++    {  // extension is supported in driver
+         SingleICDShim env{TestICDDetails{TEST_ICD_PATH_VERSION_6}};
+         env.get_test_icd().physical_devices.push_back({});
+         env.get_test_icd().supports_tooling_info_ext = true;
+@@ -864,7 +881,7 @@ TEST(ExtensionManual, ToolingProperties) {
+         auto getToolProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceToolPropertiesEXT>(
+             inst.functions->vkGetInstanceProcAddr(inst, "vkGetPhysicalDeviceToolPropertiesEXT"));
+         handle_assert_has_value(getToolProperties);
+-        uint32_t tool_count = 1;
++        uint32_t tool_count = 0;
+         ASSERT_EQ(VK_SUCCESS, getToolProperties(phys_dev, &tool_count, nullptr));
+         ASSERT_EQ(tool_count, 1);
+         VkPhysicalDeviceToolPropertiesEXT props{};
+-- 
+2.34.1
+

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2021-11-27 01:07:58 UTC (rev 429387)
+++ PKGBUILD	2021-11-27 09:14:31 UTC (rev 429388)
@@ -2,7 +2,7 @@
 
 pkgname=vulkan-icd-loader
 pkgver=1.2.199
-pkgrel=1
+pkgrel=2
 arch=(x86_64)
 pkgdesc="Vulkan Installable Client Driver (ICD) Loader"
 url="https://www.khronos.org/vulkan/"
@@ -11,9 +11,18 @@
 depends=(glibc)
 optdepends=('vulkan-driver: packaged vulkan driver') # vulkan-driver: vulkan-intel/vulkan-radeon/nvidia-utils/....
 provides=('libvulkan.so')
-source=("${pkgname}-${pkgver}.tar.gz::https://github.com/KhronosGroup/Vulkan-Loader/archive/v${pkgver}.tar.gz")
-sha256sums=('cc496f6725c7e088510d1a5e7c6a97b61e356b147dcc3d697233ca775dd768ef')
+source=("${pkgname}-${pkgver}.tar.gz::https://github.com/KhronosGroup/Vulkan-Loader/archive/v${pkgver}.tar.gz"
+        0001-Dont-call-ToolProps-on-drivers-without-support.patch)
+sha256sums=('cc496f6725c7e088510d1a5e7c6a97b61e356b147dcc3d697233ca775dd768ef'
+            'a29f06969f43bbf315ab766a212d88eccbd9921edf270ec187dd2c1d436cce12')
 
+prepare() {
+  cd "${srcdir}"/Vulkan-Loader*
+
+  # fix segfault with mesa drivers
+  patch -Np1 -i ../0001-Dont-call-ToolProps-on-drivers-without-support.patch
+}
+
 build() {
   cd "${srcdir}"/Vulkan-Loader*
 



More information about the arch-commits mailing list