[glib] Bug 652197 – Improper handling of double values in GDBusMessage
- From: David Zeuthen <davidz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] Bug 652197 – Improper handling of double values in GDBusMessage
- Date: Thu, 9 Jun 2011 16:04:19 +0000 (UTC)
commit 13b93f0c48a39c3502f55e011362bcb4d40a5a7d
Author: David Zeuthen <davidz redhat com>
Date: Thu Jun 9 12:02:30 2011 -0400
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 <davidz redhat com>
gio/gdbusmessage.c | 21 ++++++++++++---------
1 files 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))
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]