From 364644b52e28091cc53b767fc869adac6b4064c8 Mon Sep 17 00:00:00 2001 From: Arkadiusz Bokowy Date: Fri, 23 Sep 2022 16:28:00 +0200 Subject: [PATCH] [Linux] Mark GLib source as removed when exiting callback Fixes #22840 --- src/platform/Linux/bluez/Helper.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/platform/Linux/bluez/Helper.cpp b/src/platform/Linux/bluez/Helper.cpp index 1337c4e69a1003..3267d5e3de3e81 100644 --- a/src/platform/Linux/bluez/Helper.cpp +++ b/src/platform/Linux/bluez/Helper.cpp @@ -401,7 +401,15 @@ static gboolean BluezCharacteristicWriteFD(GIOChannel * aChannel, GIOCondition a isSuccess = true; exit: - return isSuccess ? TRUE : FALSE; + if (!isSuccess && (conn != nullptr)) + { + // Returning G_SOURCE_REMOVE from the source callback removes the source object + // from the context. Unset self source ID tag, so we will not call g_source_remove() + // in BluezOTConnectionDestroy() on already removed source. + conn->mC1Channel.mWatch = 0; + } + + return isSuccess ? G_SOURCE_CONTINUE : G_SOURCE_REMOVE; } static void Bluez_gatt_characteristic1_complete_acquire_write_with_fd(GDBusMethodInvocation * invocation, int fd, guint16 mtu) @@ -417,6 +425,11 @@ static void Bluez_gatt_characteristic1_complete_acquire_write_with_fd(GDBusMetho static gboolean bluezCharacteristicDestroyFD(GIOChannel * aChannel, GIOCondition aCond, gpointer apClosure) { + BluezConnection * conn = static_cast(apClosure); + // Returning G_SOURCE_REMOVE from the source callback removes the source object + // from the context. Unset self source ID tag, so we will not call g_source_remove() + // in BluezOTConnectionDestroy() on already removed source. + conn->mC2Channel.mWatch = 0; return G_SOURCE_REMOVE; }