diff --git a/SOURCES/pygobject-3.8.2-gvalue-memory-leak.patch b/SOURCES/pygobject-3.8.2-gvalue-memory-leak.patch new file mode 100644 index 0000000..f9c20fe --- /dev/null +++ b/SOURCES/pygobject-3.8.2-gvalue-memory-leak.patch @@ -0,0 +1,26 @@ +diff -up pygobject-3.8.2/gi/pygi-marshal-cleanup.c.gvalue-memory-leak pygobject-3.8.2/gi/pygi-marshal-cleanup.c +--- pygobject-3.8.2/gi/pygi-marshal-cleanup.c.gvalue-memory-leak 2013-03-04 04:19:22.000000000 -0500 ++++ pygobject-3.8.2/gi/pygi-marshal-cleanup.c 2014-09-26 09:04:12.780688672 -0400 +@@ -29,16 +29,17 @@ _cleanup_caller_allocates (PyGIInvokeSta + { + PyGIInterfaceCache *iface_cache = (PyGIInterfaceCache *)cache; + +- if (g_type_is_a (iface_cache->g_type, G_TYPE_BOXED)) { ++ /* check GValue first because GValue is also a boxed sub-type */ ++ if (g_type_is_a (iface_cache->g_type, G_TYPE_VALUE)) { ++ if (was_processed) ++ g_value_unset (data); ++ g_slice_free (GValue, data); ++ } else if (g_type_is_a (iface_cache->g_type, G_TYPE_BOXED)) { + gsize size; + if (was_processed) + return; /* will be cleaned up at deallocation */ + size = g_struct_info_get_size (iface_cache->interface_info); + g_slice_free1 (size, data); +- } else if (iface_cache->g_type == G_TYPE_VALUE) { +- if (was_processed) +- g_value_unset (data); +- g_slice_free (GValue, data); + } else if (iface_cache->is_foreign) { + if (was_processed) + return; /* will be cleaned up at deallocation */ diff --git a/SOURCES/pygobject-3.8.2-pass-gvalues-by-reference.patch b/SOURCES/pygobject-3.8.2-pass-gvalues-by-reference.patch new file mode 100644 index 0000000..61a7be0 --- /dev/null +++ b/SOURCES/pygobject-3.8.2-pass-gvalues-by-reference.patch @@ -0,0 +1,87 @@ +diff -up pygobject-3.8.2/gi/pygi-argument.c.pass-gvalues-by-reference pygobject-3.8.2/gi/pygi-argument.c +--- pygobject-3.8.2/gi/pygi-argument.c.pass-gvalues-by-reference 2013-05-13 11:24:49.000000000 -0400 ++++ pygobject-3.8.2/gi/pygi-argument.c 2014-09-15 09:00:18.400422884 -0400 +@@ -1266,7 +1266,7 @@ array_success: + pygi_marshal_from_py_gvalue (object, + &arg, + transfer, +- FALSE /*is_allocated*/); ++ FALSE /*copy_reference*/); + + } else if (g_type_is_a (type, G_TYPE_CLOSURE)) { + pygi_marshal_from_py_gclosure (object, &arg); +diff -up pygobject-3.8.2/gi/pygi-marshal-from-py.c.pass-gvalues-by-reference pygobject-3.8.2/gi/pygi-marshal-from-py.c +--- pygobject-3.8.2/gi/pygi-marshal-from-py.c.pass-gvalues-by-reference 2013-05-13 11:24:49.000000000 -0400 ++++ pygobject-3.8.2/gi/pygi-marshal-from-py.c 2014-09-15 09:00:18.401422919 -0400 +@@ -1650,7 +1650,7 @@ _pygi_marshal_from_py_interface_struct ( + } else if (iface_cache->g_type == G_TYPE_VALUE) { + return pygi_marshal_from_py_gvalue(py_arg, arg, + arg_cache->transfer, +- arg_cache->is_caller_allocates); ++ TRUE /*copy_reference*/); + } else if (iface_cache->is_foreign) { + PyObject *success; + success = pygi_struct_foreign_convert_to_g_argument (py_arg, +@@ -1898,13 +1898,14 @@ pygi_marshal_from_py_gobject (PyObject * + * py_arg: (in): + * arg: (out): + * transfer: +- * is_allocated: TRUE if arg->v_pointer is an already allocated GValue ++ * copy_reference: TRUE if arg should use the pointer reference held by py_arg ++ * when it is already holding a GValue vs. copying the value. + */ + gboolean + pygi_marshal_from_py_gvalue (PyObject *py_arg, + GIArgument *arg, + GITransfer transfer, +- gboolean is_allocated) { ++ gboolean copy_reference) { + GValue *value; + GType object_type; + +@@ -1914,24 +1915,21 @@ pygi_marshal_from_py_gvalue (PyObject *p + return FALSE; + } + +- if (is_allocated) +- value = (GValue *)arg->v_pointer; +- else +- value = g_slice_new0 (GValue); +- + /* if already a gvalue, use that, else marshal into gvalue */ + if (object_type == G_TYPE_VALUE) { + GValue *source_value = pyg_boxed_get (py_arg, GValue); +- if (G_VALUE_TYPE (value) == G_TYPE_INVALID) ++ if (copy_reference) { ++ value = source_value; ++ } else { ++ value = g_slice_new0 (GValue); + g_value_init (value, G_VALUE_TYPE (source_value)); +- g_value_copy (source_value, value); ++ g_value_copy (source_value, value); ++ } + } else { +- if (G_VALUE_TYPE (value) == G_TYPE_INVALID) +- g_value_init (value, object_type); +- ++ value = g_slice_new0 (GValue); ++ g_value_init (value, object_type); + if (pyg_value_from_pyobject (value, py_arg) < 0) { +- if (!is_allocated) +- g_slice_free (GValue, value); ++ g_slice_free (GValue, value); + PyErr_SetString (PyExc_RuntimeError, "PyObject conversion to GValue failed"); + return FALSE; + } +diff -up pygobject-3.8.2/gi/pygi-marshal-from-py.h.pass-gvalues-by-reference pygobject-3.8.2/gi/pygi-marshal-from-py.h +--- pygobject-3.8.2/gi/pygi-marshal-from-py.h.pass-gvalues-by-reference 2013-05-13 11:24:49.000000000 -0400 ++++ pygobject-3.8.2/gi/pygi-marshal-from-py.h 2014-09-15 09:00:18.402422952 -0400 +@@ -193,7 +193,7 @@ gboolean pygi_marshal_from_py_gobject (P + gboolean pygi_marshal_from_py_gvalue (PyObject *py_arg, /*in*/ + GIArgument *arg, /*out*/ + GITransfer transfer, +- gboolean is_allocated); ++ gboolean copy_reference); + + gboolean pygi_marshal_from_py_gclosure(PyObject *py_arg, /*in*/ + GIArgument *arg); /*out*/ diff --git a/SPECS/pygobject3.spec b/SPECS/pygobject3.spec index 1e9de8e..cdbc83c 100644 --- a/SPECS/pygobject3.spec +++ b/SPECS/pygobject3.spec @@ -22,7 +22,7 @@ Name: pygobject3 Version: 3.8.2 -Release: 4%{?dist} +Release: 6%{?dist} License: LGPLv2+ and MIT Group: Development/Languages Summary: Python 2 bindings for GObject Introspection @@ -75,6 +75,14 @@ Patch3: test-list-marshalling.patch # https://bugzilla.gnome.org/show_bug.cgi?id=697138 Patch5: pygobject-3.8.0-known-failures.txt +# Re-add support for passing GValue's by reference +# https://bugzilla.gnome.org/show_bug.cgi?id=701058 +Patch6: pygobject-3.8.2-pass-gvalues-by-reference.patch + +# Fix memory leak for caller allocated GValue out arguments +# https://bugzilla.gnome.org/show_bug.cgi?id=709397 +Patch7: pygobject-3.8.2-gvalue-memory-leak.patch + ### Build Dependencies ### BuildRequires: chrpath @@ -160,6 +168,8 @@ for use in Python 3 programs. %patch2 -p1 -b .known-failures %patch3 -p1 -b .test-list-marshalling %patch5 -p1 +%patch6 -p1 -b .pass-gvalues-by-reference +%patch7 -p1 -b .gvalue-memory-leak %if 0%{?with_python3} rm -rf %{py3dir} @@ -271,6 +281,14 @@ xvfb-run make DESTDIR=$RPM_BUILD_ROOT check %{verbosity} %endif # with_python3 %changelog +* Fri Sep 26 2014 Matthew Barnes - 3.8.2-6 +- Fix memory leak for caller allocated GValue out arguments. +- Resolves: rhbz#1015413 + +* Mon Sep 15 2014 Matthew Barnes - 3.8.2-5 +- Re-add support for passing GValue's by reference. +- Resolves: rhbz#1138372 + * Fri Jan 24 2014 Daniel Mach - 3.8.2-4 - Mass rebuild 2014-01-24