[pygobject/interface_override] interface: Fix leak when overriding GInterfaceInfo
- From: Thibault Saunier <tsaunier src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pygobject/interface_override] interface: Fix leak when overriding GInterfaceInfo
- Date: Tue, 29 Mar 2022 19:37:18 +0000 (UTC)
commit 885d8e11771e7b25e73464d1b2e0df811df1b560
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 ++++
setup.py | 5 +++++
4 files changed, 19 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()
diff --git a/setup.py b/setup.py
index 5f801607..9b040d11 100755
--- a/setup.py
+++ b/setup.py
@@ -1034,6 +1034,11 @@ class build_ext(du_build_ext):
/* Configuration header created by setup.py - do not edit */
#ifndef _CONFIG_H
#define _CONFIG_H 1
+#include <glib/glib.h>
+
+#if !GLIB_CHECK_VERSION(2, 67, 4)
+#define g_memdup2(ptr,sz)', '(G_LIKELY(((guint64)(sz)) < G_MAXUINT)) ? g_memdup(ptr,sz) : (g_abort(),NULL)
+#endif
#define PYGOBJECT_MAJOR_VERSION %(PYGOBJECT_MAJOR_VERSION)s
#define PYGOBJECT_MINOR_VERSION %(PYGOBJECT_MINOR_VERSION)s
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]