From: Milan Crha Date: Wed, 27 Jul 2011 12:51:00 +0000 (+0200) Subject: Bug #654472 - Crash on async error return over GDBus X-Git-Tag: upstream/3.7.4~1838 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f6ea071fb544397462a253a23481cc728290a0f2;p=platform%2Fupstream%2Fevolution-data-server.git Bug #654472 - Crash on async error return over GDBus --- diff --git a/libedataserver/e-gdbus-templates.c b/libedataserver/e-gdbus-templates.c index 04f726d..1494222 100644 --- a/libedataserver/e-gdbus-templates.c +++ b/libedataserver/e-gdbus-templates.c @@ -257,8 +257,9 @@ e_gdbus_signal_emission_hook_async_void (GSignalInvocationHint *ihint, guint n_p g_variant_builder_add_value (builder, item); item = g_variant_new_string (""); g_variant_builder_add_value (builder, item); + + param_values++; } - param_values++; params = g_variant_builder_end (builder); g_variant_builder_unref (builder); @@ -301,16 +302,21 @@ e_gdbus_signal_emission_hook_async_boolean (GSignalInvocationHint *ihint, guint item = g_variant_new_string (arg_error->message); g_variant_builder_add_value (builder, item); g_free (dbus_error_name); + + /* fake value for easier processing in e_gdbus_proxy_emit_signal() */ + item = g_variant_new_boolean (FALSE); + g_variant_builder_add_value (builder, item); } else { item = g_variant_new_string (""); g_variant_builder_add_value (builder, item); item = g_variant_new_string (""); g_variant_builder_add_value (builder, item); + + param_values++; + item = g_variant_new_boolean (g_value_get_boolean (param_values)); + g_variant_builder_add_value (builder, item); + param_values++; } - param_values++; - item = g_variant_new_boolean (g_value_get_boolean (param_values)); - g_variant_builder_add_value (builder, item); - param_values++; params = g_variant_builder_end (builder); g_variant_builder_unref (builder); @@ -353,16 +359,21 @@ e_gdbus_signal_emission_hook_async_string (GSignalInvocationHint *ihint, guint n item = g_variant_new_string (arg_error->message); g_variant_builder_add_value (builder, item); g_free (dbus_error_name); + + /* fake value for easier processing in e_gdbus_proxy_emit_signal() */ + item = g_variant_new_string (""); + g_variant_builder_add_value (builder, item); } else { item = g_variant_new_string (""); g_variant_builder_add_value (builder, item); item = g_variant_new_string (""); g_variant_builder_add_value (builder, item); + + param_values++; + item = g_variant_new_string (g_value_get_string (param_values)); + g_variant_builder_add_value (builder, item); + param_values++; } - param_values++; - item = g_variant_new_string (g_value_get_string (param_values)); - g_variant_builder_add_value (builder, item); - param_values++; params = g_variant_builder_end (builder); g_variant_builder_unref (builder); @@ -400,23 +411,30 @@ e_gdbus_signal_emission_hook_async_strv (GSignalInvocationHint *ihint, guint n_p param_values++; arg_error = g_value_get_boxed (param_values); if (arg_error) { + const gchar *fake_strv; gchar *dbus_error_name = g_dbus_error_encode_gerror (arg_error); item = g_variant_new_string (dbus_error_name ? dbus_error_name : ""); g_variant_builder_add_value (builder, item); item = g_variant_new_string (arg_error->message); g_variant_builder_add_value (builder, item); g_free (dbus_error_name); + + /* fake value for easier processing in e_gdbus_proxy_emit_signal() */ + fake_strv = NULL; + item = g_variant_new_strv (&fake_strv, -1); + g_variant_builder_add_value (builder, item); } else { item = g_variant_new_string (""); g_variant_builder_add_value (builder, item); item = g_variant_new_string (""); g_variant_builder_add_value (builder, item); + + param_values++; + arg_strv = g_value_get_boxed (param_values); + item = g_variant_new_strv (arg_strv, -1); + g_variant_builder_add_value (builder, item); + param_values++; } - param_values++; - arg_strv = g_value_get_boxed (param_values); - item = g_variant_new_strv (arg_strv, -1); - g_variant_builder_add_value (builder, item); - param_values++; params = g_variant_builder_end (builder); g_variant_builder_unref (builder); @@ -459,16 +477,21 @@ e_gdbus_signal_emission_hook_async_uint (GSignalInvocationHint *ihint, guint n_p item = g_variant_new_string (arg_error->message); g_variant_builder_add_value (builder, item); g_free (dbus_error_name); + + /* fake value for easier processing in e_gdbus_proxy_emit_signal() */ + item = g_variant_new_uint32 (g_value_get_uint (0)); + g_variant_builder_add_value (builder, item); } else { item = g_variant_new_string (""); g_variant_builder_add_value (builder, item); item = g_variant_new_string (""); g_variant_builder_add_value (builder, item); + + param_values++; + item = g_variant_new_uint32 (g_value_get_uint (param_values)); + g_variant_builder_add_value (builder, item); + param_values++; } - param_values++; - item = g_variant_new_uint32 (g_value_get_uint (param_values)); - g_variant_builder_add_value (builder, item); - param_values++; params = g_variant_builder_end (builder); g_variant_builder_unref (builder);