X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-message.c;h=ad417c0f100bc6d6f209d5018f109f3ec55d2df6;hb=77adde638217112c9e080035197a76f4dc4af700;hp=9fdf0d7e8117d842b6d98add0e893bf7bd676f76;hpb=d9fba533169b271d0e803016fea86fb57bc3f5ca;p=elogind.git diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c index 9fdf0d7e8..ad417c0f1 100644 --- a/src/libsystemd/sd-bus/bus-message.c +++ b/src/libsystemd/sd-bus/bus-message.c @@ -429,10 +429,10 @@ int bus_message_from_header( if (m->creds.pid > 0) m->creds.mask |= SD_BUS_CREDS_PID; - if (m->creds.uid != (uid_t) -1) + if (m->creds.uid != UID_INVALID) m->creds.mask |= SD_BUS_CREDS_UID; - if (m->creds.gid != (gid_t) -1) + if (m->creds.gid != GID_INVALID) m->creds.mask |= SD_BUS_CREDS_GID; } @@ -1126,7 +1126,7 @@ static int part_make_space( psz = PAGE_ALIGN(sz > 0 ? sz : 1); if (part->mapped <= 0) - n = mmap(NULL, psz, PROT_READ|PROT_WRITE, MAP_SHARED, part->memfd, 0); + n = mmap(NULL, psz, PROT_READ|PROT_WRITE, MAP_SHARED, part->memfd, part->memfd_offset); else n = mremap(part->data, part->mapped, psz, MREMAP_MAYMOVE); @@ -2063,6 +2063,7 @@ static int bus_message_close_variant(sd_bus_message *m, struct bus_container *c) assert(m); assert(c); + assert(c->signature); if (!BUS_MESSAGE_IS_GVARIANT(m)) return 0; @@ -2619,6 +2620,7 @@ _public_ int sd_bus_message_append_array_memfd(sd_bus_message *m, return -ENOMEM; part->memfd = copy_fd; + part->memfd_offset = 0; part->sealed = true; part->size = size; copy_fd = -1; @@ -2694,6 +2696,7 @@ _public_ int sd_bus_message_append_string_memfd(sd_bus_message *m, int memfd) { return -ENOMEM; part->memfd = copy_fd; + part->memfd_offset = 0; part->sealed = true; part->size = size; copy_fd = -1; @@ -2877,7 +2880,7 @@ int bus_body_part_map(struct bus_body_part *part) { psz = PAGE_ALIGN(part->size); if (part->memfd >= 0) - p = mmap(NULL, psz, PROT_READ, MAP_PRIVATE, part->memfd, 0); + p = mmap(NULL, psz, PROT_READ, MAP_PRIVATE, part->memfd, part->memfd_offset); else if (part->is_zero) p = mmap(NULL, psz, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); else @@ -5333,35 +5336,57 @@ _public_ int sd_bus_message_read_strv(sd_bus_message *m, char ***l) { return 1; } -const char* bus_message_get_arg(sd_bus_message *m, unsigned i) { - int r; - const char *t = NULL; +int bus_message_get_arg(sd_bus_message *m, unsigned i, const char **str, char ***strv) { + const char *contents; unsigned j; + char type; + int r; assert(m); + assert(str); + assert(strv); r = sd_bus_message_rewind(m, true); if (r < 0) - return NULL; + return r; - for (j = 0; j <= i; j++) { - char type; + for (j = 0;; j++) { + r = sd_bus_message_peek_type(m, &type, &contents); + if (r < 0) + return r; + if (r == 0) + return -ENXIO; + + /* Don't match against arguments after the first one we don't understand */ + if (!IN_SET(type, SD_BUS_TYPE_STRING, SD_BUS_TYPE_OBJECT_PATH, SD_BUS_TYPE_SIGNATURE) && + !(type == SD_BUS_TYPE_ARRAY && STR_IN_SET(contents, "s", "o", "g"))) + return -ENXIO; + + if (j >= i) + break; - r = sd_bus_message_peek_type(m, &type, NULL); + r = sd_bus_message_skip(m, NULL); if (r < 0) - return NULL; + return r; + } - if (type != SD_BUS_TYPE_STRING && - type != SD_BUS_TYPE_OBJECT_PATH && - type != SD_BUS_TYPE_SIGNATURE) - return NULL; + if (type == SD_BUS_TYPE_ARRAY) { - r = sd_bus_message_read_basic(m, type, &t); + r = sd_bus_message_read_strv(m, strv); if (r < 0) - return NULL; + return r; + + *str = NULL; + + } else { + r = sd_bus_message_read_basic(m, type, str); + if (r < 0) + return r; + + *strv = NULL; } - return t; + return 0; } bool bus_header_is_complete(struct bus_header *h, size_t size) {