diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-12-24 03:02:49 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-12-24 03:02:49 +0100 |
commit | 3798fd4c30150984d6e9eb63e8e94f5410ba5996 (patch) | |
tree | c68c17ff9dbe2382100364664caa6799009358b0 /src/libsystemd-bus | |
parent | eab07b4b23544d38ff0006fa4da9217c61d94749 (diff) |
bus: allow peeking signatures recusively inside of containers
Previously we invalidated the peeked signature as soon as the caller
would recurse into a container, making stack based handling difficult.
With this change we will keep the peeked signature around until the user
advances to the next field.
Diffstat (limited to 'src/libsystemd-bus')
-rw-r--r-- | src/libsystemd-bus/bus-message.c | 26 | ||||
-rw-r--r-- | src/libsystemd-bus/bus-message.h | 2 |
2 files changed, 14 insertions, 14 deletions
diff --git a/src/libsystemd-bus/bus-message.c b/src/libsystemd-bus/bus-message.c index 9092a66977..f09f0d682d 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); @@ -3916,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; @@ -3960,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--; @@ -4037,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) @@ -4065,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) @@ -4108,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; diff --git a/src/libsystemd-bus/bus-message.h b/src/libsystemd-bus/bus-message.h index 589c819c73..a973e9fd6c 100644 --- a/src/libsystemd-bus/bus-message.h +++ b/src/libsystemd-bus/bus-message.h @@ -48,6 +48,8 @@ struct bus_container { /* gvariant: list of offsets to end of children if this is struct/dict entry/array */ size_t *offsets, n_offsets, offsets_allocated, offset_index; size_t item_size; + + char *peeked_signature; }; struct bus_header { |