X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-message.c;h=7eac069e980256c352108d9eb7419f5d1df7280d;hb=bcf88fc3f14867f1cabc911c27b661d738281df0;hp=447595764e23c952cbb85854b25b538d47b7e37f;hpb=2ac7c17f9d8eeb403b91ee5a389562edaf47fb87;p=elogind.git diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c index 447595764..7eac069e9 100644 --- a/src/libsystemd/sd-bus/bus-message.c +++ b/src/libsystemd/sd-bus/bus-message.c @@ -27,7 +27,6 @@ #include "utf8.h" #include "strv.h" #include "time-util.h" -#include "cgroup-util.h" #include "memfd-util.h" #include "sd-bus.h" @@ -413,6 +412,20 @@ static int message_append_field_uint64(sd_bus_message *m, uint64_t h, uint64_t x return 0; } +static int message_append_reply_cookie(sd_bus_message *m, uint64_t cookie) { + assert(m); + + if (BUS_MESSAGE_IS_GVARIANT(m)) + return message_append_field_uint64(m, BUS_MESSAGE_HEADER_REPLY_SERIAL, cookie); + else { + /* 64bit cookies are not supported on dbus1 */ + if (cookie > 0xffffffffUL) + return -ENOTSUP; + + return message_append_field_uint32(m, BUS_MESSAGE_HEADER_REPLY_SERIAL, (uint32_t) cookie); + } +} + int bus_message_from_header( sd_bus *bus, void *header, @@ -427,7 +440,7 @@ int bus_message_from_header( size_t extra, sd_bus_message **ret) { - sd_bus_message *m; + _cleanup_free_ sd_bus_message *m = NULL; struct bus_header *h; size_t a, label_sz; @@ -446,15 +459,13 @@ int bus_message_from_header( return -EBADMSG; h = header; - if (h->version != 1 && - h->version != 2) + if (!IN_SET(h->version, 1, 2)) return -EBADMSG; if (h->type == _SD_BUS_MESSAGE_TYPE_INVALID) return -EBADMSG; - if (h->endian != BUS_LITTLE_ENDIAN && - h->endian != BUS_BIG_ENDIAN) + if (!IN_SET(h->endian, BUS_LITTLE_ENDIAN, BUS_BIG_ENDIAN)) return -EBADMSG; /* Note that we are happy with unknown flags in the flags header! */ @@ -543,6 +554,7 @@ int bus_message_from_header( m->bus = sd_bus_ref(bus); *ret = m; + m = NULL; return 0; } @@ -620,6 +632,9 @@ static sd_bus_message *message_new(sd_bus *bus, uint8_t type) { m->root_container.need_offsets = BUS_MESSAGE_IS_GVARIANT(m); m->bus = sd_bus_ref(bus); + if (bus->allow_interactive_authorization) + m->header->flags |= BUS_MESSAGE_ALLOW_INTERACTIVE_AUTHORIZATION; + return m; } @@ -737,14 +752,7 @@ static int message_new_reply( if (t->reply_cookie == 0) return -ENOTSUP; - if (BUS_MESSAGE_IS_GVARIANT(t)) - r = message_append_field_uint64(t, BUS_MESSAGE_HEADER_REPLY_SERIAL, t->reply_cookie); - else { - if (t->reply_cookie > 0xffffffff) - return -ENOTSUP; - - r = message_append_field_uint32(t, BUS_MESSAGE_HEADER_REPLY_SERIAL, (uint32_t) t->reply_cookie); - } + r = message_append_reply_cookie(t, t->reply_cookie); if (r < 0) goto fail; @@ -898,7 +906,7 @@ int bus_message_new_synthetic_error( t->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED; t->reply_cookie = cookie; - r = message_append_field_uint32(t, BUS_MESSAGE_HEADER_REPLY_SERIAL, (uint32_t) t->reply_cookie); + r = message_append_reply_cookie(t, t->reply_cookie); if (r < 0) goto fail; @@ -5818,7 +5826,8 @@ int bus_message_remarshal(sd_bus *bus, sd_bus_message **m) { return -ENOMEM; n->reply_cookie = (*m)->reply_cookie; - r = message_append_field_uint32(n, BUS_MESSAGE_HEADER_REPLY_SERIAL, (uint32_t) n->reply_cookie); + + r = message_append_reply_cookie(n, n->reply_cookie); if (r < 0) return r;