[pygobject/interface_override] interface: Fix leak when overriding GInterfaceInfo




commit eb8d118f1e3beef062238d1c7f734cc06cf6c801
Author: Thibault Saunier <tsaunier igalia com>
Date:   Tue Mar 29 18:38:00 2022 +0200

    interface: Fix leak when overriding GInterfaceInfo
    
    When the interface is being registered by PyGObject and again through
    an override, the first one is being leaks, free it at this point.
    
    We need to copy the GInterfaceInfo to set on the GType QData as we
    do not own it.

 gi/gimodule.c     |  1 +
 gi/pyginterface.c | 12 +++++++++---
 meson.build       |  4 ++++
 3 files changed, 14 insertions(+), 3 deletions(-)
---
diff --git a/gi/gimodule.c b/gi/gimodule.c
index 7b23012e..766fd341 100644
--- a/gi/gimodule.c
+++ b/gi/gimodule.c
@@ -1751,6 +1751,7 @@ _wrap_pyg_register_interface_info (PyObject *self, PyObject *args)
     info->interface_init = (GInterfaceInitFunc) initialize_interface;
 
     pyg_register_interface_info (g_type, info);
+    g_free (info);
 
     Py_RETURN_NONE;
 }
diff --git a/gi/pyginterface.c b/gi/pyginterface.c
index 34db8fac..288fbb25 100644
--- a/gi/pyginterface.c
+++ b/gi/pyginterface.c
@@ -85,15 +85,21 @@ pyg_register_interface(PyObject *dict, const gchar *class_name,
     }
 
     g_type_set_qdata(gtype, pyginterface_type_key, type);
-    
+
     PyDict_SetItemString(dict, (char *)class_name, (PyObject *)type);
-    
+
 }
 
 void
 pyg_register_interface_info(GType gtype, const GInterfaceInfo *info)
 {
-    g_type_set_qdata(gtype, pyginterface_info_key, (gpointer) info);
+    GInterfaceInfo *prev_info = pyg_lookup_interface_info (gtype);
+
+    if (prev_info) {
+        g_free (prev_info);
+    }
+
+    g_type_set_qdata(gtype, pyginterface_info_key, g_memdup2 (info, sizeof(GInterfaceInfo)));
 }
 
 const GInterfaceInfo *
diff --git a/meson.build b/meson.build
index fd8473a9..85eded48 100644
--- a/meson.build
+++ b/meson.build
@@ -136,6 +136,10 @@ cdata.set('PYGOBJECT_MAJOR_VERSION', pygobject_version_major)
 cdata.set('PYGOBJECT_MINOR_VERSION', pygobject_version_minor)
 cdata.set('PYGOBJECT_MICRO_VERSION', pygobject_version_micro)
 
+if gio_dep.version().version_compare('< 2.67.4')
+  cdata.set('g_memdup2(ptr,sz)', '(G_LIKELY(((guint64)(sz)) < G_MAXUINT)) ? g_memdup(ptr,sz) : 
(g_abort(),NULL)')
+endif
+
 configure_file(output : 'config.h', configuration : cdata)
 
 pkgconf = configuration_data()


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]