vcl/unx/gtk3/gtkinst.cxx |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

New commits:
commit b417954503efe6f61c42f9d5991148b80ffa3e44
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Fri Mar 21 23:53:30 2025 -0700
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Sat Mar 22 16:59:49 2025 +0100

    gtk3: Fix memleak in get_{primary,secondary}_text
    
    Quoting from the g_object_get doc [1]:
    
    > In general, a copy is made of the property contents and the caller is
    > responsible for freeing the memory in the appropriate manner for the
    > type, for instance by calling g_free() or g_object_unref().
    
    This fixes these 2 memory leaks reported by valgrind when triggering
    the "Save Document?" dialog in Writer:
    
        ==502039== 52 bytes in 1 blocks are definitely lost in loss record 
10,157 of 19,684
        ==502039==    at 0x4844818: malloc (in 
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
        ==502039==    by 0x1306B2C1: g_malloc (in 
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.0)
        ==502039==    by 0x13087E72: g_strdup (in 
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.0)
        ==502039==    by 0x12FE6D7A: ??? (in 
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.8400.0)
        ==502039==    by 0x12FC58BB: g_object_get_valist (in 
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.8400.0)
        ==502039==    by 0x12FC5DB4: g_object_get (in 
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.8400.0)
        ==502039==    by 0x186EBFD6: (anonymous 
namespace)::get_secondary_text(_GtkMessageDialog*) (gtkinst.cxx:4788)
        ==502039==    by 0x186F3B45: (anonymous 
namespace)::GtkInstanceBuilder::postprocess_widget(_GtkWidget*) 
(gtkinst.cxx:24309)
        ==502039==    by 0x186ECCC0: (anonymous 
namespace)::GtkInstanceBuilder::postprocess(void*, void*) (gtkinst.cxx:24343)
        ==502039==    by 0x1308714F: g_slist_foreach (in 
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.0)
        ==502039==    by 0x186EC43D: (anonymous 
namespace)::GtkInstanceBuilder::GtkInstanceBuilder(_GtkWidget*, 
std::basic_string_view<char16_t, std::char_traits<char16_t> >, rtl::OUString 
const&, SystemChildWindow*, bool) (gtkinst.cxx:24426)
        ==502039==    by 0x186D3089: std::__detail::_MakeUniq<(anonymous 
namespace)::GtkInstanceBuilder>::__single_object std::make_unique<(anonymous 
namespace)::GtkInstanceBuilder, _GtkWidget*&, rtl::OUString const&, 
rtl::OUString const&, decltype(nullptr), bool>(_GtkWidget*&, rtl::OUString 
const&, rtl::OUString const&, decltype(nullptr)&&, bool&&) (unique_ptr.h:1077)
        ==502039==
        ==502039== 54 bytes in 1 blocks are definitely lost in loss record 
10,163 of 19,684
        ==502039==    at 0x4844818: malloc (in 
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
        ==502039==    by 0x1306B2C1: g_malloc (in 
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.0)
        ==502039==    by 0x13087E72: g_strdup (in 
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.0)
        ==502039==    by 0x12FE6D7A: ??? (in 
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.8400.0)
        ==502039==    by 0x12FC58BB: g_object_get_valist (in 
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.8400.0)
        ==502039==    by 0x12FC5DB4: g_object_get (in 
/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.8400.0)
        ==502039==    by 0x186EBE36: (anonymous 
namespace)::get_primary_text(_GtkMessageDialog*) (gtkinst.cxx:4767)
        ==502039==    by 0x186F3A92: (anonymous 
namespace)::GtkInstanceBuilder::postprocess_widget(_GtkWidget*) 
(gtkinst.cxx:24308)
        ==502039==    by 0x186ECCC0: (anonymous 
namespace)::GtkInstanceBuilder::postprocess(void*, void*) (gtkinst.cxx:24343)
        ==502039==    by 0x1308714F: g_slist_foreach (in 
/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.8400.0)
        ==502039==    by 0x186EC43D: (anonymous 
namespace)::GtkInstanceBuilder::GtkInstanceBuilder(_GtkWidget*, 
std::basic_string_view<char16_t, std::char_traits<char16_t> >, rtl::OUString 
const&, SystemChildWindow*, bool) (gtkinst.cxx:24426)
        ==502039==    by 0x186D3089: std::__detail::_MakeUniq<(anonymous 
namespace)::GtkInstanceBuilder>::__single_object std::make_unique<(anonymous 
namespace)::GtkInstanceBuilder, _GtkWidget*&, rtl::OUString const&, 
rtl::OUString const&, decltype(nullptr), bool>(_GtkWidget*&, rtl::OUString 
const&, rtl::OUString const&, decltype(nullptr)&&, bool&&) (unique_ptr.h:1077)
    
    [1] https://docs.gtk.org/gobject/method.Object.get.html
    
    Change-Id: I0d41a400440b9a1208e9f63d5529a14bc5cf0b1e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183218
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index b2c6600f8b54..d5b0da792707 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -4763,7 +4763,7 @@ namespace
 
     OUString get_primary_text(GtkMessageDialog* pMessageDialog)
     {
-        gchar* pText = nullptr;
+        g_autofree char* pText = nullptr;
         g_object_get(G_OBJECT(pMessageDialog), "text", &pText, nullptr);
         return OUString(pText, pText ? strlen(pText) : 0, 
RTL_TEXTENCODING_UTF8);
     }
@@ -4784,7 +4784,7 @@ namespace
 
     OUString get_secondary_text(GtkMessageDialog* pMessageDialog)
     {
-        gchar* pText = nullptr;
+        g_autofree char* pText = nullptr;
         g_object_get(G_OBJECT(pMessageDialog), "secondary-text", &pText, 
nullptr);
         return OUString(pText, pText ? strlen(pText) : 0, 
RTL_TEXTENCODING_UTF8);
     }

Reply via email to