Skip to content
  • David Zeuthen's avatar
    GDBus: Fix serialization of empty arrays · bb6530eb
    David Zeuthen authored
    It turns out that we didn't observe padding (neither when reading nor
    writing) for empty arrays which (apparently) is needed according to
    the D-Bus spec and reference implementation. A simple test case to
    provoke this behavior is as follows (notice the lack of 4 bytes worth
    of padding at position 0x0064):
    
     Error calling dbus_message_demarshal() on this blob: org.freedesktop.DBus.Error.InvalidArgs: Message is corrupted (Alignment padding not null)
     0000: 6c 01 00 01  2e 00 00 00  41 00 00 00  37 00 00 00    l.......A...7...
     0010: 08 01 67 00  08 73 61 7b  73 76 7d 61  73 00 00 00    ..g..sa{sv}as...
     0020: 01 01 6f 00  08 00 00 00  2f 66 6f 6f  2f 62 61 72    ..o...../foo/bar
     0030: 00 00 00 00  00 00 00 00  03 01 73 00  06 00 00 00    ..........s.....
     0040: 4d 65 6d 62  65 72 00 00  11 00 00 00  30 31 32 33    Member......0123
     0050: 34 35 36 37  38 39 30 31  32 33 34 35  36 00 00 00    4567890123456...
     0060: 00 00 00 00  0e 00 00 00  09 00 00 00  53 6f 6d 65    ............Some
     0070: 74 68 69 6e  67 00                                    thing.
    
     The blob was generated from the following GVariant value:
     ('01234567890123456', @a
    
    {sv} {}, ['Something'])
    
     If the blob was encoded using DBusMessageIter, the payload would have been:
    
     0000: 6c 01 00 01  32 00 00 00  41 00 00 00  36 00 00 00    l...2...A...6...
     0010: 01 01 6f 00  08 00 00 00  2f 66 6f 6f  2f 62 61 72    ..o...../foo/bar
     0020: 00 00 00 00  00 00 00 00  03 01 73 00  06 00 00 00    ..........s.....
     0030: 4d 65 6d 62  65 72 00 00  08 01 67 00  08 73 61 7b    Member....g..sa{
     0040: 73 76 7d 61  73 00 00 00  11 00 00 00  30 31 32 33    sv}as.......0123
     0050: 34 35 36 37  38 39 30 31  32 33 34 35  36 00 00 00    4567890123456...
     0060: 00 00 00 00  00 00 00 00  0e 00 00 00  09 00 00 00    ................
     0070: 53 6f 6d 65  74 68 69 6e  67 00                       Something.
     ** ERROR:gdbus-serialization.c:547:check_serialization: code should not be reached
     Aborted
    
    and this is now in the libdbus-1-using serialization test case.
    
    Signed-off-by: default avatarDavid Zeuthen <davidz@redhat.com>
    bb6530eb