From: David Zeuthen Date: Thu, 9 Jun 2011 16:02:30 +0000 (-0400) Subject: Bug 652197 – Improper handling of double values in GDBusMessage X-Git-Tag: 2.29.8~18 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=13b93f0c48a39c3502f55e011362bcb4d40a5a7d;p=platform%2Fupstream%2Fglib.git Bug 652197 – Improper handling of double values in GDBusMessage Matthew Bucknall pointed out GDBusMessage does not serialize/deserialize double values correctly on platforms with strict alignment constraints (in my particular case, ARM926EJ-S). This was reported in https://bugzilla.gnome.org/show_bug.cgi?id=652197 Signed-off-by: David Zeuthen --- diff --git a/gio/gdbusmessage.c b/gio/gdbusmessage.c index 5fc67e7..b5e4ffe 100644 --- a/gio/gdbusmessage.c +++ b/gio/gdbusmessage.c @@ -1184,14 +1184,15 @@ parse_value_from_blob (GMemoryInputStream *mis, goto fail; if (!just_align) { - guint64 v; - gdouble *encoded; + union { + guint64 v_uint64; + gdouble v_double; + } u; G_STATIC_ASSERT (sizeof (gdouble) == sizeof (guint64)); - v = g_data_input_stream_read_uint64 (dis, NULL, &local_error); + u.v_uint64 = g_data_input_stream_read_uint64 (dis, NULL, &local_error); if (local_error != NULL) goto fail; - encoded = (gdouble *) &v; - ret = g_variant_new_double (*encoded); + ret = g_variant_new_double (u.v_double); } } else if (g_variant_type_equal (type, G_VARIANT_TYPE_STRING)) @@ -1941,11 +1942,13 @@ append_value_to_blob (GVariant *value, padding_added = ensure_output_padding (mos, dos, 8); if (value != NULL) { - guint64 *encoded; - gdouble v = g_variant_get_double (value); + union { + guint64 v_uint64; + gdouble v_double; + } u; G_STATIC_ASSERT (sizeof (gdouble) == sizeof (guint64)); - encoded = (guint64 *) &v; - g_data_output_stream_put_uint64 (dos, *encoded, NULL, NULL); + u.v_double = g_variant_get_double (value); + g_data_output_stream_put_uint64 (dos, u.v_uint64, NULL, NULL); } } else if (g_variant_type_equal (type, G_VARIANT_TYPE_STRING))