toolkit/source/awt/asynccallback.cxx |   18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

New commits:
commit 4c15b15a2018c3b8afc6d78fd7ff51beb3fc940e
Author:     Noel Grandin <[email protected]>
AuthorDate: Sat Jun 14 17:42:21 2025 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Sun Jun 15 13:43:39 2025 +0200

    make AsyncCallback a little safer
    
    (1) remove the callback if the object destructs.
    (2) assert if addCallback() is not going to do anything, so
       we dont get subtle failure modes
    
    Change-Id: Ibc4a8634c237858eb6add5e1db8ac1ca982590f2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/186510
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>

diff --git a/toolkit/source/awt/asynccallback.cxx 
b/toolkit/source/awt/asynccallback.cxx
index 4d5e07e47bc1..80c1ea73d3da 100644
--- a/toolkit/source/awt/asynccallback.cxx
+++ b/toolkit/source/awt/asynccallback.cxx
@@ -59,9 +59,15 @@ private:
         css::uno::Any                              aData;
     };
 
-    DECL_STATIC_LINK( AsyncCallback, Notify_Impl, void*, void );
+    DECL_LINK( Notify_Impl, void*, void );
 
-    virtual ~AsyncCallback() override {}
+    virtual ~AsyncCallback() override
+    {
+        if (mpCallbackId)
+            Application::RemoveUserEvent(mpCallbackId);
+    }
+
+    ImplSVEvent* mpCallbackId { nullptr };
 };
 
 // com.sun.star.uno.XServiceInfo:
@@ -87,13 +93,17 @@ void SAL_CALL AsyncCallback::addCallback(const 
css::uno::Reference< css::awt::XC
     {
         // NOTE: We don't need SolarMutexGuard here as 
Application::PostUserEvent is thread-safe
         CallbackData* pCallbackData = new CallbackData( xCallback, aData );
-        Application::PostUserEvent( LINK( this, AsyncCallback, Notify_Impl ), 
pCallbackData );
+        mpCallbackId = Application::PostUserEvent( LINK( this, AsyncCallback, 
Notify_Impl ), pCallbackData );
     }
+    else
+        assert(false && "addCallback will not succeed");
 }
 
 // private asynchronous link to call reference to the callback object
-IMPL_STATIC_LINK( AsyncCallback, Notify_Impl, void*, p, void )
+IMPL_LINK( AsyncCallback, Notify_Impl, void*, p, void )
 {
+    mpCallbackId = nullptr;
+
     CallbackData* pCallbackData = static_cast<CallbackData*>(p);
     try
     {

Reply via email to