From e86b80b834016d273196c5ec9687fddcddcf9381 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 12 Apr 2013 21:43:50 +0200 Subject: [PATCH 1/1] bus: don't calculate kmsg message too large --- src/libsystemd-bus/bus-internal.c | 1 - src/libsystemd-bus/bus-kernel.c | 8 ++++++-- src/shared/macro.h | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/libsystemd-bus/bus-internal.c b/src/libsystemd-bus/bus-internal.c index 317f6a8a9..df295539a 100644 --- a/src/libsystemd-bus/bus-internal.c +++ b/src/libsystemd-bus/bus-internal.c @@ -141,7 +141,6 @@ bool service_name_is_valid(const char *p) { return false; return true; - } bool member_name_is_valid(const char *p) { diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index dc6f5b998..878cd9c43 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -57,23 +57,27 @@ static void append_payload_vec(struct kdbus_msg_data **d, const void *p, size_t assert(p); assert(sz > 0); + *d = ALIGN8_PTR(*d); + (*d)->size = offsetof(struct kdbus_msg_data, vec) + sizeof(struct kdbus_vec); (*d)->type = KDBUS_MSG_PAYLOAD_VEC; (*d)->vec.address = (uint64_t) p; (*d)->vec.size = sz; - *d = (struct kdbus_msg_data*) ((uint8_t*) *d + ALIGN8((*d)->size)); + *d = (struct kdbus_msg_data*) ((uint8_t*) *d + (*d)->size); } static void append_destination(struct kdbus_msg_data **d, const char *s, size_t length) { assert(d); assert(d); + *d = ALIGN8_PTR(*d); + (*d)->size = offsetof(struct kdbus_msg_data, str) + length + 1; (*d)->type = KDBUS_MSG_DST_NAME; memcpy((*d)->str, s, length + 1); - *d = (struct kdbus_msg_data*) ((uint8_t*) *d + ALIGN8((*d)->size)); + *d = (struct kdbus_msg_data*) ((uint8_t*) *d + (*d)->size); } static int bus_message_setup_kmsg(sd_bus_message *m) { diff --git a/src/shared/macro.h b/src/shared/macro.h index 84a453a8f..99dc73385 100644 --- a/src/shared/macro.h +++ b/src/shared/macro.h @@ -65,6 +65,8 @@ #error "Wut? Pointers are neither 4 nor 8 bytes long?" #endif +#define ALIGN8_PTR(p) ((void*) ALIGN8((unsigned long) p)) + static inline size_t ALIGN_TO(size_t l, size_t ali) { return ((l + ali - 1) & ~(ali - 1)); } -- 2.30.2