GVariant: fix alignment of elements in array 31/179931/5
authorAdrian Szyndela <adrian.s@samsung.com>
Wed, 23 May 2018 10:49:48 +0000 (12:49 +0200)
committerAdrian Szyndela <adrian.s@samsung.com>
Thu, 24 May 2018 10:40:23 +0000 (12:40 +0200)
This patch fixes two related bugs:
1. off-by-one in checking size and alignment of the next element
   in_dbus_reader_get_signature_fixed_size()
2. alignment requirements were not considered at all while iterating
   over array of variable size elements in array_reader_next().

Change-Id: Ibd9e1f3d11fbcd3ef0e6dbaa024e66b2568709d5

dbus/dbus-marshal-gvariant.c
dbus/dbus-marshal-recursive.c

index 3a86225..8fd7f22 100644 (file)
@@ -960,7 +960,7 @@ _dbus_reader_get_signature_fixed_size (const DBusString *signature, int *pos, in
           res = update_size (res, res_recursive, &current_alignment, alignment_recursive);
 
           /* and update position */
-          *pos = recursive_pos - 1;
+          *pos = recursive_pos;
         }
         break;
          case DBUS_TYPE_INVALID:
index af027ed..4e89927 100644 (file)
@@ -684,8 +684,10 @@ array_reader_next (DBusTypeReader *reader,
       int size = _dbus_reader_get_type_fixed_size (reader, &alignment);
       if (0 == size)
         {
-          /* variable size - use offsets*/
-          reader->value_pos = _dbus_reader_get_offset_of_end_of_variable (reader);
+          /* variable size - use offsets - BUT consider also alignment,
+             because elements in the array might have alignment requirements.
+           */
+          reader->value_pos = _DBUS_ALIGN_VALUE(_dbus_reader_get_offset_of_end_of_variable (reader), alignment);
           reader->variable_index++;
           reader->finished = (reader->variable_index >= reader->n_offsets);
         }