X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fbus-control.c;h=fa321d5315c79d6aa57aba84c860dbfc0fdd876c;hb=659b937e670a5cb423a274b97b1eb60abd7d218f;hp=d9a53c702f2ecbda8bfcdcb5e7475deb3081b66d;hpb=581fe6c8176c6ea4ad998566df0746bf7b56456f;p=elogind.git diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c index d9a53c702..fa321d531 100644 --- a/src/libsystemd/sd-bus/bus-control.c +++ b/src/libsystemd/sd-bus/bus-control.c @@ -169,7 +169,7 @@ static int bus_release_name_kernel(sd_bus *bus, const char *name) { if (r < 0) return -errno; - return n->flags; + return 0; } static int bus_release_name_dbus1(sd_bus *bus, const char *name) { @@ -223,6 +223,23 @@ _public_ int sd_bus_release_name(sd_bus *bus, const char *name) { return bus_release_name_dbus1(bus, name); } +static int kernel_cmd_free(sd_bus *bus, uint64_t offset) +{ + struct kdbus_cmd_free cmd; + int r; + + assert(bus); + + cmd.flags = 0; + cmd.offset = offset; + + r = ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd); + if (r < 0) + return -errno; + + return 0; +} + static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { struct kdbus_cmd_name_list cmd = {}; struct kdbus_name_list *name_list; @@ -248,12 +265,14 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { if ((flags & KDBUS_NAME_LIST_UNIQUE) && name->owner_id != previous_id) { char *n; - if (asprintf(&n, ":1.%llu", (unsigned long long) name->owner_id) < 0) - return -ENOMEM; + if (asprintf(&n, ":1.%llu", (unsigned long long) name->owner_id) < 0) { + r = -ENOMEM; + goto fail; + } r = strv_consume(x, n); if (r < 0) - return r; + goto fail; previous_id = name->owner_id; } @@ -264,16 +283,18 @@ static int kernel_get_list(sd_bus *bus, uint64_t flags, char ***x) { if (entry_name && service_name_is_valid(entry_name)) { r = strv_extend(x, entry_name); - if (r < 0) - return -ENOMEM; + if (r < 0) { + r = -ENOMEM; + goto fail; + } } } - r = ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd.offset); - if (r < 0) - return -errno; + r = 0; - return 0; +fail: + kernel_cmd_free(bus, cmd.offset); + return r; } static int bus_list_names_kernel(sd_bus *bus, char ***acquired, char ***activatable) { @@ -381,7 +402,7 @@ static int bus_get_owner_kdbus( struct kdbus_cmd_conn_info *cmd; struct kdbus_conn_info *conn_info; struct kdbus_item *item; - size_t size; + size_t size, l; uint64_t m, id; int r; @@ -393,13 +414,12 @@ static int bus_get_owner_kdbus( cmd = alloca0_align(size, 8); cmd->id = id; } else { - size_t item_size = KDBUS_ITEM_HEADER_SIZE + strlen(name) + 1; - - size = offsetof(struct kdbus_cmd_conn_info, items) + item_size; + l = strlen(name) + 1; + size = offsetof(struct kdbus_cmd_conn_info, items) + KDBUS_ITEM_SIZE(l); cmd = alloca0_align(size, 8); - cmd->items[0].size = item_size; + cmd->items[0].size = KDBUS_ITEM_HEADER_SIZE + l; cmd->items[0].type = KDBUS_ITEM_NAME; - strcpy(cmd->items[0].str, name); + memcpy(cmd->items[0].str, name, l); } cmd->size = size; @@ -412,16 +432,25 @@ static int bus_get_owner_kdbus( conn_info = (struct kdbus_conn_info *) ((uint8_t *) bus->kdbus_buffer + cmd->offset); /* Non-activated names are considered not available */ - if (conn_info->flags & KDBUS_HELLO_ACTIVATOR) - return name[0] == ':' ? -ENXIO : -ESRCH; + if (conn_info->flags & KDBUS_HELLO_ACTIVATOR) { + if (name[0] == ':') + r = -ENXIO; + else + r = -ESRCH; + goto fail; + } c = bus_creds_new(); - if (!c) - return -ENOMEM; + if (!c) { + r = -ENOMEM; + goto fail; + } if (mask & SD_BUS_CREDS_UNIQUE_NAME) { - if (asprintf(&c->unique_name, ":1.%llu", (unsigned long long) conn_info->id) < 0) - return -ENOMEM; + if (asprintf(&c->unique_name, ":1.%llu", (unsigned long long) conn_info->id) < 0) { + r = -ENOMEM; + goto fail; + } c->mask |= SD_BUS_CREDS_UNIQUE_NAME; } @@ -597,7 +626,7 @@ static int bus_get_owner_kdbus( r = 0; fail: - ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd->offset); + kernel_cmd_free(bus, cmd->offset); return r; }