diff --git a/src/basic/strv.h b/src/basic/strv.h index dd3323c223..d7166ce5f3 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -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); diff --git a/src/core/namespace.c b/src/core/namespace.c index d4d6970af3..36bc95a2df 100644 --- a/src/core/namespace.c +++ b/src/core/namespace.c @@ -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); diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c index e18957e354..0af9cedf5a 100644 --- a/src/libsystemd/sd-bus/bus-message.c +++ b/src/libsystemd/sd-bus/bus-message.c @@ -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); } diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c index 12ade498a9..913d6eca8a 100644 --- a/src/libsystemd/sd-bus/bus-objects.c +++ b/src/libsystemd/sd-bus/bus-objects.c @@ -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; } diff --git a/src/shared/acpi-fpdt.c b/src/shared/acpi-fpdt.c index d565ebd43e..38c464c912 100644 --- a/src/shared/acpi-fpdt.c +++ b/src/shared/acpi-fpdt.c @@ -23,7 +23,7 @@ struct acpi_table_header { uint32_t oem_revision; char asl_compiler_id[4]; uint32_t asl_compiler_revision; -}; +} _packed_; enum { ACPI_FPDT_TYPE_BOOT = 0, @@ -36,12 +36,12 @@ struct acpi_fpdt_header { uint8_t revision; uint8_t reserved[4]; uint64_t ptr; -}; +} _packed_; struct acpi_fpdt_boot_header { char signature[4]; uint32_t length; -}; +} _packed_; enum { ACPI_FPDT_S3PERF_RESUME_REC = 0, @@ -59,7 +59,7 @@ struct acpi_fpdt_boot { uint64_t startup_start; uint64_t exit_services_entry; uint64_t exit_services_exit; -}; +} _packed; int acpi_get_boot_usec(usec_t *loader_start, usec_t *loader_exit) { _cleanup_free_ char *buf = NULL; diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 64e23f0734..d319d5d375 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -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;