]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-bus: work around ubsan warning
authorLennart Poettering <lennart@poettering.net>
Wed, 22 Apr 2020 17:32:09 +0000 (19:32 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 23 Apr 2020 06:54:30 +0000 (08:54 +0200)
ubsan complains that we add an offset to a NULL ptr here in some cases.
Which isn't really a bug though, since we only use it as the end
condition for a for loop, but we can still fix it...

Fixes: #15522
src/basic/strv.h
src/core/namespace.c
src/libsystemd/sd-bus/bus-message.c
src/libsystemd/sd-bus/bus-objects.c
src/systemctl/systemctl.c

index dd3323c2235ab2fc64240a213effc5360cc628f6..d7166ce5f3a87a6ad0d81de3162c446b79db6164 100644 (file)
@@ -111,7 +111,7 @@ bool strv_overlap(char * const *a, char * const *b) _pure_;
              (s)--)
 
 #define STRV_FOREACH_PAIR(x, y, l)               \
-        for ((x) = (l), (y) = (x+1); (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
+        for ((x) = (l), (y) = (x) ? (x+1) : NULL; (x) && *(x) && *(y); (x) += 2, (y) = (x + 1))
 
 char **strv_sort(char **l);
 void strv_print(char * const *l);
index d4d6970af37b3a779185183754f7a73f19b02f34..36bc95a2df6f13b5af9c0e9f5ae69b6863bc5a3a 100644 (file)
@@ -1624,8 +1624,9 @@ int setup_namespace(
         r = 0;
 
 finish:
-        for (m = mounts; m < mounts + n_mounts; m++)
-                mount_entry_done(m);
+        if (n_mounts > 0)
+                for (m = mounts; m < mounts + n_mounts; m++)
+                        mount_entry_done(m);
 
         free(mounts);
 
index e18957e3545afaffde4ef6a15d390011923388c6..0af9cedf5a14183be46ece70794305f33cf0c34e 100644 (file)
@@ -1298,19 +1298,18 @@ static int message_add_offset(sd_bus_message *m, size_t offset) {
 }
 
 static void message_extend_containers(sd_bus_message *m, size_t expand) {
-        struct bus_container *c;
-
         assert(m);
 
         if (expand <= 0)
                 return;
 
-        /* Update counters */
-        for (c = m->containers; c < m->containers + m->n_containers; c++) {
+        if (m->n_containers <= 0)
+                return;
 
+        /* Update counters */
+        for (struct bus_container *c = m->containers; c < m->containers + m->n_containers; c++)
                 if (c->array_size)
                         *c->array_size += expand;
-        }
 }
 
 static void *message_extend_body(
@@ -1373,7 +1372,6 @@ static void *message_extend_body(
                         if (r < 0)
                                 return NULL;
                 } else {
-                        struct bus_container *c;
                         void *op;
                         size_t os, start_part, end_part;
 
@@ -1394,8 +1392,9 @@ static void *message_extend_body(
                         }
 
                         /* 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 (m->n_containers > 0)
+                                for (struct bus_container *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);
                 }
index 12ade498a97aa630bfc794c2b0a4f6654cd1729a..913d6eca8a9c3705390398526d6bb97070fd8fc1 100644 (file)
@@ -56,12 +56,18 @@ static int node_vtable_get_userdata(
 static void *vtable_method_convert_userdata(const sd_bus_vtable *p, void *u) {
         assert(p);
 
+        if (!u)
+                return SIZE_TO_PTR(p->x.method.offset); /* don't add offset on NULL, to make ubsan happy */
+
         return (uint8_t*) u + p->x.method.offset;
 }
 
 static void *vtable_property_convert_userdata(const sd_bus_vtable *p, void *u) {
         assert(p);
 
+        if (!u)
+                return SIZE_TO_PTR(p->x.property.offset); /* as above */
+
         return (uint8_t*) u + p->x.property.offset;
 }
 
index 64e23f0734e0b12dc2be855dcb6a691dfaba67ed..d319d5d375488b3aa510aa6aeb8b721c635fada5 100644 (file)
@@ -410,7 +410,7 @@ static int output_units_list(const UnitInfo *unit_infos, unsigned c) {
         if (arg_full)
                 table_set_width(table, 0);
 
-        for (u = unit_infos; u < unit_infos + c; u++) {
+        for (u = unit_infos; unit_infos && u < unit_infos + c; u++) {
                 _cleanup_free_ char *j = NULL;
                 const char *on_underline = "", *on_loaded = "", *on_active = "";
                 const char *on_circle = "", *id;