From 3d1c78d2e65fd17a6ea23beb9d87848545fa8107 Mon Sep 17 00:00:00 2001 From: Chris Thrasher Date: Mon, 14 Oct 2024 18:52:31 -0600 Subject: [PATCH] Use custom `std::unique_ptr` deleter to more safely handle owning pointer --- src/SFML/Window/Unix/VulkanImplX11.cpp | 30 ++++++++++++-------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/SFML/Window/Unix/VulkanImplX11.cpp b/src/SFML/Window/Unix/VulkanImplX11.cpp index cb1b8ae8dc..2c6ef439bd 100644 --- a/src/SFML/Window/Unix/VulkanImplX11.cpp +++ b/src/SFML/Window/Unix/VulkanImplX11.cpp @@ -43,41 +43,32 @@ namespace { struct VulkanLibraryWrapper { - ~VulkanLibraryWrapper() - { - if (library) - dlclose(library); - } - // Try to load the library and all the required entry points bool loadLibrary() { if (library) return true; - library = dlopen("libvulkan.so.1", RTLD_LAZY); + library.reset(dlopen("libvulkan.so.1", RTLD_LAZY)); if (!library) return false; if (!loadEntryPoint(vkGetInstanceProcAddr, "vkGetInstanceProcAddr")) { - dlclose(library); - library = nullptr; + library.reset(); return false; } if (!loadEntryPoint(vkEnumerateInstanceLayerProperties, "vkEnumerateInstanceLayerProperties")) { - dlclose(library); - library = nullptr; + library.reset(); return false; } if (!loadEntryPoint(vkEnumerateInstanceExtensionProperties, "vkEnumerateInstanceExtensionProperties")) { - dlclose(library); - library = nullptr; + library.reset(); return false; } @@ -87,12 +78,19 @@ struct VulkanLibraryWrapper template bool loadEntryPoint(T& entryPoint, const char* name) { - entryPoint = reinterpret_cast(dlsym(library, name)); + entryPoint = reinterpret_cast(dlsym(library.get(), name)); return entryPoint != nullptr; } - void* library{}; + struct SharedLibraryDeleter + { + void operator()(void* ptr) const + { + dlclose(ptr); + } + }; + std::unique_ptr library; PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr{}; PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties{}; @@ -169,7 +167,7 @@ VulkanFunctionPointer VulkanImpl::getFunction(const char* name) if (!isAvailable(false)) return nullptr; - return reinterpret_cast(dlsym(wrapper.library, name)); + return reinterpret_cast(dlsym(wrapper.library.get(), name)); }