From 6ca4b5391b51a649901834224b7e423c3c4fda66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 15 Feb 2023 14:51:04 +0800 Subject: [PATCH] Library: refactor FF_LIBRARY_LOAD to use `__cleanup__` --- src/common/dbus.c | 4 ++-- src/common/library.h | 21 ++++++++++--------- src/detection/displayserver/linux/wayland.c | 5 ----- src/detection/displayserver/linux/xcb.c | 8 ------- src/detection/displayserver/linux/xlib.c | 8 ------- src/detection/gpu/gpu_linux.c | 1 - src/detection/opengl/opengl_linux.c | 12 +++-------- src/detection/packages/packages_linux.c | 8 ------- src/detection/sound/sound_linux.c | 1 - src/detection/terminalfont/terminalfont.c | 1 - .../terminalfont/terminalfont_android.c | 1 - src/detection/vulkan/vulkan.c | 6 ------ src/detection/wifi/wifi_linux.c | 4 ---- src/detection/wifi/wifi_windows.c | 1 - src/logo/image/im6.c | 13 ++++-------- src/logo/image/im7.c | 13 ++++-------- src/logo/image/image.c | 11 +--------- src/modules/opencl.c | 4 +--- src/util/mallocHelper.h | 1 + 19 files changed, 27 insertions(+), 96 deletions(-) diff --git a/src/common/dbus.c b/src/common/dbus.c index f974b39d9..b0f5c4ffe 100644 --- a/src/common/dbus.c +++ b/src/common/dbus.c @@ -24,7 +24,7 @@ static bool loadLibSymbols(const FFinstance* instance, FFDBusLibrary* lib) FF_LIBRARY_LOAD_SYMBOL_PTR(dbus, lib, dbus_pending_call_block, false) FF_LIBRARY_LOAD_SYMBOL_PTR(dbus, lib, dbus_pending_call_steal_reply, false) FF_LIBRARY_LOAD_SYMBOL_PTR(dbus, lib, dbus_pending_call_unref, false) - + dbus = NULL; // don't auto dlclose return true; } @@ -178,7 +178,7 @@ DBusMessage* ffDBusGetProperty(FFDBusData* dbus, const char* busName, const char return NULL; } - DBusMessage* reply = dbus->lib->ffdbus_connection_send_with_reply_and_block(dbus->connection, message, FF_DBUS_TIMEOUT_MILLISECONDS, NULL); + DBusMessage* reply = dbus->lib->ffdbus_connection_send_with_reply_and_block(dbus->connection, message, FF_DBUS_TIMEOUT_MILLISECONDS, NULL); dbus->lib->ffdbus_message_unref(message); diff --git a/src/common/library.h b/src/common/library.h index c433d1e81..a0de3d621 100644 --- a/src/common/library.h +++ b/src/common/library.h @@ -6,7 +6,7 @@ #include "fastfetch.h" #include "util/FFcheckmacros.h" -#if defined(_WIN32) //We don't force MSYS using LoadLibrary because dlopen also searches $LD_LIBRARY_PATH +#if defined(_WIN32) #include #define FF_DLOPEN_FLAGS 0 FF_C_NODISCARD static inline void* dlopen(const char* path, int mode) { FF_UNUSED(mode); return LoadLibraryA(path); } @@ -24,29 +24,30 @@ #define FF_LIBRARY_EXTENSION ".so" #endif +static inline void ffLibraryUnload(void** handle) +{ + assert(handle); + if (*handle) + dlclose(*handle); +} + #define FF_LIBRARY_SYMBOL(symbolName) \ __typeof__(&symbolName) ff ## symbolName; #define FF_LIBRARY_LOAD(libraryObjectName, userLibraryName, returnValue, ...) \ - void* libraryObjectName = ffLibraryLoad(userLibraryName, __VA_ARGS__, NULL);\ + void* __attribute__((__cleanup__(ffLibraryUnload))) libraryObjectName = ffLibraryLoad(userLibraryName, __VA_ARGS__, NULL);\ if(libraryObjectName == NULL) \ return returnValue; #define FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, symbolMapping, symbolName, returnValue) \ symbolMapping = dlsym(library, #symbolName); \ if(symbolMapping == NULL) \ - { \ - dlclose(library); \ - return returnValue; \ - } + return returnValue; #define FF_LIBRARY_LOAD_SYMBOL_ADDRESS2(library, symbolMapping, symbolName, alternateName, returnValue) \ symbolMapping = dlsym(library, #symbolName); \ if(symbolMapping == NULL && !(symbolMapping = dlsym(library, #alternateName))) \ - { \ - dlclose(library); \ - return returnValue; \ - } + return returnValue; #define FF_LIBRARY_LOAD_SYMBOL(library, symbolName, returnValue) \ __typeof__(&symbolName) FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, returnValue); diff --git a/src/detection/displayserver/linux/wayland.c b/src/detection/displayserver/linux/wayland.c index a6ca31edd..fce97c8f2 100644 --- a/src/detection/displayserver/linux/wayland.c +++ b/src/detection/displayserver/linux/wayland.c @@ -160,10 +160,7 @@ bool detectWayland(const FFinstance* instance, FFDisplayServerResult* result) data.display = ffwl_display_connect(NULL); if(data.display == NULL) - { - dlclose(wayland); return false; - } waylandDetectWM(ffwl_display_get_fd(data.display), result); @@ -171,7 +168,6 @@ bool detectWayland(const FFinstance* instance, FFDisplayServerResult* result) if(registry == NULL) { ffwl_display_disconnect(data.display); - dlclose(wayland); return false; } @@ -188,7 +184,6 @@ bool detectWayland(const FFinstance* instance, FFDisplayServerResult* result) data.ffwl_proxy_destroy(registry); ffwl_display_disconnect(data.display); - dlclose(wayland); //We successfully connected to wayland and detected the display. //So we can set set the session type to wayland. diff --git a/src/detection/displayserver/linux/xcb.c b/src/detection/displayserver/linux/xcb.c index 183ff5251..c31803286 100644 --- a/src/detection/displayserver/linux/xcb.c +++ b/src/detection/displayserver/linux/xcb.c @@ -103,10 +103,7 @@ void ffdsConnectXcb(const FFinstance* instance, FFDisplayServerResult* result) xcb_connection_t* connection = ffxcb_connect(NULL, NULL); if(connection == NULL) - { - dlclose(xcb); return; - } xcb_screen_iterator_t iterator = ffxcb_setup_roots_iterator(ffxcb_get_setup(connection)); @@ -127,7 +124,6 @@ void ffdsConnectXcb(const FFinstance* instance, FFDisplayServerResult* result) } ffxcb_disconnect(connection); - dlclose(xcb); //If wayland hasn't set this, connection failed for it. So we are running only a X Server, not XWayland. if(result->wmProtocolName.length == 0) @@ -368,10 +364,7 @@ void ffdsConnectXcbRandr(const FFinstance* instance, FFDisplayServerResult* resu data.connection = ffxcb_connect(NULL, NULL); if(data.connection == NULL) - { - dlclose(xcbRandr); return; - } data.result = result; @@ -387,7 +380,6 @@ void ffdsConnectXcbRandr(const FFinstance* instance, FFDisplayServerResult* resu } ffxcb_disconnect(data.connection); - dlclose(xcbRandr); //If wayland hasn't set this, connection failed for it. So we are running only a X Server, not XWayland. if(result->wmProtocolName.length == 0) diff --git a/src/detection/displayserver/linux/xlib.c b/src/detection/displayserver/linux/xlib.c index 50eba6a2d..241db5e87 100644 --- a/src/detection/displayserver/linux/xlib.c +++ b/src/detection/displayserver/linux/xlib.c @@ -69,10 +69,7 @@ void ffdsConnectXlib(const FFinstance* instance, FFDisplayServerResult* result) Display* display = ffXOpenDisplay(x11); if(display == NULL) - { - dlclose(x11); return; - } if(propertyDataInitialized && ScreenCount(display) > 0) x11DetectWMFromEWMH(&propertyData, display, result); @@ -91,7 +88,6 @@ void ffdsConnectXlib(const FFinstance* instance, FFDisplayServerResult* result) } ffXCloseDisplay(display); - dlclose(x11); //If wayland hasn't set this, connection failed for it. So we are running only a X Server, not XWayland. if(result->wmProtocolName.length == 0) @@ -298,10 +294,7 @@ void ffdsConnectXrandr(const FFinstance* instance, FFDisplayServerResult* result data.display = ffXOpenDisplay(NULL); if(data.display == NULL) - { - dlclose(xrandr); return; - } if(propertyDataInitialized && ScreenCount(data.display) > 0) x11DetectWMFromEWMH(&propertyData, data.display, result); @@ -312,7 +305,6 @@ void ffdsConnectXrandr(const FFinstance* instance, FFDisplayServerResult* result xrandrHandleScreen(&data, ScreenOfDisplay(data.display, i)); ffXCloseDisplay(data.display); - dlclose(xrandr); //If wayland hasn't set this, connection failed for it. So we are running only a X Server, not XWayland. if(result->wmProtocolName.length == 0) diff --git a/src/detection/gpu/gpu_linux.c b/src/detection/gpu/gpu_linux.c index d1776d2e2..999856cdc 100644 --- a/src/detection/gpu/gpu_linux.c +++ b/src/detection/gpu/gpu_linux.c @@ -251,7 +251,6 @@ static const char* pciDetectGPUs(const FFinstance* instance, FFlist* gpus) } ffpci_cleanup(pci.access); - dlclose(libpci); return NULL; } diff --git a/src/detection/opengl/opengl_linux.c b/src/detection/opengl/opengl_linux.c index d95062ad5..a959578f8 100644 --- a/src/detection/opengl/opengl_linux.c +++ b/src/detection/opengl/opengl_linux.c @@ -133,9 +133,7 @@ static const char* eglPrint(FFinstance* instance, FFOpenGLResult* result) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(egl, eglData, eglDestroySurface); FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(egl, eglData, eglTerminate); - const char* error = eglHandleData(result, &eglData); - dlclose(egl); - return error; + return eglHandleData(result, &eglData); } #endif //FF_HAVE_EGL @@ -252,9 +250,7 @@ static const char* glxPrint(FFinstance* instance, FFOpenGLResult* result) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(glx, data, XCloseDisplay); FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(glx, data, XFree); - const char* error = glxHandleData(result, &data); - dlclose(glx); - return error; + return glxHandleData(result, &data); } #endif //FF_HAVE_GLX @@ -310,9 +306,7 @@ static const char* osMesaPrint(FFinstance* instance, FFOpenGLResult* result) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(osmesa, data, OSMesaMakeCurrent); FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(osmesa, data, OSMesaDestroyContext); - const char* error = osMesaHandleData(result, &data); - dlclose(osmesa); - return error; + return osMesaHandleData(result, &data); } #endif //FF_HAVE_OSMESA diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index c3cd1381d..11162b138 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -229,23 +229,16 @@ static uint32_t getRpmFromLibrpm(const FFinstance* instance) ffrpmlogSetMask(RPMLOG_MASK(RPMLOG_EMERG)); if(ffrpmReadConfigFiles(NULL, NULL) != 0) - { - dlclose(rpm); return 0; - } rpmts ts = ffrpmtsCreate(); if(ts == NULL) - { - dlclose(rpm); return 0; - } rpmdbMatchIterator mi = ffrpmtsInitIterator(ts, RPMDBI_LABEL, NULL, 0); if(mi == NULL) { ffrpmtsFree(ts); - dlclose(rpm); return 0; } @@ -253,7 +246,6 @@ static uint32_t getRpmFromLibrpm(const FFinstance* instance) ffrpmdbFreeIterator(mi); ffrpmtsFree(ts); - dlclose(rpm); return count > 0 ? (uint32_t) count : 0; } diff --git a/src/detection/sound/sound_linux.c b/src/detection/sound/sound_linux.c index a752a6b5f..bb0b9d409 100644 --- a/src/detection/sound/sound_linux.c +++ b/src/detection/sound/sound_linux.c @@ -114,7 +114,6 @@ static const char* detectSound(const FFinstance* instance, FFlist* devices) ffpa_context_unref(context); ffpa_mainloop_free(mainloop); - dlclose(pulse); return NULL; } diff --git a/src/detection/terminalfont/terminalfont.c b/src/detection/terminalfont/terminalfont.c index 40275314c..db967b245 100644 --- a/src/detection/terminalfont/terminalfont.c +++ b/src/detection/terminalfont/terminalfont.c @@ -177,7 +177,6 @@ static const char* detectFromWTImpl(const FFinstance* instance, FFstrbuf* conten exit: cjsonData.ffcJSON_Delete(root); - dlclose(libcjson); return error; } diff --git a/src/detection/terminalfont/terminalfont_android.c b/src/detection/terminalfont/terminalfont_android.c index f3f6a38d6..251ada6c7 100644 --- a/src/detection/terminalfont/terminalfont_android.c +++ b/src/detection/terminalfont/terminalfont_android.c @@ -42,7 +42,6 @@ const char* detectTermux(const FFinstance* instance, FFTerminalFontResult* termi exit: if(face) ffFT_Done_Face(face); if(library) ffFT_Done_FreeType(library); - dlclose(freetype); return error; diff --git a/src/detection/vulkan/vulkan.c b/src/detection/vulkan/vulkan.c index 5e63d812b..d46f1879c 100644 --- a/src/detection/vulkan/vulkan.c +++ b/src/detection/vulkan/vulkan.c @@ -97,11 +97,7 @@ static const char* detectVulkan(const FFinstance* instance, FFVulkanResult* resu .ppEnabledExtensionNames = NULL, .flags = 0 }, NULL, &vkInstance) != VK_SUCCESS) - { - dlclose(vulkan); return "ffvkCreateInstance() failed"; - } - //if instance creation succeeded, but vkEnumerateInstanceVersion didn't, this means we are running against a vulkan 1.0 implementation //explicitly set this version, if no device is found, so we still have at least this info @@ -113,7 +109,6 @@ static const char* detectVulkan(const FFinstance* instance, FFVulkanResult* resu if(ffvkEnumeratePhysicalDevices(vkInstance, &physicalDeviceCount, physicalDevices) != VK_SUCCESS) { ffvkDestroyInstance(vkInstance, NULL); - dlclose(vulkan); return "ffvkEnumeratePhysicalDevices() failed"; } @@ -234,7 +229,6 @@ static const char* detectVulkan(const FFinstance* instance, FFVulkanResult* resu ffVersionToPretty(&maxDeviceConformanceVersion, &result->conformanceVersion); ffvkDestroyInstance(vkInstance, NULL); - dlclose(vulkan); return NULL; } diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c index 178520c8e..edd5affc5 100644 --- a/src/detection/wifi/wifi_linux.c +++ b/src/detection/wifi/wifi_linux.c @@ -45,10 +45,7 @@ static const char* detectWifiWithLibnm(const FFinstance* instance, FFlist* resul NMClient* client = ffnm_client_new(NULL, NULL); if(!client) - { - dlclose(nm); return "Could not create NMClient"; - } /* Get all devices managed by NetworkManager */ const GPtrArray* devices = ffnm_client_get_devices(client); @@ -199,7 +196,6 @@ static const char* detectWifiWithLibnm(const FFinstance* instance, FFlist* resul } ffg_object_unref(client); - dlclose(nm); return NULL; } diff --git a/src/detection/wifi/wifi_windows.c b/src/detection/wifi/wifi_windows.c index 70d7ea577..f13cc5484 100644 --- a/src/detection/wifi/wifi_windows.c +++ b/src/detection/wifi/wifi_windows.c @@ -207,7 +207,6 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res exit: if(ifList) ffWlanFreeMemory(ifList); if(hClient) ffWlanCloseHandle(hClient, NULL); - dlclose(wlanapi); return error; } diff --git a/src/logo/image/im6.c b/src/logo/image/im6.c index a235bb867..ba652a370 100644 --- a/src/logo/image/im6.c +++ b/src/logo/image/im6.c @@ -17,15 +17,10 @@ FFLogoImageResult ffLogoPrintImageIM6(FFinstance* instance, FFLogoRequestData* r FF_LIBRARY_LOAD(imageMagick, &instance->config.libImageMagick, FF_LOGO_IMAGE_RESULT_INIT_ERROR, "libMagickCore-6.Q16HDRI" FF_LIBRARY_EXTENSION, 8, "libMagickCore-6.Q16" FF_LIBRARY_EXTENSION, 8) FF_LIBRARY_LOAD_SYMBOL_ADDRESS(imageMagick, ffResizeImage, ResizeImage, FF_LOGO_IMAGE_RESULT_INIT_ERROR); - FFIMData imData; - imData.resizeFunc = logoResize; - imData.library = imageMagick; - - FFLogoImageResult result = ffLogoPrintImageImpl(instance, requestData, &imData); - - dlclose(imageMagick); - - return result; + return ffLogoPrintImageImpl(instance, requestData, &(FFIMData) { + .resizeFunc = logoResize, + .library = imageMagick, + }); } #endif diff --git a/src/logo/image/im7.c b/src/logo/image/im7.c index d7cf4b6d0..0677b4911 100644 --- a/src/logo/image/im7.c +++ b/src/logo/image/im7.c @@ -21,15 +21,10 @@ FFLogoImageResult ffLogoPrintImageIM7(FFinstance* instance, FFLogoRequestData* r ) FF_LIBRARY_LOAD_SYMBOL_ADDRESS(imageMagick, ffResizeImage, ResizeImage, FF_LOGO_IMAGE_RESULT_INIT_ERROR); - FFIMData imData; - imData.resizeFunc = logoResize; - imData.library = imageMagick; - - FFLogoImageResult result = ffLogoPrintImageImpl(instance, requestData, &imData); - - dlclose(imageMagick); - - return result; + return ffLogoPrintImageImpl(instance, requestData, &(FFIMData) { + .resizeFunc = logoResize, + .library = imageMagick, + }); } #endif diff --git a/src/logo/image/image.c b/src/logo/image/image.c index 96be2d049..7010dd815 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -131,14 +131,9 @@ static bool compressBlob(const FFinstance* instance, void** blob, size_t* length uLong compressedLength = ffcompressBound(*length); void* compressed = malloc(compressedLength); if(compressed == NULL) - { - dlclose(zlib); return false; - } - int compressResult = ffcompress2(compressed, &compressedLength, *blob, *length, Z_BEST_COMPRESSION); - dlclose(zlib); - if(compressResult != Z_OK) + if(ffcompress2(compressed, &compressedLength, *blob, *length, Z_BEST_COMPRESSION) != Z_OK) { free(compressed); return false; @@ -336,10 +331,7 @@ static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData size_t length; void* blob = imageData->ffImageToBlob(imageData->imageInfo, imageData->image, &length, imageData->exceptionInfo); if(!checkAllocationResult(blob, length)) - { - dlclose(chafa); return false; - } ChafaSymbolMap* symbolMap = ffchafa_symbol_map_new(); GError* error = NULL; @@ -408,7 +400,6 @@ static bool printImageChafa(FFinstance* instance, FFLogoRequestData* requestData ffchafa_canvas_unref(canvas); ffchafa_canvas_config_unref(canvasConfig); ffchafa_symbol_map_unref(symbolMap); - dlclose(chafa); return true; } diff --git a/src/modules/opencl.c b/src/modules/opencl.c index 8f1f69cd1..621165742 100644 --- a/src/modules/opencl.c +++ b/src/modules/opencl.c @@ -94,9 +94,7 @@ static const char* printOpenCL(FFinstance* instance) FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(opencl, data, clGetDeviceIDs); FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(opencl, data, clGetDeviceInfo); - const char* error = openCLHandleData(instance, &data); - dlclose(opencl); - return error; + return openCLHandleData(instance, &data); } #elif defined(__APPLE__) // FF_HAVE_OPENCL diff --git a/src/util/mallocHelper.h b/src/util/mallocHelper.h index a4fd8eb6e..18aa801bf 100644 --- a/src/util/mallocHelper.h +++ b/src/util/mallocHelper.h @@ -2,6 +2,7 @@ static inline void ffWrapFree(void* pPtr) { + assert(pPtr); if(*(void**)pPtr) free(*(void**)pPtr); }