Gentoo Archives: gentoo-commits

From: "Pacho Ramos (pacho)" <pacho@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] gentoo-x86 commit in dev-libs/gobject-introspection/files: gobject-introspection-1.40.0-gjs-crash.patch
Date: Fri, 26 Sep 2014 10:31:55
Message-Id: 20140926103149.9A911650A@oystercatcher.gentoo.org
1 pacho 14/09/26 10:31:49
2
3 Added: gobject-introspection-1.40.0-gjs-crash.patch
4 Log:
5 Prevent gjs crashes, bug #523608 by Serge Gavrilov
6
7 (Portage version: 2.2.12/cvs/Linux x86_64, signed Manifest commit with key A188FBD4)
8
9 Revision Changes Path
10 1.1 dev-libs/gobject-introspection/files/gobject-introspection-1.40.0-gjs-crash.patch
11
12 file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/dev-libs/gobject-introspection/files/gobject-introspection-1.40.0-gjs-crash.patch?rev=1.1&view=markup
13 plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/dev-libs/gobject-introspection/files/gobject-introspection-1.40.0-gjs-crash.patch?rev=1.1&content-type=text/plain
14
15 Index: gobject-introspection-1.40.0-gjs-crash.patch
16 ===================================================================
17 From a4c9d09d7a89d3c80b4465a5c2ae0efa24158b24 Mon Sep 17 00:00:00 2001
18 From: Giovanni Campagna <gcampagna@×××××××××.org>
19 Date: Tue, 6 May 2014 18:53:21 +0200
20 Subject: Parse and expose ownership transfer for instance parameters
21
22 Knowing the ownership transfer for instance parameters is
23 necessary for correct memory management of functions which
24 "eat" their instance argument, such as g_dbus_method_invocation_return_*.
25 Parse this information from the gir file and store in the
26 typelib, and then provide new API on GICallableInfo to
27 retrieve this.
28
29 https://bugzilla.gnome.org/show_bug.cgi?id=729662
30
31 diff --git a/girepository/gicallableinfo.c b/girepository/gicallableinfo.c
32 index e69e3e9..702e16c 100644
33 --- a/girepository/gicallableinfo.c
34 +++ b/girepository/gicallableinfo.c
35 @@ -276,6 +276,32 @@ g_callable_info_get_caller_owns (GICallableInfo *info)
36 }
37
38 /**
39 + * g_callable_info_get_instance_ownership_transfer:
40 + * @info: a #GICallableInfo
41 + *
42 + * Obtains the ownership transfer for the instance argument.
43 + * #GITransfer contains a list of possible transfer values.
44 + *
45 + * Returns: the transfer
46 + */
47 +GITransfer
48 +g_callable_info_get_instance_ownership_transfer (GICallableInfo *info)
49 +{
50 + GIRealInfo *rinfo = (GIRealInfo*) info;
51 + SignatureBlob *blob;
52 +
53 + g_return_val_if_fail (info != NULL, -1);
54 + g_return_val_if_fail (GI_IS_CALLABLE_INFO (info), -1);
55 +
56 + blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)];
57 +
58 + if (blob->instance_transfer_ownership)
59 + return GI_TRANSFER_EVERYTHING;
60 + else
61 + return GI_TRANSFER_NOTHING;
62 +}
63 +
64 +/**
65 * g_callable_info_get_n_args:
66 * @info: a #GICallableInfo
67 *
68 diff --git a/girepository/gicallableinfo.h b/girepository/gicallableinfo.h
69 index 71f9d0c..f273d29 100644
70 --- a/girepository/gicallableinfo.h
71 +++ b/girepository/gicallableinfo.h
72 @@ -73,6 +73,8 @@ gboolean g_callable_info_invoke (GICallableInfo *info,
73 gboolean is_method,
74 gboolean throws,
75 GError **error);
76 +GITransfer g_callable_info_get_instance_ownership_transfer (GICallableInfo *info);
77 +
78 G_END_DECLS
79
80
81 diff --git a/girepository/girepository.symbols b/girepository/girepository.symbols
82 index 5f01adf..48fb0d9 100644
83 --- a/girepository/girepository.symbols
84 +++ b/girepository/girepository.symbols
85 @@ -26,6 +26,7 @@ g_info_new
86 g_callable_info_can_throw_gerror
87 g_callable_info_get_arg
88 g_callable_info_get_caller_owns
89 +g_callable_info_get_instance_ownership_transfer
90 g_callable_info_get_n_args
91 g_callable_info_get_return_attribute
92 g_callable_info_get_return_type
93 diff --git a/girepository/girnode.c b/girepository/girnode.c
94 index 53385c2..a7a77e3 100644
95 --- a/girepository/girnode.c
96 +++ b/girepository/girnode.c
97 @@ -1664,6 +1664,7 @@ _g_ir_node_build_typelib (GIrNode *node,
98 blob2->caller_owns_return_value = function->result->transfer;
99 blob2->caller_owns_return_container = function->result->shallow_transfer;
100 blob2->skip_return = function->result->skip;
101 + blob2->instance_transfer_ownership = function->instance_transfer_full;
102 blob2->reserved = 0;
103 blob2->n_arguments = n;
104
105 @@ -1762,6 +1763,7 @@ _g_ir_node_build_typelib (GIrNode *node,
106 blob2->may_return_null = signal->result->nullable;
107 blob2->caller_owns_return_value = signal->result->transfer;
108 blob2->caller_owns_return_container = signal->result->shallow_transfer;
109 + blob2->instance_transfer_ownership = signal->instance_transfer_full;
110 blob2->reserved = 0;
111 blob2->n_arguments = n;
112
113 @@ -1820,6 +1822,7 @@ _g_ir_node_build_typelib (GIrNode *node,
114 blob2->may_return_null = vfunc->result->nullable;
115 blob2->caller_owns_return_value = vfunc->result->transfer;
116 blob2->caller_owns_return_container = vfunc->result->shallow_transfer;
117 + blob2->instance_transfer_ownership = vfunc->instance_transfer_full;
118 blob2->reserved = 0;
119 blob2->n_arguments = n;
120
121 diff --git a/girepository/girnode.h b/girepository/girnode.h
122 index 4beef7f..02196e7 100644
123 --- a/girepository/girnode.h
124 +++ b/girepository/girnode.h
125 @@ -100,6 +100,7 @@ struct _GIrNodeFunction
126 gboolean is_constructor;
127 gboolean wraps_vfunc;
128 gboolean throws;
129 + gboolean instance_transfer_full;
130
131 gchar *symbol;
132
133 @@ -188,6 +189,7 @@ struct _GIrNodeSignal
134 gboolean detailed;
135 gboolean action;
136 gboolean no_hooks;
137 + gboolean instance_transfer_full;
138
139 gboolean has_class_closure;
140 gboolean true_stops_emit;
141 @@ -208,6 +210,7 @@ struct _GIrNodeVFunc
142 gboolean must_not_be_implemented;
143 gboolean is_class_closure;
144 gboolean throws;
145 + gboolean instance_transfer_full;
146
147 char *invoker;
148
149 diff --git a/girepository/girparser.c b/girepository/girparser.c
150 index 6c76866..f928c2e 100644
151 --- a/girepository/girparser.c
152 +++ b/girepository/girparser.c
153 @@ -1047,6 +1047,71 @@ parse_param_transfer (GIrNodeParam *param, const gchar *transfer, const gchar *n
154 }
155
156 static gboolean
157 +start_instance_parameter (GMarkupParseContext *context,
158 + const gchar *element_name,
159 + const gchar **attribute_names,
160 + const gchar **attribute_values,
161 + ParseContext *ctx,
162 + GError **error)
163 +{
164 + const gchar *transfer;
165 + gboolean transfer_full;
166 +
167 + if (!(strcmp (element_name, "instance-parameter") == 0 &&
168 + ctx->state == STATE_FUNCTION_PARAMETERS))
169 + return FALSE;
170 +
171 + transfer = find_attribute ("transfer-ownership", attribute_names, attribute_values);
172 +
173 + state_switch (ctx, STATE_PASSTHROUGH);
174 +
175 + if (strcmp (transfer, "full") == 0)
176 + transfer_full = TRUE;
177 + else if (strcmp (transfer, "none") == 0)
178 + transfer_full = FALSE;
179 + else
180 + {
181 + g_set_error (error, G_MARKUP_ERROR,
182 + G_MARKUP_ERROR_INVALID_CONTENT,
183 + "invalid value for 'transfer-ownership' for instance parameter: %s", transfer);
184 + return FALSE;
185 + }
186 +
187 + switch (CURRENT_NODE (ctx)->type)
188 + {
189 + case G_IR_NODE_FUNCTION:
190 + case G_IR_NODE_CALLBACK:
191 + {
192 + GIrNodeFunction *func;
193 +
194 + func = (GIrNodeFunction *)CURRENT_NODE (ctx);
195 + func->instance_transfer_full = transfer_full;
196 + }
197 + break;
198 + case G_IR_NODE_SIGNAL:
199 + {
200 + GIrNodeSignal *signal;
201 +
202 + signal = (GIrNodeSignal *)CURRENT_NODE (ctx);
203 + signal->instance_transfer_full = transfer_full;
204 + }
205 + break;
206 + case G_IR_NODE_VFUNC:
207 + {
208 + GIrNodeVFunc *vfunc;
209 +
210 + vfunc = (GIrNodeVFunc *)CURRENT_NODE (ctx);
211 + vfunc->instance_transfer_full = transfer_full;
212 + }
213 + break;
214 + default:
215 + g_assert_not_reached ();
216 + }
217 +
218 + return TRUE;
219 +}
220 +
221 +static gboolean
222 start_parameter (GMarkupParseContext *context,
223 const gchar *element_name,
224 const gchar **attribute_names,
225 @@ -2848,11 +2913,10 @@ start_element_handler (GMarkupParseContext *context,
226 attribute_names, attribute_values,
227 ctx, error))
228 goto out;
229 - else if (strcmp (element_name, "instance-parameter") == 0)
230 - {
231 - state_switch (ctx, STATE_PASSTHROUGH);
232 - goto out;
233 - }
234 + else if (start_instance_parameter (context, element_name,
235 + attribute_names, attribute_values,
236 + ctx, error))
237 + goto out;
238 else if (strcmp (element_name, "c:include") == 0)
239 {
240 state_switch (ctx, STATE_C_INCLUDE);
241 diff --git a/girepository/gitypelib-internal.h b/girepository/gitypelib-internal.h
242 index 93d621b..5ccb617 100644
243 --- a/girepository/gitypelib-internal.h
244 +++ b/girepository/gitypelib-internal.h
245 @@ -465,6 +465,8 @@ typedef struct {
246 * freeing the container, but not its contents.
247 * @skip_return: Indicates that the return value is only useful in C and should
248 * be skipped.
249 + * @instance_transfer_ownership: When calling, the function assumes ownership of
250 + * the instance parameter.
251 * @reserved: Reserved for future use.
252 * @n_arguments: The number of arguments that this function expects, also the
253 * length of the array of ArgBlobs.
254 @@ -479,7 +481,8 @@ typedef struct {
255 guint16 caller_owns_return_value : 1;
256 guint16 caller_owns_return_container : 1;
257 guint16 skip_return : 1;
258 - guint16 reserved :12;
259 + guint16 instance_transfer_ownership : 1;
260 + guint16 reserved :11;
261
262 guint16 n_arguments;
263
264 diff --git a/tests/repository/gitypelibtest.c b/tests/repository/gitypelibtest.c
265 index 565c95c..7b9cb35 100644
266 --- a/tests/repository/gitypelibtest.c
267 +++ b/tests/repository/gitypelibtest.c
268 @@ -276,6 +276,34 @@ test_signal_array_len (GIRepository * repo)
269 g_base_info_unref (testobj_info);
270 }
271
272 +static void
273 +test_instance_transfer_ownership (GIRepository * repo)
274 +{
275 + GIObjectInfo *testobj_info;
276 + GIFunctionInfo *func_info;
277 + GITransfer transfer;
278 +
279 + g_assert (g_irepository_require (repo, "Regress", NULL, 0, NULL));
280 + testobj_info = g_irepository_find_by_name (repo, "Regress", "TestObj");
281 + g_assert (testobj_info != NULL);
282 +
283 + func_info = g_object_info_find_method (testobj_info, "instance_method");
284 + g_assert (func_info != NULL);
285 + transfer = g_callable_info_get_instance_ownership_transfer ((GICallableInfo*) func_info);
286 + g_assert_cmpint (GI_TRANSFER_NOTHING, ==, transfer);
287 +
288 + g_base_info_unref (func_info);
289 +
290 + func_info = g_object_info_find_method (testobj_info, "instance_method_full");
291 + g_assert (func_info != NULL);
292 + transfer = g_callable_info_get_instance_ownership_transfer ((GICallableInfo*) func_info);
293 + g_assert_cmpint (GI_TRANSFER_EVERYTHING, ==, transfer);
294 +
295 + g_base_info_unref (func_info);
296 +
297 + g_base_info_unref (testobj_info);
298 +}
299 +
300 int
301 main (int argc, char **argv)
302 {
303 @@ -292,6 +320,7 @@ main (int argc, char **argv)
304 test_hash_with_cairo_typelib (repo);
305 test_char_types (repo);
306 test_signal_array_len (repo);
307 + test_instance_transfer_ownership (repo);
308
309 exit (0);
310 }
311 diff --git a/tests/scanner/Regress-1.0-C-expected/Regress.TestObj.instance_method_full.page b/tests/scanner/Regress-1.0-C-expected/Regress.TestObj.instance_method_full.page
312 new file mode 100644
313 index 0000000..2222bec
314 --- /dev/null
315 +++ b/tests/scanner/Regress-1.0-C-expected/Regress.TestObj.instance_method_full.page
316 @@ -0,0 +1,38 @@
317 +<?xml version="1.0"?>
318 +<page id="Regress.TestObj.instance_method_full"
319 + type="topic"
320 + style="method"
321 + xmlns="http://projectmallard.org/1.0/"
322 + xmlns:api="http://projectmallard.org/experimental/api/"
323 + xmlns:ui="http://projectmallard.org/1.0/ui/">
324 + <info>
325 + <link xref="Regress.TestObj" group="method" type="guide"/>
326 + <api:function>
327 + <api:returns>
328 + <api:type>void</api:type>
329 + </api:returns>
330 + <api:name>regress_test_obj_instance_method_full</api:name>
331 + <api:arg>
332 + <api:type>RegressTestObj*</api:type>
333 + <api:name>obj</api:name>
334 + </api:arg>
335 + </api:function>
336 + </info>
337 + <title>regress_test_obj_instance_method_full</title>
338 + <synopsis><code mime="text/x-csrc">
339 +void regress_test_obj_instance_method_full (RegressTestObj* obj);
340 + </code></synopsis>
341 +
342 +
343 +<terms>
344 +<item>
345 +<title><code>obj</code></title>
346 +
347 +</item>
348 +<item>
349 +<title><code>Returns</code></title>
350 +
351 +</item>
352 +</terms>
353 +
354 +</page>
355 diff --git a/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestObj.instance_method_full.page b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestObj.instance_method_full.page
356 new file mode 100644
357 index 0000000..5b7e1c9
358 --- /dev/null
359 +++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestObj.instance_method_full.page
360 @@ -0,0 +1,26 @@
361 +<?xml version="1.0"?>
362 +<page id="Regress.TestObj.instance_method_full"
363 + type="topic"
364 + style="method"
365 + xmlns="http://projectmallard.org/1.0/"
366 + xmlns:api="http://projectmallard.org/experimental/api/"
367 + xmlns:ui="http://projectmallard.org/1.0/ui/">
368 + <info>
369 + <link xref="Regress.TestObj" group="method" type="guide"/>
370 + <api:function>
371 + <api:returns>
372 + <api:type>void</api:type>
373 + </api:returns>
374 + <api:name>regress_test_obj_instance_method_full</api:name>
375 + </api:function>
376 + </info>
377 + <title>Regress.TestObj.prototype.instance_method_full</title>
378 + <synopsis><code mime="text/x-gjs">
379 +function instance_method_full(): void {
380 + // Gjs wrapper for regress_test_obj_instance_method_full()
381 +}
382 + </code></synopsis>
383 +
384 +
385 +
386 +</page>
387 diff --git a/tests/scanner/Regress-1.0-Python-expected/Regress.TestObj.instance_method_full.page b/tests/scanner/Regress-1.0-Python-expected/Regress.TestObj.instance_method_full.page
388 new file mode 100644
389 index 0000000..2b5c1dc
390 --- /dev/null
391 +++ b/tests/scanner/Regress-1.0-Python-expected/Regress.TestObj.instance_method_full.page
392 @@ -0,0 +1,37 @@
393 +<?xml version="1.0"?>
394 +<page id="Regress.TestObj.instance_method_full"
395 + type="topic"
396 + style="method"
397 + xmlns="http://projectmallard.org/1.0/"
398 + xmlns:api="http://projectmallard.org/experimental/api/"
399 + xmlns:ui="http://projectmallard.org/1.0/ui/">
400 + <info>
401 + <link xref="Regress.TestObj" group="method" type="guide"/>
402 + <api:function>
403 + <api:returns>
404 + <api:type>none</api:type>
405 + </api:returns>
406 + <api:name>regress_test_obj_instance_method_full</api:name>
407 + <api:arg>
408 + <api:type>Regress.TestObj</api:type>
409 + <api:name>self</api:name>
410 + </api:arg>
411 + </api:function>
412 + </info>
413 + <title>Regress.TestObj.instance_method_full</title>
414 + <synopsis><code mime="text/x-python">
415 +@accepts(Regress.TestObj)
416 +@returns(none)
417 +def instance_method_full(self):
418 + # Python wrapper for regress_test_obj_instance_method_full()
419 + </code></synopsis>
420 +
421 +
422 +<terms>
423 +<item>
424 +<title><code>self</code></title>
425 +
426 +</item>
427 +</terms>
428 +
429 +</page>
430 diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
431 index 1c9c300..89ecaa4 100644
432 --- a/tests/scanner/Regress-1.0-expected.gir
433 +++ b/tests/scanner/Regress-1.0-expected.gir
434 @@ -3057,6 +3057,17 @@ case.</doc>
435 </parameter>
436 </parameters>
437 </method>
438 + <method name="instance_method_full"
439 + c:identifier="regress_test_obj_instance_method_full">
440 + <return-value transfer-ownership="none">
441 + <type name="none" c:type="void"/>
442 + </return-value>
443 + <parameters>
444 + <instance-parameter name="obj" transfer-ownership="full">
445 + <type name="TestObj" c:type="RegressTestObj*"/>
446 + </instance-parameter>
447 + </parameters>
448 + </method>
449 <method name="set_bare" c:identifier="regress_test_obj_set_bare">
450 <return-value transfer-ownership="none">
451 <type name="none" c:type="void"/>
452 diff --git a/tests/scanner/Regress-1.0-sections-expected.txt b/tests/scanner/Regress-1.0-sections-expected.txt
453 index c9ff60a..187aa16 100644
454 --- a/tests/scanner/Regress-1.0-sections-expected.txt
455 +++ b/tests/scanner/Regress-1.0-sections-expected.txt
456 @@ -334,6 +334,7 @@ regress_test_obj_emit_sig_with_uint64
457 regress_forced_method
458 regress_test_obj_instance_method
459 regress_test_obj_instance_method_callback
460 +regress_test_obj_instance_method_full
461 regress_test_obj_set_bare
462 regress_test_obj_skip_inout_param
463 regress_test_obj_skip_out_param
464 diff --git a/tests/scanner/regress.c b/tests/scanner/regress.c
465 index 1bad36e..b42e0cd 100644
466 --- a/tests/scanner/regress.c
467 +++ b/tests/scanner/regress.c
468 @@ -2679,6 +2679,17 @@ regress_test_obj_instance_method (RegressTestObj *obj)
469 return -1;
470 }
471
472 +/**
473 + * regress_test_obj_instance_method_full:
474 + * @obj: (transfer full):
475 + *
476 + */
477 +void
478 +regress_test_obj_instance_method_full (RegressTestObj *obj)
479 +{
480 + g_object_unref (obj);
481 +}
482 +
483 double
484 regress_test_obj_static_method (int x)
485 {
486 diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
487 index e2e645b..667f129 100644
488 --- a/tests/scanner/regress.h
489 +++ b/tests/scanner/regress.h
490 @@ -527,6 +527,7 @@ void regress_test_obj_emit_sig_with_foreign_struct (RegressTestObj *obj);
491 void regress_test_obj_emit_sig_with_int64 (RegressTestObj *obj);
492 void regress_test_obj_emit_sig_with_uint64 (RegressTestObj *obj);
493 int regress_test_obj_instance_method (RegressTestObj *obj);
494 +void regress_test_obj_instance_method_full (RegressTestObj *obj);
495 double regress_test_obj_static_method (int x);
496 void regress_forced_method (RegressTestObj *obj);
497
498 --
499 cgit v0.10.1