chiark / gitweb /
bus: fix assert when serializing fixed size struct to gvariant
authorLennart Poettering <lennart@poettering.net>
Mon, 23 Dec 2013 22:48:30 +0000 (23:48 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 23 Dec 2013 22:48:30 +0000 (23:48 +0100)
src/libsystemd-bus/bus-message.c
src/libsystemd-bus/test-bus-gvariant.c

index 39a85d58f71dc20525bc9ff725d3fb9bad47dc55..9092a6697755fca8d6902217a2661b242afb968f 100644 (file)
@@ -2055,7 +2055,7 @@ static int bus_message_close_struct(sd_bus_message *m, struct bus_container *c,
                                 return r;
                 }
 
                                 return r;
                 }
 
-                assert(i <= c->n_offsets);
+                assert(!c->need_offsets || i <= c->n_offsets);
 
                 /* We need to add an offset for each item that has a
                  * variable size and that is not the last one in the
 
                 /* We need to add an offset for each item that has a
                  * variable size and that is not the last one in the
@@ -2067,7 +2067,8 @@ static int bus_message_close_struct(sd_bus_message *m, struct bus_container *c,
                 p += n;
         }
 
                 p += n;
         }
 
-        assert(i == c->n_offsets);
+        assert(!c->need_offsets || i == c->n_offsets);
+        assert(c->need_offsets || n_variable == 0);
 
         if (n_variable <= 0) {
                 a = message_extend_body(m, 1, 0, add_offset);
 
         if (n_variable <= 0) {
                 a = message_extend_body(m, 1, 0, add_offset);
index de9f00124add31d6fd7ab7588b4dbcdab4381c19..cb07c9627341d31555b0629cb5a2df8e673319ff 100644 (file)
@@ -141,9 +141,10 @@ static void test_marshal(void) {
         assert_se(sd_bus_message_new_method_call(bus, "a.service.name", "/an/object/path/which/is/really/really/long/so/that/we/hit/the/eight/bit/boundary/by/quite/some/margin/to/test/this/stuff/that/it/really/works", "an.interface.name", "AMethodName", &m) >= 0);
 
         assert_se(sd_bus_message_append(m,
         assert_se(sd_bus_message_new_method_call(bus, "a.service.name", "/an/object/path/which/is/really/really/long/so/that/we/hit/the/eight/bit/boundary/by/quite/some/margin/to/test/this/stuff/that/it/really/works", "an.interface.name", "AMethodName", &m) >= 0);
 
         assert_se(sd_bus_message_append(m,
-                                        "a(usv)", 2,
+                                        "a(usv)", 3,
                                         4711, "first-string-parameter", "(st)", "X", (uint64_t) 1111,
                                         4711, "first-string-parameter", "(st)", "X", (uint64_t) 1111,
-                                        4712, "second-string-parameter", "(a(si))", 2, "Y", 5, "Z", 6) >= 0);
+                                        4712, "second-string-parameter", "(a(si))", 2, "Y", 5, "Z", 6,
+                                        4713, "third-string-parameter", "(uu)", 1, 2) >= 0);
 
         assert_se(bus_message_seal(m, 4711, 0) >= 0);
 
 
         assert_se(bus_message_seal(m, 4711, 0) >= 0);