X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-kernel.c;h=83379d1430408f6807f53a90edb28b5a38174a61;hp=b53c5eddcbb2ad49546589030f84446febbdeb8a;hb=f9be01f3b4784affa269694a4f5cdcb87f06f2f7;hpb=c320885c9f16f622a9b48f529386482c76daa86c diff --git a/src/libsystemd-bus/bus-kernel.c b/src/libsystemd-bus/bus-kernel.c index b53c5eddc..83379d143 100644 --- a/src/libsystemd-bus/bus-kernel.c +++ b/src/libsystemd-bus/bus-kernel.c @@ -83,7 +83,9 @@ static int bus_message_setup_kmsg(sd_bus_message *m) { assert(m); assert(m->sealed); - assert(!m->kdbus); + + if (m->kdbus) + return 0; if (m->destination) { r = parse_unique_name(m->destination, &unique); @@ -140,9 +142,11 @@ static int bus_message_setup_kmsg(sd_bus_message *m) { if (m->body) append_payload_vec(&d, m->body, m->header->body_size); - m->kdbus->size = (uint8_t*) m - (uint8_t*) m->kdbus; + m->kdbus->size = (uint8_t*) d - (uint8_t*) m->kdbus; assert(m->kdbus->size <= sz); + m->free_kdbus = true; + return 0; } @@ -220,6 +224,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k, sd_bus_mess _cleanup_free_ int *fds = NULL; struct bus_header *h = NULL; size_t total, n_bytes = 0, idx = 0; + struct kdbus_creds *creds = NULL; int r; assert(bus); @@ -258,7 +263,9 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k, sd_bus_mess fds = f; memcpy(fds + n_fds, d->fds, j); n_fds += j; - } + + } else if (d->type == KDBUS_MSG_SRC_CREDS) + creds = &d->creds; } if (!h) @@ -282,14 +289,14 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k, sd_bus_mess continue; l = d->size - offsetof(struct kdbus_msg_data, data); - if (idx == sizeof(struct bus_header) && l == BUS_MESSAGE_FIELDS_SIZE(m)) m->fields = d->data; else if (idx == sizeof(struct bus_header) + ALIGN8(BUS_MESSAGE_FIELDS_SIZE(m)) && l == BUS_MESSAGE_BODY_SIZE(m)) m->body = d->data; - else { + else if (!(idx == 0 && l == sizeof(struct bus_header)) && + !(idx == sizeof(struct bus_header) + BUS_MESSAGE_FIELDS_SIZE(m))) { sd_bus_message_unref(m); return -EBADMSG; } @@ -297,6 +304,14 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k, sd_bus_mess idx += l; } + if (creds) { + m->uid = creds->uid; + m->gid = creds->gid; + m->pid = creds->pid; + m->tid = creds->tid; + m->uid_valid = m->gid_valid = true; + } + r = bus_message_parse_fields(m); if (r < 0) { sd_bus_message_unref(m); @@ -339,7 +354,7 @@ int bus_kernel_read_message(sd_bus *bus, sd_bus_message **m) { if (errno == EAGAIN) return 0; - if (errno != -EMSGSIZE) + if (errno != ENOBUFS) return -errno; sz *= 2; @@ -378,7 +393,7 @@ int bus_kernel_create(const char *name, char **s) { if (!p) return -ENOMEM; - if (ioctl(fd, KDBUS_CMD_BUS_MAKE, &fname) < 0) { + if (ioctl(fd, KDBUS_CMD_BUS_MAKE, fname) < 0) { close_nointr_nofail(fd); free(p); return -errno;