summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-12-23 22:32:33 +0100
committerLennart Poettering <lennart@poettering.net>2013-12-23 22:32:33 +0100
commit85feb8e4d9b0ef65c338e1a1a16665d0cb8d544a (patch)
treefc05cd9418f516072d45b75f103353e2e94a32db
parentd711a957780932a2705d9ae9a1fc1b6fa7200b75 (diff)
bus: don't attach KDBUS_ITEM_ID to match ioctl() if we don't need it
-rw-r--r--src/libsystemd-bus/bus-control.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/src/libsystemd-bus/bus-control.c b/src/libsystemd-bus/bus-control.c
index 942bc01788..1eed7b9e32 100644
--- a/src/libsystemd-bus/bus-control.c
+++ b/src/libsystemd-bus/bus-control.c
@@ -907,8 +907,7 @@ int bus_add_match_internal_kernel(
zero(bloom);
- sz = ALIGN8(offsetof(struct kdbus_cmd_match, items) +
- offsetof(struct kdbus_item, id) + sizeof(uint64_t));
+ sz = ALIGN8(offsetof(struct kdbus_cmd_match, items));
for (i = 0; i < n_components; i++) {
struct bus_match_component *c = &components[i];
@@ -922,8 +921,9 @@ int bus_add_match_internal_kernel(
r = bus_kernel_parse_unique_name(c->value_str, &src_id);
if (r < 0)
return r;
-
- if (r == 0) {
+ else if (r > 0)
+ sz += ALIGN8(offsetof(struct kdbus_item, id) + sizeof(uint64_t));
+ else {
sender = c->value_str;
sender_length = strlen(sender);
sz += ALIGN8(offsetof(struct kdbus_item, str) + sender_length + 1);
@@ -1026,19 +1026,22 @@ int bus_add_match_internal_kernel(
m->owner_id = id;
item = m->items;
- item->size = offsetof(struct kdbus_item, id) + sizeof(uint64_t);
- item->type = KDBUS_ITEM_ID;
- item->id = src_id;
- if (using_bloom) {
+ if (src_id != KDBUS_MATCH_ID_ANY) {
+ item->size = offsetof(struct kdbus_item, id) + sizeof(uint64_t);
+ item->type = KDBUS_ITEM_ID;
+ item->id = src_id;
item = KDBUS_ITEM_NEXT(item);
+ }
+
+ if (using_bloom) {
item->size = offsetof(struct kdbus_item, data64) + BLOOM_SIZE;
item->type = KDBUS_ITEM_BLOOM;
memcpy(item->data64, bloom, BLOOM_SIZE);
+ item = KDBUS_ITEM_NEXT(item);
}
if (sender) {
- item = KDBUS_ITEM_NEXT(item);
item->size = offsetof(struct kdbus_item, str) + sender_length + 1;
item->type = KDBUS_ITEM_NAME;
memcpy(item->str, sender, sender_length + 1);