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.
free(m->root_container.signature);
free(m->root_container.offsets);
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);
bus_creds_done(&m->creds);
free(m);
w = m->containers + m->n_containers++;
w->enclosing = type;
w->signature = signature;
w = m->containers + m->n_containers++;
w->enclosing = type;
w->signature = signature;
+ w->peeked_signature = NULL;
w->index = 0;
w->before = before;
w->index = 0;
w->before = before;
+ free(c->peeked_signature);
free(c->offsets);
m->n_containers--;
free(c->offsets);
m->n_containers--;
if (!sig)
return -ENOMEM;
if (!sig)
return -ENOMEM;
- free(m->peeked_signature);
- m->peeked_signature = sig;
-
- *contents = sig;
+ free(c->peeked_signature);
+ *contents = c->peeked_signature = sig;
if (!sig)
return -ENOMEM;
if (!sig)
return -ENOMEM;
- free(m->peeked_signature);
- m->peeked_signature = sig;
-
- *contents = sig;
+ free(c->peeked_signature);
+ *contents = c->peeked_signature = sig;
if (k > c->item_size)
return -EBADMSG;
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)
- if (!signature_is_valid(m->peeked_signature, true))
+ if (!signature_is_valid(c->peeked_signature, true))
- *contents = m->peeked_signature;
+ *contents = c->peeked_signature;
} else {
size_t rindex, l;
} else {
size_t rindex, l;
/* 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;
/* 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;