summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Feltman <sfeltman@src.gnome.org>2014-07-28 04:40:36 -0700
committerSimon Feltman <sfeltman@src.gnome.org>2014-08-17 22:31:19 -0700
commit142ff1903d34876db3d1bee5e9782ac49de12313 (patch)
tree0de158b71ff3b107fbdc6034f2bd1ac7d0054015
parent04816f74194bd2c95b8b958dcf9ed5da5a83e001 (diff)
downloadpygobject-142ff1903d34876db3d1bee5e9782ac49de12313.tar.gz
Never dup data structures when marshaling signal in arguments
Always assume transfer-none of GValue arguments to signal handlers. A signal handler with arguments marked as transfer-full does not make any sense, so assume they are always transfer-none. https://bugzilla.gnome.org/show_bug.cgi?id=726999
-rw-r--r--gi/pygi-signal-closure.c4
-rw-r--r--gi/pygi-value.c4
2 files changed, 4 insertions, 4 deletions
diff --git a/gi/pygi-signal-closure.c b/gi/pygi-signal-closure.c
index 39e08819..0c6b9b97 100644
--- a/gi/pygi-signal-closure.c
+++ b/gi/pygi-signal-closure.c
@@ -109,14 +109,12 @@ pygi_signal_closure_marshal(GClosure *closure,
} else if (i < sig_info_highest_arg) {
GIArgInfo arg_info;
GITypeInfo type_info;
- GITransfer transfer;
GIArgument arg = { 0, };
PyObject *item = NULL;
gboolean free_array = FALSE;
g_callable_info_load_arg(signal_info, i - 1, &arg_info);
g_arg_info_load_type(&arg_info, &type_info);
- transfer = g_arg_info_get_ownership_transfer(&arg_info);
arg = _pygi_argument_from_g_value(&param_values[i], &type_info);
@@ -130,7 +128,7 @@ pygi_signal_closure_marshal(GClosure *closure,
&free_array);
}
- item = _pygi_argument_to_object (&arg, &type_info, transfer);
+ item = _pygi_argument_to_object (&arg, &type_info, GI_TRANSFER_NOTHING);
if (free_array) {
g_array_free (arg.v_pointer, FALSE);
diff --git a/gi/pygi-value.c b/gi/pygi-value.c
index f54f8e18..42cee822 100644
--- a/gi/pygi-value.c
+++ b/gi/pygi-value.c
@@ -80,7 +80,9 @@ _pygi_argument_from_g_value(const GValue *value,
break;
case GI_TYPE_TAG_UTF8:
case GI_TYPE_TAG_FILENAME:
- arg.v_string = g_value_dup_string (value);
+ /* Callers are responsible for ensuring the GValue stays alive
+ * long enough for the string to be copied. */
+ arg.v_string = (char *)g_value_get_string (value);
break;
case GI_TYPE_TAG_GLIST:
case GI_TYPE_TAG_GSLIST: