From 98ca091094df5b6f9084bc240d2ca55dfbfc2226 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 14 Oct 2016 15:24:43 +0200 Subject: [PATCH] Bugfix, GVariant: missing padding for fixed-size tuples. There is a requirement for fixed-size tuples: size of such tuple must be a multiply of its required alignment. That part was overlooked in the implementation. This commit adds padding accounting for both reading and writing. Change-Id: I0825be6436b93b836dc333f5a395fdf1021f2a06 --- dbus/dbus-marshal-gvariant.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dbus/dbus-marshal-gvariant.c b/dbus/dbus-marshal-gvariant.c index ebd07fe..1348965 100644 --- a/dbus/dbus-marshal-gvariant.c +++ b/dbus/dbus-marshal-gvariant.c @@ -904,6 +904,10 @@ _dbus_reader_get_signature_fixed_size (const DBusString *signature, int *pos, in case DBUS_STRUCT_END_CHAR: case DBUS_DICT_ENTRY_END_CHAR: depth--; + /* For fixed-size structs we need to account padding. + */ + if (!variable) + res = _DBUS_ALIGN_VALUE (res, current_alignment); break; case DBUS_STRUCT_BEGIN_CHAR: case DBUS_DICT_ENTRY_BEGIN_CHAR: @@ -1366,6 +1370,17 @@ _dbus_writer_unrecurse_gvariant_write (DBusTypeWriter *writer, writer->value_pos); writer->value_pos += sub_len; + /* Structs may have padding if they are fixed-size structs. + * This is because of requirement that struct size must be a multiply + * of required alignment. + */ + if (sub->is_fixed) + { + diff = _DBUS_ALIGN_VALUE (sub_len, sub->alignment) - sub_len; + result = result && _dbus_string_insert_bytes (writer->value_str, writer->value_pos, diff, 0); + writer->value_pos += diff; + } + _dbus_string_free (sub->value_str); dbus_free (sub->value_str); -- 2.7.4