X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-kernel.c;h=c8340718988f25e67639bf99657e95cd7ab3a343;hb=a2243d548830d2aff6b768a0b47a0f0a513012a5;hp=27899c1989140d0ce193cdf14565739da9933596;hpb=1a2409e262da65a4b0ca8ab18fcf5eabd2d404ca;p=elogind.git diff --git a/src/libsystemd/sd-bus/bus-kernel.c b/src/libsystemd/sd-bus/bus-kernel.c index 27899c198..c83407189 100644 --- a/src/libsystemd/sd-bus/bus-kernel.c +++ b/src/libsystemd/sd-bus/bus-kernel.c @@ -751,10 +751,9 @@ int bus_kernel_take_fd(sd_bus *b) { } } - /* The higher 32bit of both flags fields are considered + /* The higher 32bit of the bus_flags fields are considered * 'incompatible flags'. Refuse them all for now. */ - if (hello->bus_flags > 0xFFFFFFFFULL || - hello->conn_flags > 0xFFFFFFFFULL) + if (hello->bus_flags > 0xFFFFFFFFULL) return -ENOTSUP; if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash)) @@ -821,6 +820,7 @@ static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) { int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call) { int r; + uint64_t flags; assert(bus); assert(m); @@ -843,7 +843,12 @@ int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call if (hint_sync_call) m->kdbus->flags |= KDBUS_MSG_FLAGS_EXPECT_REPLY|KDBUS_MSG_FLAGS_SYNC_REPLY; + /* The kernel will return the set of supported flags in m->kdbus->flags. + * Save the current message flags before issuing the ioctl, and restore them + * afterwards */ + flags = m->kdbus->flags; r = ioctl(bus->output_fd, KDBUS_CMD_MSG_SEND, m->kdbus); + m->kdbus->flags = flags; if (r < 0) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; sd_bus_message *reply; @@ -1230,8 +1235,11 @@ int kdbus_translate_attach_flags(uint64_t mask, uint64_t *kdbus_mask) { if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_PID|SD_BUS_CREDS_PID_STARTTIME|SD_BUS_CREDS_TID)) m |= KDBUS_ATTACH_CREDS; - if (mask & (SD_BUS_CREDS_COMM|SD_BUS_CREDS_TID_COMM)) - m |= KDBUS_ATTACH_COMM; + if (mask & SD_BUS_CREDS_COMM) + m |= KDBUS_ATTACH_PID_COMM; + + if (mask & SD_BUS_CREDS_TID_COMM) + m |= KDBUS_ATTACH_TID_COMM; if (mask & SD_BUS_CREDS_EXE) m |= KDBUS_ATTACH_EXE; @@ -1307,13 +1315,6 @@ int bus_kernel_create_bus(const char *name, bool world, char **s) { return -errno; } - /* The features field are considered 'incompatible flags'. - * Refuse them all for now. */ - if (make->features) { - safe_close(fd); - return -ENOTSUP; - } - if (s) { char *p; @@ -1444,13 +1445,6 @@ int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char * return -errno; } - /* The features field are considered 'incompatible flags'. - * Refuse them all for now. */ - if (make->features) { - safe_close(fd); - return -ENOTSUP; - } - if (ep_path) { char *p; @@ -1566,7 +1560,6 @@ int bus_kernel_make_starter( hello->size = size; hello->conn_flags = - KDBUS_HELLO_ACCEPT_MEMFD | (activating ? KDBUS_HELLO_ACTIVATOR : KDBUS_HELLO_POLICY_HOLDER) | (accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0); hello->pool_size = KDBUS_POOL_SIZE; @@ -1575,11 +1568,9 @@ int bus_kernel_make_starter( if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0) return -errno; - /* The higher 32bit of both flags fields are considered + /* The higher 32bit of the bus_flags fields are considered * 'incompatible flags'. Refuse them all for now. */ - if (hello->features || - hello->bus_flags > 0xFFFFFFFFULL || - hello->conn_flags > 0xFFFFFFFFULL) + if (hello->bus_flags > 0xFFFFFFFFULL) return -ENOTSUP; if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))