bus-kernel: reword assignment of dst_id in bus_message_setup_kmsg

Setting of dst_id was based on interplay of two booleans,
making the logic hard to follow (for humans and compilers alike).
gcc was confused and emmitted a warning about an uninitialized
variable. Rework the code to make it obvious that dst_id is
set properly.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2016-01-11 12:42:42 -05:00
parent 5abcee286e
commit 066ab03acc

View file

@ -270,8 +270,8 @@ static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
struct bus_body_part *part;
struct kdbus_item *d;
const char *destination;
bool well_known;
uint64_t unique;
bool well_known = false;
uint64_t dst_id;
size_t sz, dl;
unsigned i;
int r;
@ -288,13 +288,21 @@ static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
destination = m->destination ?: m->destination_ptr;
if (destination) {
r = bus_kernel_parse_unique_name(destination, &unique);
r = bus_kernel_parse_unique_name(destination, &dst_id);
if (r < 0)
return r;
if (r == 0) {
well_known = true;
well_known = r == 0;
/* verify_destination_id will usually be 0, which makes the kernel
* driver only look at the provided well-known name. Otherwise,
* the kernel will make sure the provided destination id matches
* the owner of the provided well-known-name, and fail if they
* differ. Currently, this is only needed for bus-proxyd. */
dst_id = m->verify_destination_id;
}
} else
well_known = false;
dst_id = KDBUS_DST_ID_BROADCAST;
sz = offsetof(struct kdbus_msg, items);
@ -332,15 +340,7 @@ static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
((m->header->flags & BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_NO_AUTO_START : 0) |
((m->header->type == SD_BUS_MESSAGE_SIGNAL) ? KDBUS_MSG_SIGNAL : 0);
if (well_known)
/* verify_destination_id will usually be 0, which makes the kernel driver only look
* at the provided well-known name. Otherwise, the kernel will make sure the provided
* destination id matches the owner of the provided weel-known-name, and fail if they
* differ. Currently, this is only needed for bus-proxyd. */
m->kdbus->dst_id = m->verify_destination_id;
else
m->kdbus->dst_id = destination ? unique : KDBUS_DST_ID_BROADCAST;
m->kdbus->dst_id = dst_id;
m->kdbus->payload_type = KDBUS_PAYLOAD_DBUS;
m->kdbus->cookie = m->header->dbus2.cookie;
m->kdbus->priority = m->priority;