summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-12-16 20:00:25 +0100
committerLennart Poettering <lennart@poettering.net>2013-12-16 20:34:46 +0100
commit306f07be2fe2b4ccf6c9575ef8c980661df2aba8 (patch)
tree3f9484cd17366d8f113e3ee86e700355e4e84553
parent531dca789ea6b4c269ca2646515b42962f83d64a (diff)
bus: let's use GREEDY_REALLOC() when allocating space for containers
-rw-r--r--src/libsystemd-bus/bus-message.c19
-rw-r--r--src/libsystemd-bus/bus-message.h3
2 files changed, 9 insertions, 13 deletions
diff --git a/src/libsystemd-bus/bus-message.c b/src/libsystemd-bus/bus-message.c
index 8d449c5478..3f70f6f30e 100644
--- a/src/libsystemd-bus/bus-message.c
+++ b/src/libsystemd-bus/bus-message.c
@@ -113,7 +113,7 @@ static void message_reset_containers(sd_bus_message *m) {
free(m->containers);
m->containers = NULL;
- m->n_containers = 0;
+ m->n_containers = m->containers_allocated = 0;
m->root_container.index = 0;
}
@@ -1109,7 +1109,7 @@ static int message_add_offset(sd_bus_message *m, size_t offset) {
if (!c->need_offsets)
return 0;
- if (!GREEDY_REALLOC(c->offsets, c->n_offsets_allocated, c->n_offsets + 1))
+ if (!GREEDY_REALLOC(c->offsets, c->offsets_allocated, c->n_offsets + 1))
return -ENOMEM;
c->offsets[c->n_offsets++] = offset;
@@ -1843,14 +1843,11 @@ _public_ int sd_bus_message_open_container(
assert_return(!m->poisoned, -ESTALE);
/* Make sure we have space for one more container */
- w = realloc(m->containers, sizeof(struct bus_container) * (m->n_containers + 1));
- if (!w) {
+ if (!GREEDY_REALLOC(m->containers, m->containers_allocated, m->n_containers + 1)) {
m->poisoned = true;
return -ENOMEM;
}
- m->containers = w;
-
c = message_get_container(m);
signature = strdup(contents);
@@ -1881,14 +1878,14 @@ _public_ int sd_bus_message_open_container(
}
/* OK, let's fill it in */
- w += m->n_containers++;
+ w = m->containers + m->n_containers++;
w->enclosing = type;
w->signature = signature;
w->index = 0;
w->array_size = array_size;
w->before = before;
w->begin = begin;
- w->n_offsets = w->n_offsets_allocated = 0;
+ w->n_offsets = w->offsets_allocated = 0;
w->offsets = NULL;
w->need_offsets = need_offsets;
@@ -3854,10 +3851,8 @@ _public_ int sd_bus_message_enter_container(sd_bus_message *m,
if (m->n_containers >= BUS_CONTAINER_DEPTH)
return -EBADMSG;
- w = realloc(m->containers, sizeof(struct bus_container) * (m->n_containers + 1));
- if (!w)
+ if (!GREEDY_REALLOC(m->containers, m->containers_allocated, m->n_containers + 1))
return -ENOMEM;
- m->containers = w;
if (message_end_of_signature(m))
return -ENXIO;
@@ -3892,7 +3887,7 @@ _public_ int sd_bus_message_enter_container(sd_bus_message *m,
}
/* OK, let's fill it in */
- w += m->n_containers++;
+ w = m->containers + m->n_containers++;
w->enclosing = type;
w->signature = signature;
w->index = 0;
diff --git a/src/libsystemd-bus/bus-message.h b/src/libsystemd-bus/bus-message.h
index b9cd4c8f30..9ef92cf289 100644
--- a/src/libsystemd-bus/bus-message.h
+++ b/src/libsystemd-bus/bus-message.h
@@ -46,7 +46,7 @@ struct bus_container {
uint32_t *array_size;
/* gvariant: list of offsets to end of children if this is struct/dict entry/array */
- size_t *offsets, n_offsets, n_offsets_allocated, offset_index;
+ size_t *offsets, n_offsets, offsets_allocated, offset_index;
size_t item_size;
};
@@ -115,6 +115,7 @@ struct sd_bus_message {
struct bus_container root_container, *containers;
unsigned n_containers;
+ size_t containers_allocated;
struct iovec *iovec;
struct iovec iovec_fixed[2];