From bc6e8c7813d6f9af451145c4ec716d6cf0a97b00 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Thu, 26 Feb 2026 09:47:18 +0800 Subject: [PATCH] Global (Linux): unrefs dbus connection to avoid memleaks --- src/common/dbus.h | 4 ++++ src/common/impl/dbus.c | 10 ++++++++++ src/common/impl/settings.c | 4 ++-- src/detection/bluetooth/bluetooth_linux.c | 2 +- src/detection/bluetoothradio/bluetoothradio_linux.c | 2 +- src/detection/de/de_linux.c | 2 +- src/detection/media/media_linux.c | 2 +- src/detection/wifi/wifi_linux.c | 2 +- 8 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/common/dbus.h b/src/common/dbus.h index ee5eb432c..cecd744cb 100644 --- a/src/common/dbus.h +++ b/src/common/dbus.h @@ -19,6 +19,7 @@ typedef struct FFDBusLibrary FF_LIBRARY_SYMBOL(dbus_message_iter_next) FF_LIBRARY_SYMBOL(dbus_message_unref) FF_LIBRARY_SYMBOL(dbus_connection_send_with_reply_and_block) + FF_LIBRARY_SYMBOL(dbus_connection_unref) } FFDBusLibrary; typedef struct FFDBusData @@ -36,10 +37,13 @@ DBusMessage* ffDBusGetProperty(FFDBusData* dbus, const char* busName, const char bool ffDBusGetPropertyString(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property, FFstrbuf* result); bool ffDBusGetInt(FFDBusData* dbus, DBusMessageIter* iter, int32_t* result); bool ffDBusGetPropertyUint(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property, uint32_t* result); +void ffDBusDestroyData(FFDBusData* data); static inline DBusMessage* ffDBusGetAllProperties(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface) { return ffDBusGetMethodReply(dbus, busName, objectPath, "org.freedesktop.DBus.Properties", "GetAll", interface, NULL); } +#define FF_DBUS_AUTO_DESTROY_DATA __attribute__((__cleanup__(ffDBusDestroyData))) + #endif // FF_HAVE_DBUS diff --git a/src/common/impl/dbus.c b/src/common/impl/dbus.c index 87aacdf85..cf45700a9 100644 --- a/src/common/impl/dbus.c +++ b/src/common/impl/dbus.c @@ -19,6 +19,7 @@ static bool loadLibSymbols(FFDBusLibrary* lib) FF_LIBRARY_LOAD_SYMBOL_PTR(dbus, lib, dbus_message_iter_next, false) FF_LIBRARY_LOAD_SYMBOL_PTR(dbus, lib, dbus_message_unref, false) FF_LIBRARY_LOAD_SYMBOL_PTR(dbus, lib, dbus_connection_send_with_reply_and_block, false) + FF_LIBRARY_LOAD_SYMBOL_PTR(dbus, lib, dbus_connection_unref, false) dbus = NULL; // don't auto dlclose return true; } @@ -51,6 +52,15 @@ const char* ffDBusLoadData(DBusBusType busType, FFDBusData* data) return NULL; } +void ffDBusDestroyData(FFDBusData* data) +{ + if (data->connection != NULL) + { + data->lib->ffdbus_connection_unref(data->connection); + data->connection = NULL; + } +} + bool ffDBusGetString(FFDBusData* dbus, DBusMessageIter* iter, FFstrbuf* result) { int argType = dbus->lib->ffdbus_message_iter_get_arg_type(iter); diff --git a/src/common/impl/settings.c b/src/common/impl/settings.c index bb7d820cf..acb42195b 100644 --- a/src/common/impl/settings.c +++ b/src/common/impl/settings.c @@ -201,7 +201,7 @@ FFvariant ffSettingsGetGnome(const char* dconfKey, const char* gsettingsSchemaNa FFvariant ffSettingsGetXFConf(const char* channelName, const char* propertyName, FFvarianttype type) { - FFDBusData dbus; + FF_DBUS_AUTO_DESTROY_DATA FFDBusData dbus = {}; if (ffDBusLoadData(DBUS_BUS_SESSION, &dbus) != NULL) return FF_VARIANT_NULL; @@ -260,7 +260,7 @@ FFvariant ffSettingsGetXFConf(const char* channelName, const char* propertyName, FFvariant ffSettingsGetXFConfFirstMatch(const char* channelName, const char* propertyPrefix, FFvarianttype type, void* data, FFTestXfconfPropCallback* cb) { - FFDBusData dbus; + FF_DBUS_AUTO_DESTROY_DATA FFDBusData dbus = {}; if (ffDBusLoadData(DBUS_BUS_SESSION, &dbus) != NULL) return FF_VARIANT_NULL; diff --git a/src/detection/bluetooth/bluetooth_linux.c b/src/detection/bluetooth/bluetooth_linux.c index 162e60a51..4f8c1c803 100644 --- a/src/detection/bluetooth/bluetooth_linux.c +++ b/src/detection/bluetooth/bluetooth_linux.c @@ -191,7 +191,7 @@ static void detectBluetoothRoot(FFlist* devices, FFDBusData* dbus, DBusMessageIt static const char* detectBluetooth(FFlist* devices, int32_t connectedCount) { - FFDBusData dbus; + FF_DBUS_AUTO_DESTROY_DATA FFDBusData dbus = {}; const char* error = ffDBusLoadData(DBUS_BUS_SYSTEM, &dbus); if(error) return error; diff --git a/src/detection/bluetoothradio/bluetoothradio_linux.c b/src/detection/bluetoothradio/bluetoothradio_linux.c index f7f3971ba..1583d43d0 100644 --- a/src/detection/bluetoothradio/bluetoothradio_linux.c +++ b/src/detection/bluetoothradio/bluetoothradio_linux.c @@ -112,7 +112,7 @@ static const char* detectBluetooth(FFlist* devices) if(dirp == NULL) return "Failed to open /sys/class/bluetooth"; - FFDBusData dbus; + FF_DBUS_AUTO_DESTROY_DATA FFDBusData dbus = {}; const char* error = ffDBusLoadData(DBUS_BUS_SYSTEM, &dbus); if(error) return error; diff --git a/src/detection/de/de_linux.c b/src/detection/de/de_linux.c index ee2aeafcc..b7ac7a6ed 100644 --- a/src/detection/de/de_linux.c +++ b/src/detection/de/de_linux.c @@ -58,7 +58,7 @@ static void getKDE(FFstrbuf* result, FF_MAYBE_UNUSED FFDEOptions* options) static const char* getGnomeByDbus(FF_MAYBE_UNUSED FFstrbuf* result) { #ifdef FF_HAVE_DBUS - FFDBusData dbus; + FF_DBUS_AUTO_DESTROY_DATA FFDBusData dbus = {}; if (ffDBusLoadData(DBUS_BUS_SESSION, &dbus) != NULL) return "ffDBusLoadData() failed"; diff --git a/src/detection/media/media_linux.c b/src/detection/media/media_linux.c index e7d5f0ad0..aa06c73dc 100644 --- a/src/detection/media/media_linux.c +++ b/src/detection/media/media_linux.c @@ -261,7 +261,7 @@ static void getBestBus(FFDBusData* data, FFMediaResult* result) static const char* getMedia(FFMediaResult* result) { - FFDBusData data; + FF_DBUS_AUTO_DESTROY_DATA FFDBusData data = {}; const char* error = ffDBusLoadData(DBUS_BUS_SESSION, &data); if(error != NULL) return error; diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c index 62fd01771..63daeeb01 100644 --- a/src/detection/wifi/wifi_linux.c +++ b/src/detection/wifi/wifi_linux.c @@ -47,7 +47,7 @@ typedef enum { static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer) { FF_DEBUG("Starting NetworkManager wifi detection for interface %s", item->inf.description.chars); - FFDBusData dbus; + FF_DBUS_AUTO_DESTROY_DATA FFDBusData dbus = {}; const char* error = ffDBusLoadData(DBUS_BUS_SYSTEM, &dbus); if(error) {