chiark / gitweb /
bus: suppress creating empty parts in messages
authorLennart Poettering <lennart@poettering.net>
Tue, 10 Dec 2013 00:03:41 +0000 (01:03 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 10 Dec 2013 00:03:41 +0000 (01:03 +0100)
src/libsystemd-bus/bus-message.c

index 9b4da3d3d3be90690f971dceec5ff24ab610af69..811374422717ff0cdbab7b5c3d52ceea88b63f6c 100644 (file)
@@ -1131,9 +1131,7 @@ static void message_extend_containers(sd_bus_message *m, size_t expand) {
 }
 
 static void *message_extend_body(sd_bus_message *m, size_t align, size_t sz, bool add_offset) {
-        struct bus_body_part *part = NULL;
-        size_t start_body, end_body, padding, start_part, end_part, added;
-        bool add_new_part;
+        size_t start_body, end_body, padding, added;
         void *p;
         int r;
 
@@ -1156,54 +1154,61 @@ static void *message_extend_body(sd_bus_message *m, size_t align, size_t sz, boo
                 return NULL;
         }
 
-        add_new_part =
-                m->n_body_parts <= 0 ||
-                m->body_end->sealed ||
-                padding != ALIGN_TO(m->body_end->size, align) - m->body_end->size;
+        if (added > 0) {
+                struct bus_body_part *part = NULL;
+                bool add_new_part;
+
+                add_new_part =
+                        m->n_body_parts <= 0 ||
+                        m->body_end->sealed ||
+                        padding != ALIGN_TO(m->body_end->size, align) - m->body_end->size;
+
+                if (add_new_part) {
+                        if (padding > 0) {
+                                part = message_append_part(m);
+                                if (!part)
+                                        return NULL;
+
+                                part_zero(part, padding);
+                        }
 
-        if (add_new_part) {
-                if (padding > 0) {
                         part = message_append_part(m);
                         if (!part)
                                 return NULL;
 
-                        part_zero(part, padding);
-                }
+                        r = part_make_space(m, part, sz, &p);
+                        if (r < 0)
+                                return NULL;
+                } else {
+                        struct bus_container *c;
+                        void *op;
+                        size_t os, start_part, end_part;
 
-                part = message_append_part(m);
-                if (!part)
-                        return NULL;
+                        part = m->body_end;
+                        op = part->data;
+                        os = part->size;
 
-                r = part_make_space(m, part, sz, &p);
-                if (r < 0)
-                        return NULL;
-        } else {
-                struct bus_container *c;
-                void *op;
-                size_t os;
+                        start_part = ALIGN_TO(part->size, align);
+                        end_part = start_part + sz;
 
-                part = m->body_end;
-                op = part->data;
-                os = part->size;
+                        r = part_make_space(m, part, end_part, &p);
+                        if (r < 0)
+                                return NULL;
 
-                start_part = ALIGN_TO(part->size, align);
-                end_part = start_part + sz;
+                        if (padding > 0) {
+                                memset(p, 0, padding);
+                                p = (uint8_t*) p + padding;
+                        }
 
-                r = part_make_space(m, part, end_part, &p);
-                if (r < 0)
-                        return NULL;
+                        /* Readjust pointers */
+                        for (c = m->containers; c < m->containers + m->n_containers; c++)
+                                c->array_size = adjust_pointer(c->array_size, op, os, part->data);
 
-                if (padding > 0) {
-                        memset(p, 0, padding);
-                        p = (uint8_t*) p + padding;
+                        m->error.message = (const char*) adjust_pointer(m->error.message, op, os, part->data);
                 }
-
-                /* Readjust pointers */
-                for (c = m->containers; c < m->containers + m->n_containers; c++)
-                        c->array_size = adjust_pointer(c->array_size, op, os, part->data);
-
-                m->error.message = (const char*) adjust_pointer(m->error.message, op, os, part->data);
-        }
+        } else
+                /* Return something that is not NULL and is aligned */
+                p = (uint8_t *) NULL + align;
 
         m->header->body_size = end_body;
         message_extend_containers(m, added);