]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-bus: make strict asan shut up
authorLennart Poettering <lennart@poettering.net>
Fri, 16 Nov 2018 12:00:40 +0000 (13:00 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 16 Nov 2018 13:32:41 +0000 (14:32 +0100)
asan doesn't like it if we use strndup() (i.e. a string function) on a
non-NULL terminated buffer (i.e. something that isn't really a string).

Let's hence use memdup_suffix0() instead of strndup(), which is more
appropriate for binary data that is to become a string.

Fixes: #10385
src/libsystemd/sd-bus/bus-message.c

index 697553e74edd36bde43feecb6503864dc35731de..bd3e1f34460cbf59baa8eced1092f053f6e13bb7 100644 (file)
@@ -4057,7 +4057,7 @@ _public_ int sd_bus_message_enter_container(sd_bus_message *m,
                 end = m->rindex + 0;
         else
                 end = m->rindex + c->item_size;
-        
+
         m->containers[m->n_containers++] = (struct bus_container) {
                  .enclosing = type,
                  .signature = TAKE_PTR(signature),
@@ -5078,6 +5078,7 @@ int bus_message_parse_fields(sd_bus_message *m) {
                                 return -EBADMSG;
 
                         if (*p == 0) {
+                                char *k;
                                 size_t l;
 
                                 /* We found the beginning of the signature
@@ -5091,9 +5092,11 @@ int bus_message_parse_fields(sd_bus_message *m) {
                                     p[1 + l - 1] != SD_BUS_TYPE_STRUCT_END)
                                         return -EBADMSG;
 
-                                if (free_and_strndup(&m->root_container.signature,
-                                                     p + 1 + 1, l - 2) < 0)
+                                k = memdup_suffix0(p + 1 + 1, l - 2);
+                                if (!k)
                                         return -ENOMEM;
+
+                                free_and_replace(m->root_container.signature, k);
                                 break;
                         }