From 13b93f0c48a39c3502f55e011362bcb4d40a5a7d Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Thu, 9 Jun 2011 12:02:30 -0400 Subject: [PATCH] =?utf8?q?Bug=20652197=20=E2=80=93=20Improper=20handling?= =?utf8?q?=20of=20double=20values=20in=20GDBusMessage?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- gio/gdbusmessage.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) 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)) -- 2.7.4