X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-message.c;h=f09f0d682df372a6a8589825f99c50072317bb14;hb=96415cad2fdd8d280ae94b02651b5f826a2f7f3d;hp=b0f4b16d41ad726fef73077eb88ca9bcfaf9af09;hpb=3547329642fef7468548320131ab992517957e81;p=elogind.git diff --git a/src/libsystemd-bus/bus-message.c b/src/libsystemd-bus/bus-message.c index b0f4b16d4..f09f0d682 100644 --- a/src/libsystemd-bus/bus-message.c +++ b/src/libsystemd-bus/bus-message.c @@ -151,7 +151,7 @@ static void message_free(sd_bus_message *m) { free(m->root_container.signature); free(m->root_container.offsets); - free(m->peeked_signature); + free(m->root_container.peeked_signature); bus_creds_done(&m->creds); free(m); @@ -2055,7 +2055,7 @@ static int bus_message_close_struct(sd_bus_message *m, struct bus_container *c, 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 @@ -2067,7 +2067,8 @@ static int bus_message_close_struct(sd_bus_message *m, struct bus_container *c, 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); @@ -3915,6 +3916,7 @@ _public_ int sd_bus_message_enter_container(sd_bus_message *m, w = m->containers + m->n_containers++; w->enclosing = type; w->signature = signature; + w->peeked_signature = NULL; w->index = 0; w->before = before; @@ -3959,6 +3961,7 @@ _public_ int sd_bus_message_exit_container(sd_bus_message *m) { } free(c->signature); + free(c->peeked_signature); free(c->offsets); m->n_containers--; @@ -4036,10 +4039,8 @@ _public_ int sd_bus_message_peek_type(sd_bus_message *m, char *type, const char if (!sig) return -ENOMEM; - free(m->peeked_signature); - m->peeked_signature = sig; - - *contents = sig; + free(c->peeked_signature); + *contents = c->peeked_signature = sig; } if (type) @@ -4064,10 +4065,8 @@ _public_ int sd_bus_message_peek_type(sd_bus_message *m, char *type, const char if (!sig) return -ENOMEM; - free(m->peeked_signature); - m->peeked_signature = sig; - - *contents = sig; + free(c->peeked_signature); + *contents = c->peeked_signature = sig; } if (type) @@ -4107,15 +4106,15 @@ _public_ int sd_bus_message_peek_type(sd_bus_message *m, char *type, const char if (k > c->item_size) return -EBADMSG; - free(m->peeked_signature); - m->peeked_signature = strndup((char*) q + 1, k - 1); - if (!m->peeked_signature) + free(c->peeked_signature); + c->peeked_signature = strndup((char*) q + 1, k - 1); + if (!c->peeked_signature) return -ENOMEM; - if (!signature_is_valid(m->peeked_signature, true)) + if (!signature_is_valid(c->peeked_signature, true)) return -EBADMSG; - *contents = m->peeked_signature; + *contents = c->peeked_signature; } else { size_t rindex, l; @@ -5524,3 +5523,13 @@ int bus_message_remarshal(sd_bus *bus, sd_bus_message **m) { return 0; } + +int bus_message_append_sender(sd_bus_message *m, const char *sender) { + assert(m); + assert(sender); + + assert_return(!m->sealed, -EPERM); + assert_return(!m->sender, -EPERM); + + return message_append_field_string(m, BUS_MESSAGE_HEADER_SENDER, SD_BUS_TYPE_STRING, sender, &m->sender); +}