toolkit/source/helper/unowrapper.cxx |    9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

New commits:
commit 481a435d1ea2ab210c826fe77b632fc76b8f830e
Author:     Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
AuthorDate: Thu Jun 2 15:51:47 2022 +0200
Commit:     Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
CommitDate: Tue Jun 7 08:36:29 2022 +0200

    Fix leak with stock widgets in a dialog from an extension
    
    When loading a dialog from XDL, buttons can have dlg:button-type="cancel"
    or dlg:button-type="help". These buttons might not have a peer when
    they are not referenced from the extension.
    
    In this case, they also weren't disposed when the dialog was disposed,
    leading to an abort on exit.
    
    Change-Id: I799d7535b766984fde47cafbe41ee6e89e476205
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135316
    Tested-by: Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>
    Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@allotropia.de>

diff --git a/toolkit/source/helper/unowrapper.cxx 
b/toolkit/source/helper/unowrapper.cxx
index 13fa5aeb7537..938aa8d75983 100644
--- a/toolkit/source/helper/unowrapper.cxx
+++ b/toolkit/source/helper/unowrapper.cxx
@@ -224,10 +224,13 @@ void UnoWrapper::WindowDestroyed( vcl::Window* pWindow )
         VclPtr< vcl::Window > pNextChild = pChild->GetWindow( 
GetWindowType::Next );
 
         VclPtr< vcl::Window > pClient = pChild->GetWindow( 
GetWindowType::Client );
-        if ( pClient && pClient->GetWindowPeer() )
+        if ( pClient  )
         {
-            css::uno::Reference< css::lang::XComponent > xComp = 
pClient->GetComponentInterface( false );
-            xComp->dispose();
+            // Create the window peer (true argument for 
pClient->GetComponentInterface) when it's not yet there.
+            // We need it to dispose the child windows properly, otherwise the 
vcl::Window will be leaked.
+            css::uno::Reference< css::lang::XComponent > xComp = 
pClient->GetComponentInterface( true );
+            if (xComp.is())
+                xComp->dispose();
         }
 
         pChild = pNextChild;

Reply via email to