chiark / gitweb /
sd-bus: ignore BLOOM_FILTER kdbus items
[elogind.git] / src / libelogind / sd-bus / bus-kernel.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2013 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #ifdef HAVE_VALGRIND_MEMCHECK_H
23 #include <valgrind/memcheck.h>
24 #endif
25
26 #include <fcntl.h>
27 #include <malloc.h>
28 #include <sys/mman.h>
29 #include <sys/prctl.h>
30
31 /* When we include libgen.h because we need dirname() we immediately
32  * undefine basename() since libgen.h defines it as a macro to the POSIX
33  * version which is really broken. We prefer GNU basename(). */
34 #include <libgen.h>
35 #undef basename
36
37 #include "util.h"
38 #include "strv.h"
39 #include "memfd-util.h"
40 #include "capability.h"
41 #include "fileio.h"
42 #include "formats-util.h"
43
44 #include "bus-internal.h"
45 #include "bus-message.h"
46 #include "bus-kernel.h"
47 #include "bus-bloom.h"
48 #include "bus-util.h"
49 #include "bus-label.h"
50
51 #define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
52
53 int bus_kernel_parse_unique_name(const char *s, uint64_t *id) {
54         int r;
55
56         assert(s);
57         assert(id);
58
59         if (!startswith(s, ":1."))
60                 return 0;
61
62         r = safe_atou64(s + 3, id);
63         if (r < 0)
64                 return r;
65
66         return 1;
67 }
68
69 static void append_payload_vec(struct kdbus_item **d, const void *p, size_t sz) {
70         assert(d);
71         assert(sz > 0);
72
73         *d = ALIGN8_PTR(*d);
74
75         /* Note that p can be NULL, which encodes a region full of
76          * zeroes, which is useful to optimize certain padding
77          * conditions */
78
79         (*d)->size = offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec);
80         (*d)->type = KDBUS_ITEM_PAYLOAD_VEC;
81         (*d)->vec.address = PTR_TO_UINT64(p);
82         (*d)->vec.size = sz;
83
84         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
85 }
86
87 static void append_payload_memfd(struct kdbus_item **d, int memfd, size_t start, size_t sz) {
88         assert(d);
89         assert(memfd >= 0);
90         assert(sz > 0);
91
92         *d = ALIGN8_PTR(*d);
93         (*d)->size = offsetof(struct kdbus_item, memfd) + sizeof(struct kdbus_memfd);
94         (*d)->type = KDBUS_ITEM_PAYLOAD_MEMFD;
95         (*d)->memfd.fd = memfd;
96         (*d)->memfd.start = start;
97         (*d)->memfd.size = sz;
98
99         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
100 }
101
102 static void append_destination(struct kdbus_item **d, const char *s, size_t length) {
103         assert(d);
104         assert(s);
105
106         *d = ALIGN8_PTR(*d);
107
108         (*d)->size = offsetof(struct kdbus_item, str) + length + 1;
109         (*d)->type = KDBUS_ITEM_DST_NAME;
110         memcpy((*d)->str, s, length + 1);
111
112         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
113 }
114
115 static struct kdbus_bloom_filter *append_bloom(struct kdbus_item **d, size_t length) {
116         struct kdbus_item *i;
117
118         assert(d);
119
120         i = ALIGN8_PTR(*d);
121
122         i->size = offsetof(struct kdbus_item, bloom_filter) +
123                   offsetof(struct kdbus_bloom_filter, data) +
124                   length;
125         i->type = KDBUS_ITEM_BLOOM_FILTER;
126
127         *d = (struct kdbus_item *) ((uint8_t*) i + i->size);
128
129         return &i->bloom_filter;
130 }
131
132 static void append_fds(struct kdbus_item **d, const int fds[], unsigned n_fds) {
133         assert(d);
134         assert(fds);
135         assert(n_fds > 0);
136
137         *d = ALIGN8_PTR(*d);
138         (*d)->size = offsetof(struct kdbus_item, fds) + sizeof(int) * n_fds;
139         (*d)->type = KDBUS_ITEM_FDS;
140         memcpy((*d)->fds, fds, sizeof(int) * n_fds);
141
142         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
143 }
144
145 static void add_bloom_arg(void *data, size_t size, unsigned n_hash, unsigned i, const char *t) {
146         char buf[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")];
147         char *e;
148
149         assert(data);
150         assert(size > 0);
151         assert(i < 64);
152         assert(t);
153
154         e = stpcpy(buf, "arg");
155         if (i < 10)
156                 *(e++) = '0' + (char) i;
157         else {
158                 *(e++) = '0' + (char) (i / 10);
159                 *(e++) = '0' + (char) (i % 10);
160         }
161
162         *e = 0;
163         bloom_add_pair(data, size, n_hash, buf, t);
164
165         strcpy(e, "-dot-prefix");
166         bloom_add_prefixes(data, size, n_hash, buf, t, '.');
167         strcpy(e, "-slash-prefix");
168         bloom_add_prefixes(data, size, n_hash, buf, t, '/');
169 }
170
171 static int bus_message_setup_bloom(sd_bus_message *m, struct kdbus_bloom_filter *bloom) {
172         void *data;
173         unsigned i;
174         int r;
175
176         assert(m);
177         assert(bloom);
178
179         data = bloom->data;
180         memzero(data, m->bus->bloom_size);
181         bloom->generation = 0;
182
183         bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "message-type", bus_message_type_to_string(m->header->type));
184
185         if (m->interface)
186                 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "interface", m->interface);
187         if (m->member)
188                 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "member", m->member);
189         if (m->path) {
190                 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "path", m->path);
191                 bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, "path-slash-prefix", m->path);
192                 bloom_add_prefixes(data, m->bus->bloom_size, m->bus->bloom_n_hash, "path-slash-prefix", m->path, '/');
193         }
194
195         r = sd_bus_message_rewind(m, true);
196         if (r < 0)
197                 return r;
198
199         for (i = 0; i < 64; i++) {
200                 const char *t, *contents;
201                 char type;
202
203                 r = sd_bus_message_peek_type(m, &type, &contents);
204                 if (r < 0)
205                         return r;
206
207                 if (IN_SET(type, SD_BUS_TYPE_STRING, SD_BUS_TYPE_OBJECT_PATH, SD_BUS_TYPE_SIGNATURE)) {
208
209                         /* The bloom filter includes simple strings of any kind */
210                         r = sd_bus_message_read_basic(m, type, &t);
211                         if (r < 0)
212                                 return r;
213
214                         add_bloom_arg(data, m->bus->bloom_size, m->bus->bloom_n_hash, i, t);
215                 } if (type == SD_BUS_TYPE_ARRAY && STR_IN_SET(contents, "s", "o", "g")) {
216
217                         /* As well as array of simple strings of any kinds */
218                         r = sd_bus_message_enter_container(m, type, contents);
219                         if (r < 0)
220                                 return r;
221
222                         while ((r = sd_bus_message_read_basic(m, contents[0], &t)) > 0)
223                                 add_bloom_arg(data, m->bus->bloom_size, m->bus->bloom_n_hash, i, t);
224                         if (r < 0)
225                                 return r;
226
227                         r = sd_bus_message_exit_container(m);
228                         if (r < 0)
229                                 return r;
230
231                 } else
232                         /* Stop adding to bloom filter as soon as we
233                          * run into the first argument we cannot add
234                          * to it. */
235                         break;
236         }
237
238         return 0;
239 }
240
241 static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
242         struct bus_body_part *part;
243         struct kdbus_item *d;
244         const char *destination;
245         bool well_known;
246         uint64_t unique;
247         size_t sz, dl;
248         unsigned i;
249         int r;
250
251         assert(b);
252         assert(m);
253         assert(m->sealed);
254
255         /* We put this together only once, if this message is reused
256          * we reuse the earlier-built version */
257         if (m->kdbus)
258                 return 0;
259
260         destination = m->destination ?: m->destination_ptr;
261
262         if (destination) {
263                 r = bus_kernel_parse_unique_name(destination, &unique);
264                 if (r < 0)
265                         return r;
266
267                 well_known = r == 0;
268         } else
269                 well_known = false;
270
271         sz = offsetof(struct kdbus_msg, items);
272
273         /* Add in fixed header, fields header and payload */
274         sz += (1 + m->n_body_parts) * ALIGN8(offsetof(struct kdbus_item, vec) +
275                                              MAX(sizeof(struct kdbus_vec),
276                                                  sizeof(struct kdbus_memfd)));
277
278         /* Add space for bloom filter */
279         sz += ALIGN8(offsetof(struct kdbus_item, bloom_filter) +
280                      offsetof(struct kdbus_bloom_filter, data) +
281                      m->bus->bloom_size);
282
283         /* Add in well-known destination header */
284         if (well_known) {
285                 dl = strlen(destination);
286                 sz += ALIGN8(offsetof(struct kdbus_item, str) + dl + 1);
287         }
288
289         /* Add space for unix fds */
290         if (m->n_fds > 0)
291                 sz += ALIGN8(offsetof(struct kdbus_item, fds) + sizeof(int)*m->n_fds);
292
293         m->kdbus = memalign(8, sz);
294         if (!m->kdbus) {
295                 r = -ENOMEM;
296                 goto fail;
297         }
298
299         m->free_kdbus = true;
300         memzero(m->kdbus, sz);
301
302         m->kdbus->flags =
303                 ((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) ? 0 : KDBUS_MSG_EXPECT_REPLY) |
304                 ((m->header->flags & BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_NO_AUTO_START : 0) |
305                 ((m->header->type == SD_BUS_MESSAGE_SIGNAL) ? KDBUS_MSG_SIGNAL : 0);
306
307         if (well_known)
308                 /* verify_destination_id will usually be 0, which makes the kernel driver only look
309                  * at the provided well-known name. Otherwise, the kernel will make sure the provided
310                  * destination id matches the owner of the provided weel-known-name, and fail if they
311                  * differ. Currently, this is only needed for bus-proxyd. */
312                 m->kdbus->dst_id = m->verify_destination_id;
313         else
314                 m->kdbus->dst_id = destination ? unique : KDBUS_DST_ID_BROADCAST;
315
316         m->kdbus->payload_type = KDBUS_PAYLOAD_DBUS;
317         m->kdbus->cookie = m->header->dbus2.cookie;
318         m->kdbus->priority = m->priority;
319
320         if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
321                 m->kdbus->cookie_reply = m->reply_cookie;
322         else {
323                 struct timespec now;
324
325                 assert_se(clock_gettime(CLOCK_MONOTONIC_COARSE, &now) == 0);
326                 m->kdbus->timeout_ns = now.tv_sec * NSEC_PER_SEC + now.tv_nsec +
327                                        m->timeout * NSEC_PER_USEC;
328         }
329
330         d = m->kdbus->items;
331
332         if (well_known)
333                 append_destination(&d, destination, dl);
334
335         append_payload_vec(&d, m->header, BUS_MESSAGE_BODY_BEGIN(m));
336
337         MESSAGE_FOREACH_PART(part, i, m) {
338                 if (part->is_zero) {
339                         /* If this is padding then simply send a
340                          * vector with a NULL data pointer which the
341                          * kernel will just pass through. This is the
342                          * most efficient way to encode zeroes */
343
344                         append_payload_vec(&d, NULL, part->size);
345                         continue;
346                 }
347
348                 if (part->memfd >= 0 && part->sealed && destination) {
349                         /* Try to send a memfd, if the part is
350                          * sealed and this is not a broadcast. Since we can only  */
351
352                         append_payload_memfd(&d, part->memfd, part->memfd_offset, part->size);
353                         continue;
354                 }
355
356                 /* Otherwise, let's send a vector to the actual data.
357                  * For that, we need to map it first. */
358                 r = bus_body_part_map(part);
359                 if (r < 0)
360                         goto fail;
361
362                 append_payload_vec(&d, part->data, part->size);
363         }
364
365         if (m->header->type == SD_BUS_MESSAGE_SIGNAL) {
366                 struct kdbus_bloom_filter *bloom;
367
368                 bloom = append_bloom(&d, m->bus->bloom_size);
369                 r = bus_message_setup_bloom(m, bloom);
370                 if (r < 0)
371                         goto fail;
372         }
373
374         if (m->n_fds > 0)
375                 append_fds(&d, m->fds, m->n_fds);
376
377         m->kdbus->size = (uint8_t*) d - (uint8_t*) m->kdbus;
378         assert(m->kdbus->size <= sz);
379
380         return 0;
381
382 fail:
383         m->poisoned = true;
384         return r;
385 }
386
387 static void unset_memfds(struct sd_bus_message *m) {
388         struct bus_body_part *part;
389         unsigned i;
390
391         assert(m);
392
393         /* Make sure the memfds are not freed twice */
394         MESSAGE_FOREACH_PART(part, i, m)
395                 if (part->memfd >= 0)
396                         part->memfd = -1;
397 }
398
399 static void message_set_timestamp(sd_bus *bus, sd_bus_message *m, const struct kdbus_timestamp *ts) {
400         assert(bus);
401         assert(m);
402
403         if (!ts)
404                 return;
405
406         if (!(bus->attach_flags & KDBUS_ATTACH_TIMESTAMP))
407                 return;
408
409         m->realtime = ts->realtime_ns / NSEC_PER_USEC;
410         m->monotonic = ts->monotonic_ns / NSEC_PER_USEC;
411         m->seqnum = ts->seqnum;
412 }
413
414 static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
415         sd_bus_message *m = NULL;
416         struct kdbus_item *d;
417         unsigned n_fds = 0;
418         _cleanup_free_ int *fds = NULL;
419         struct bus_header *header = NULL;
420         void *footer = NULL;
421         size_t header_size = 0, footer_size = 0;
422         size_t n_bytes = 0, idx = 0;
423         const char *destination = NULL, *seclabel = NULL;
424         bool last_was_memfd = false;
425         int r;
426
427         assert(bus);
428         assert(k);
429         assert(k->payload_type == KDBUS_PAYLOAD_DBUS);
430
431         KDBUS_ITEM_FOREACH(d, k, items) {
432                 size_t l;
433
434                 l = d->size - offsetof(struct kdbus_item, data);
435
436                 switch (d->type) {
437
438                 case KDBUS_ITEM_PAYLOAD_OFF:
439                         if (!header) {
440                                 header = (struct bus_header*)((uint8_t*) k + d->vec.offset);
441                                 header_size = d->vec.size;
442                         }
443
444                         footer = (uint8_t*) k + d->vec.offset;
445                         footer_size = d->vec.size;
446
447                         n_bytes += d->vec.size;
448                         last_was_memfd = false;
449                         break;
450
451                 case KDBUS_ITEM_PAYLOAD_MEMFD:
452                         if (!header) /* memfd cannot be first part */
453                                 return -EBADMSG;
454
455                         n_bytes += d->memfd.size;
456                         last_was_memfd = true;
457                         break;
458
459                 case KDBUS_ITEM_FDS: {
460                         int *f;
461                         unsigned j;
462
463                         j = l / sizeof(int);
464                         f = realloc(fds, sizeof(int) * (n_fds + j));
465                         if (!f)
466                                 return -ENOMEM;
467
468                         fds = f;
469                         memcpy(fds + n_fds, d->fds, sizeof(int) * j);
470                         n_fds += j;
471                         break;
472                 }
473
474                 case KDBUS_ITEM_SECLABEL:
475                         seclabel = d->str;
476                         break;
477                 }
478         }
479
480         if (last_was_memfd) /* memfd cannot be last part */
481                 return -EBADMSG;
482
483         if (!header)
484                 return -EBADMSG;
485
486         if (header_size < sizeof(struct bus_header))
487                 return -EBADMSG;
488
489         /* on kdbus we only speak native endian gvariant, never dbus1
490          * marshalling or reverse endian */
491         if (header->version != 2 ||
492             header->endian != BUS_NATIVE_ENDIAN)
493                 return -EPROTOTYPE;
494
495         r = bus_message_from_header(
496                         bus,
497                         header, header_size,
498                         footer, footer_size,
499                         n_bytes,
500                         fds, n_fds,
501                         seclabel, 0, &m);
502         if (r < 0)
503                 return r;
504
505         /* The well-known names list is different from the other
506         credentials. If we asked for it, but nothing is there, this
507         means that the list of well-known names is simply empty, not
508         that we lack any data */
509
510         m->creds.mask |= (SD_BUS_CREDS_UNIQUE_NAME|SD_BUS_CREDS_WELL_KNOWN_NAMES) & bus->creds_mask;
511
512         KDBUS_ITEM_FOREACH(d, k, items) {
513                 size_t l;
514
515                 l = d->size - offsetof(struct kdbus_item, data);
516
517                 switch (d->type) {
518
519                 case KDBUS_ITEM_PAYLOAD_OFF: {
520                         size_t begin_body;
521
522                         begin_body = BUS_MESSAGE_BODY_BEGIN(m);
523
524                         if (idx + d->vec.size > begin_body) {
525                                 struct bus_body_part *part;
526
527                                 /* Contains body material */
528
529                                 part = message_append_part(m);
530                                 if (!part) {
531                                         r = -ENOMEM;
532                                         goto fail;
533                                 }
534
535                                 /* A -1 offset is NUL padding. */
536                                 part->is_zero = d->vec.offset == ~0ULL;
537
538                                 if (idx >= begin_body) {
539                                         if (!part->is_zero)
540                                                 part->data = (uint8_t* )k + d->vec.offset;
541                                         part->size = d->vec.size;
542                                 } else {
543                                         if (!part->is_zero)
544                                                 part->data = (uint8_t*) k + d->vec.offset + (begin_body - idx);
545                                         part->size = d->vec.size - (begin_body - idx);
546                                 }
547
548                                 part->sealed = true;
549                         }
550
551                         idx += d->vec.size;
552                         break;
553                 }
554
555                 case KDBUS_ITEM_PAYLOAD_MEMFD: {
556                         struct bus_body_part *part;
557
558                         if (idx < BUS_MESSAGE_BODY_BEGIN(m)) {
559                                 r = -EBADMSG;
560                                 goto fail;
561                         }
562
563                         part = message_append_part(m);
564                         if (!part) {
565                                 r = -ENOMEM;
566                                 goto fail;
567                         }
568
569                         part->memfd = d->memfd.fd;
570                         part->memfd_offset = d->memfd.start;
571                         part->size = d->memfd.size;
572                         part->sealed = true;
573
574                         idx += d->memfd.size;
575                         break;
576                 }
577
578                 case KDBUS_ITEM_PIDS:
579
580                         /* The PID/TID might be missing, when the data
581                          * is faked by a bus proxy and it lacks that
582                          * information about the real client (since
583                          * SO_PEERCRED is used for that). Also kernel
584                          * namespacing might make some of this data
585                          * unavailable when untranslatable. */
586
587                         if (d->pids.pid > 0) {
588                                 m->creds.pid = (pid_t) d->pids.pid;
589                                 m->creds.mask |= SD_BUS_CREDS_PID & bus->creds_mask;
590                         }
591
592                         if (d->pids.tid > 0) {
593                                 m->creds.tid = (pid_t) d->pids.tid;
594                                 m->creds.mask |= SD_BUS_CREDS_TID & bus->creds_mask;
595                         }
596
597                         if (d->pids.ppid > 0) {
598                                 m->creds.ppid = (pid_t) d->pids.ppid;
599                                 m->creds.mask |= SD_BUS_CREDS_PPID & bus->creds_mask;
600                         } else if (d->pids.pid == 1) {
601                                 m->creds.ppid = 0;
602                                 m->creds.mask |= SD_BUS_CREDS_PPID & bus->creds_mask;
603                         }
604
605                         break;
606
607                 case KDBUS_ITEM_CREDS:
608
609                         /* EUID/SUID/FSUID/EGID/SGID/FSGID might be
610                          * missing too (see above). */
611
612                         if ((uid_t) d->creds.uid != UID_INVALID) {
613                                 m->creds.uid = (uid_t) d->creds.uid;
614                                 m->creds.mask |= SD_BUS_CREDS_UID & bus->creds_mask;
615                         }
616
617                         if ((uid_t) d->creds.euid != UID_INVALID) {
618                                 m->creds.euid = (uid_t) d->creds.euid;
619                                 m->creds.mask |= SD_BUS_CREDS_EUID & bus->creds_mask;
620                         }
621
622                         if ((uid_t) d->creds.suid != UID_INVALID) {
623                                 m->creds.suid = (uid_t) d->creds.suid;
624                                 m->creds.mask |= SD_BUS_CREDS_SUID & bus->creds_mask;
625                         }
626
627                         if ((uid_t) d->creds.fsuid != UID_INVALID) {
628                                 m->creds.fsuid = (uid_t) d->creds.fsuid;
629                                 m->creds.mask |= SD_BUS_CREDS_FSUID & bus->creds_mask;
630                         }
631
632                         if ((gid_t) d->creds.gid != GID_INVALID) {
633                                 m->creds.gid = (gid_t) d->creds.gid;
634                                 m->creds.mask |= SD_BUS_CREDS_GID & bus->creds_mask;
635                         }
636
637                         if ((gid_t) d->creds.egid != GID_INVALID) {
638                                 m->creds.egid = (gid_t) d->creds.egid;
639                                 m->creds.mask |= SD_BUS_CREDS_EGID & bus->creds_mask;
640                         }
641
642                         if ((gid_t) d->creds.sgid != GID_INVALID) {
643                                 m->creds.sgid = (gid_t) d->creds.sgid;
644                                 m->creds.mask |= SD_BUS_CREDS_SGID & bus->creds_mask;
645                         }
646
647                         if ((gid_t) d->creds.fsgid != GID_INVALID) {
648                                 m->creds.fsgid = (gid_t) d->creds.fsgid;
649                                 m->creds.mask |= SD_BUS_CREDS_FSGID & bus->creds_mask;
650                         }
651
652                         break;
653
654                 case KDBUS_ITEM_TIMESTAMP:
655                         message_set_timestamp(bus, m, &d->timestamp);
656                         break;
657
658                 case KDBUS_ITEM_PID_COMM:
659                         m->creds.comm = d->str;
660                         m->creds.mask |= SD_BUS_CREDS_COMM & bus->creds_mask;
661                         break;
662
663                 case KDBUS_ITEM_TID_COMM:
664                         m->creds.tid_comm = d->str;
665                         m->creds.mask |= SD_BUS_CREDS_TID_COMM & bus->creds_mask;
666                         break;
667
668                 case KDBUS_ITEM_EXE:
669                         m->creds.exe = d->str;
670                         m->creds.mask |= SD_BUS_CREDS_EXE & bus->creds_mask;
671                         break;
672
673                 case KDBUS_ITEM_CMDLINE:
674                         m->creds.cmdline = d->str;
675                         m->creds.cmdline_size = l;
676                         m->creds.mask |= SD_BUS_CREDS_CMDLINE & bus->creds_mask;
677                         break;
678
679                 case KDBUS_ITEM_CGROUP:
680                         m->creds.cgroup = d->str;
681                         m->creds.mask |= (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID) & bus->creds_mask;
682
683                         r = bus_get_root_path(bus);
684                         if (r < 0)
685                                 goto fail;
686
687                         m->creds.cgroup_root = bus->cgroup_root;
688                         break;
689
690                 case KDBUS_ITEM_AUDIT:
691                         m->creds.audit_session_id = (uint32_t) d->audit.sessionid;
692                         m->creds.mask |= SD_BUS_CREDS_AUDIT_SESSION_ID & bus->creds_mask;
693
694                         m->creds.audit_login_uid = (uid_t) d->audit.loginuid;
695                         m->creds.mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID & bus->creds_mask;
696                         break;
697
698                 case KDBUS_ITEM_CAPS:
699                         if (d->caps.last_cap != cap_last_cap() ||
700                             d->size - offsetof(struct kdbus_item, caps.caps) < DIV_ROUND_UP(d->caps.last_cap, 32U) * 4 * 4) {
701                                 r = -EBADMSG;
702                                 goto fail;
703                         }
704
705                         m->creds.capability = d->caps.caps;
706                         m->creds.mask |= (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS) & bus->creds_mask;
707                         break;
708
709                 case KDBUS_ITEM_DST_NAME:
710                         if (!service_name_is_valid(d->str)) {
711                                 r = -EBADMSG;
712                                 goto fail;
713                         }
714
715                         destination = d->str;
716                         break;
717
718                 case KDBUS_ITEM_OWNED_NAME:
719                         if (!service_name_is_valid(d->name.name)) {
720                                 r = -EBADMSG;
721                                 goto fail;
722                         }
723
724                         if (bus->creds_mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) {
725                                 char **wkn;
726                                 size_t n;
727
728                                 /* We just extend the array here, but
729                                  * do not allocate the strings inside
730                                  * of it, instead we just point to our
731                                  * buffer directly. */
732                                 n = strv_length(m->creds.well_known_names);
733                                 wkn = realloc(m->creds.well_known_names, (n + 2) * sizeof(char*));
734                                 if (!wkn) {
735                                         r = -ENOMEM;
736                                         goto fail;
737                                 }
738
739                                 wkn[n] = d->name.name;
740                                 wkn[n+1] = NULL;
741                                 m->creds.well_known_names = wkn;
742
743                                 m->creds.mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES;
744                         }
745                         break;
746
747                 case KDBUS_ITEM_CONN_DESCRIPTION:
748                         m->creds.description = d->str;
749                         m->creds.mask |= SD_BUS_CREDS_DESCRIPTION & bus->creds_mask;
750                         break;
751
752                 case KDBUS_ITEM_AUXGROUPS:
753
754                         if (bus->creds_mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
755                                 size_t i, n;
756                                 gid_t *g;
757
758                                 n = (d->size - offsetof(struct kdbus_item, data64)) / sizeof(uint64_t);
759                                 g = new(gid_t, n);
760                                 if (!g) {
761                                         r = -ENOMEM;
762                                         goto fail;
763                                 }
764
765                                 for (i = 0; i < n; i++)
766                                         g[i] = d->data64[i];
767
768                                 m->creds.supplementary_gids = g;
769                                 m->creds.n_supplementary_gids = n;
770                                 m->creds.mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS;
771                         }
772
773                         break;
774
775                 case KDBUS_ITEM_FDS:
776                 case KDBUS_ITEM_SECLABEL:
777                 case KDBUS_ITEM_BLOOM_FILTER:
778                         break;
779
780                 default:
781                         log_debug("Got unknown field from kernel %llu", d->type);
782                 }
783         }
784
785         /* If we requested the list of well-known names to be appended
786          * and the sender had none no item for it will be
787          * attached. However, this does *not* mean that the kernel
788          * didn't want to provide this information to us. Hence, let's
789          * explicitly mark this information as available if it was
790          * requested. */
791         m->creds.mask |= bus->creds_mask & SD_BUS_CREDS_WELL_KNOWN_NAMES;
792
793         r = bus_message_parse_fields(m);
794         if (r < 0)
795                 goto fail;
796
797         /* Refuse messages if kdbus and dbus1 cookie doesn't match up */
798         if ((uint64_t) m->header->dbus2.cookie != k->cookie) {
799                 r = -EBADMSG;
800                 goto fail;
801         }
802
803         /* Refuse messages where the reply flag doesn't match up */
804         if (!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) != !!(k->flags & KDBUS_MSG_EXPECT_REPLY)) {
805                 r = -EBADMSG;
806                 goto fail;
807         }
808
809         /* Refuse reply messages where the reply cookie doesn't match up */
810         if ((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) && m->reply_cookie != k->cookie_reply) {
811                 r = -EBADMSG;
812                 goto fail;
813         }
814
815         /* Refuse messages where the autostart flag doesn't match up */
816         if (!(m->header->flags & BUS_MESSAGE_NO_AUTO_START) != !(k->flags & KDBUS_MSG_NO_AUTO_START)) {
817                 r = -EBADMSG;
818                 goto fail;
819         }
820
821         /* Override information from the user header with data from the kernel */
822         if (k->src_id == KDBUS_SRC_ID_KERNEL)
823                 bus_message_set_sender_driver(bus, m);
824         else {
825                 snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id);
826                 m->sender = m->creds.unique_name = m->sender_buffer;
827         }
828
829         if (destination)
830                 m->destination = destination;
831         else if (k->dst_id == KDBUS_DST_ID_BROADCAST)
832                 m->destination = NULL;
833         else if (k->dst_id == KDBUS_DST_ID_NAME)
834                 m->destination = bus->unique_name; /* fill in unique name if the well-known name is missing */
835         else {
836                 snprintf(m->destination_buffer, sizeof(m->destination_buffer), ":1.%llu", (unsigned long long) k->dst_id);
837                 m->destination = m->destination_buffer;
838         }
839
840         /* We take possession of the kmsg struct now */
841         m->kdbus = k;
842         m->release_kdbus = true;
843         m->free_fds = true;
844         fds = NULL;
845
846         bus->rqueue[bus->rqueue_size++] = m;
847
848         return 1;
849
850 fail:
851         unset_memfds(m);
852         sd_bus_message_unref(m);
853
854         return r;
855 }
856
857 int bus_kernel_take_fd(sd_bus *b) {
858         struct kdbus_bloom_parameter *bloom = NULL;
859         struct kdbus_item *items, *item;
860         struct kdbus_cmd_hello *hello;
861         _cleanup_free_ char *g = NULL;
862         const char *name;
863         size_t l = 0, m = 0, sz;
864         int r;
865
866         assert(b);
867
868         if (b->is_server)
869                 return -EINVAL;
870
871         b->use_memfd = 1;
872
873         if (b->description) {
874                 g = bus_label_escape(b->description);
875                 if (!g)
876                         return -ENOMEM;
877
878                 name = g;
879         } else {
880                 char pr[17] = {};
881
882                 /* If no name is explicitly set, we'll include a hint
883                  * indicating the library implementation, a hint which
884                  * kind of bus this is and the thread name */
885
886                 assert_se(prctl(PR_GET_NAME, (unsigned long) pr) >= 0);
887
888                 if (isempty(pr)) {
889                         name = b->is_system ? "sd-system" :
890                                 b->is_user ? "sd-user" : "sd";
891                 } else {
892                         _cleanup_free_ char *e = NULL;
893
894                         e = bus_label_escape(pr);
895                         if (!e)
896                                 return -ENOMEM;
897
898                         g = strappend(b->is_system ? "sd-system-" :
899                                       b->is_user ? "sd-user-" : "sd-",
900                                       e);
901                         if (!g)
902                                 return -ENOMEM;
903
904                         name = g;
905                 }
906
907                 b->description = bus_label_unescape(name);
908                 if (!b->description)
909                         return -ENOMEM;
910         }
911
912         m = strlen(name);
913
914         sz = ALIGN8(offsetof(struct kdbus_cmd_hello, items)) +
915                 ALIGN8(offsetof(struct kdbus_item, str) + m + 1);
916
917         if (b->fake_creds_valid)
918                 sz += ALIGN8(offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds));
919
920         if (b->fake_pids_valid)
921                 sz += ALIGN8(offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids));
922
923         if (b->fake_label) {
924                 l = strlen(b->fake_label);
925                 sz += ALIGN8(offsetof(struct kdbus_item, str) + l + 1);
926         }
927
928         hello = alloca0_align(sz, 8);
929         hello->size = sz;
930         hello->flags = b->hello_flags;
931         hello->attach_flags_send = _KDBUS_ATTACH_ANY;
932         hello->attach_flags_recv = b->attach_flags;
933         hello->pool_size = KDBUS_POOL_SIZE;
934
935         item = hello->items;
936
937         item->size = offsetof(struct kdbus_item, str) + m + 1;
938         item->type = KDBUS_ITEM_CONN_DESCRIPTION;
939         memcpy(item->str, name, m + 1);
940         item = KDBUS_ITEM_NEXT(item);
941
942         if (b->fake_creds_valid) {
943                 item->size = offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds);
944                 item->type = KDBUS_ITEM_CREDS;
945                 item->creds = b->fake_creds;
946
947                 item = KDBUS_ITEM_NEXT(item);
948         }
949
950         if (b->fake_pids_valid) {
951                 item->size = offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids);
952                 item->type = KDBUS_ITEM_PIDS;
953                 item->pids = b->fake_pids;
954
955                 item = KDBUS_ITEM_NEXT(item);
956         }
957
958         if (b->fake_label) {
959                 item->size = offsetof(struct kdbus_item, str) + l + 1;
960                 item->type = KDBUS_ITEM_SECLABEL;
961                 memcpy(item->str, b->fake_label, l+1);
962         }
963
964         r = ioctl(b->input_fd, KDBUS_CMD_HELLO, hello);
965         if (r < 0) {
966                 if (errno == ENOTTY)
967                         /* If the ioctl is not supported we assume that the
968                          * API version changed in a major incompatible way,
969                          * let's indicate an API incompatibility in this
970                          * case. */
971                         return -ESOCKTNOSUPPORT;
972
973                 return -errno;
974         }
975
976         if (!b->kdbus_buffer) {
977                 b->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, b->input_fd, 0);
978                 if (b->kdbus_buffer == MAP_FAILED) {
979                         b->kdbus_buffer = NULL;
980                         r = -errno;
981                         goto fail;
982                 }
983         }
984
985         /* The higher 32bit of the bus_flags fields are considered
986          * 'incompatible flags'. Refuse them all for now. */
987         if (hello->bus_flags > 0xFFFFFFFFULL) {
988                 r = -ESOCKTNOSUPPORT;
989                 goto fail;
990         }
991
992         /* extract bloom parameters from items */
993         items = (void*)((uint8_t*)b->kdbus_buffer + hello->offset);
994         KDBUS_FOREACH(item, items, hello->items_size) {
995                 switch (item->type) {
996                 case KDBUS_ITEM_BLOOM_PARAMETER:
997                         bloom = &item->bloom_parameter;
998                         break;
999                 }
1000         }
1001
1002         if (!bloom || !bloom_validate_parameters((size_t) bloom->size, (unsigned) bloom->n_hash)) {
1003                 r = -EOPNOTSUPP;
1004                 goto fail;
1005         }
1006
1007         b->bloom_size = (size_t) bloom->size;
1008         b->bloom_n_hash = (unsigned) bloom->n_hash;
1009
1010         if (asprintf(&b->unique_name, ":1.%llu", (unsigned long long) hello->id) < 0) {
1011                 r = -ENOMEM;
1012                 goto fail;
1013         }
1014
1015         b->unique_id = hello->id;
1016
1017         b->is_kernel = true;
1018         b->bus_client = true;
1019         b->can_fds = !!(hello->flags & KDBUS_HELLO_ACCEPT_FD);
1020         b->message_version = 2;
1021         b->message_endian = BUS_NATIVE_ENDIAN;
1022
1023         /* the kernel told us the UUID of the underlying bus */
1024         memcpy(b->server_id.bytes, hello->id128, sizeof(b->server_id.bytes));
1025
1026         /* free returned items */
1027         (void) bus_kernel_cmd_free(b, hello->offset);
1028         return bus_start_running(b);
1029
1030 fail:
1031         (void) bus_kernel_cmd_free(b, hello->offset);
1032         return r;
1033 }
1034
1035 int bus_kernel_connect(sd_bus *b) {
1036         assert(b);
1037         assert(b->input_fd < 0);
1038         assert(b->output_fd < 0);
1039         assert(b->kernel);
1040
1041         if (b->is_server)
1042                 return -EINVAL;
1043
1044         b->input_fd = open(b->kernel, O_RDWR|O_NOCTTY|O_CLOEXEC);
1045         if (b->input_fd < 0)
1046                 return -errno;
1047
1048         b->output_fd = b->input_fd;
1049
1050         return bus_kernel_take_fd(b);
1051 }
1052
1053 int bus_kernel_cmd_free(sd_bus *bus, uint64_t offset) {
1054         struct kdbus_cmd_free cmd = {
1055                 .size = sizeof(cmd),
1056                 .offset = offset,
1057         };
1058         int r;
1059
1060         assert(bus);
1061         assert(bus->is_kernel);
1062
1063         r = ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd);
1064         if (r < 0)
1065                 return -errno;
1066
1067         return 0;
1068 }
1069
1070 static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
1071         struct kdbus_item *d;
1072
1073         assert(bus);
1074         assert(k);
1075
1076         KDBUS_ITEM_FOREACH(d, k, items) {
1077                 if (d->type == KDBUS_ITEM_FDS)
1078                         close_many(d->fds, (d->size - offsetof(struct kdbus_item, fds)) / sizeof(int));
1079                 else if (d->type == KDBUS_ITEM_PAYLOAD_MEMFD)
1080                         safe_close(d->memfd.fd);
1081         }
1082
1083         bus_kernel_cmd_free(bus, (uint8_t*) k - (uint8_t*) bus->kdbus_buffer);
1084 }
1085
1086 int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call) {
1087         struct kdbus_cmd_send cmd = { };
1088         int r;
1089
1090         assert(bus);
1091         assert(m);
1092         assert(bus->state == BUS_RUNNING);
1093
1094         /* If we can't deliver, we want room for the error message */
1095         r = bus_rqueue_make_room(bus);
1096         if (r < 0)
1097                 return r;
1098
1099         r = bus_message_setup_kmsg(bus, m);
1100         if (r < 0)
1101                 return r;
1102
1103         cmd.size = sizeof(cmd);
1104         cmd.msg_address = (uintptr_t)m->kdbus;
1105
1106         /* If this is a synchronous method call, then let's tell the
1107          * kernel, so that it can pass CPU time/scheduling to the
1108          * destination for the time, if it wants to. If we
1109          * synchronously wait for the result anyway, we won't need CPU
1110          * anyway. */
1111         if (hint_sync_call) {
1112                 m->kdbus->flags |= KDBUS_MSG_EXPECT_REPLY;
1113                 cmd.flags |= KDBUS_SEND_SYNC_REPLY;
1114         }
1115
1116         r = ioctl(bus->output_fd, KDBUS_CMD_SEND, &cmd);
1117         if (r < 0) {
1118                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1119                 sd_bus_message *reply;
1120
1121                 if (errno == EAGAIN || errno == EINTR)
1122                         return 0;
1123                 else if (errno == ENXIO || errno == ESRCH) {
1124
1125                         /* ENXIO: unique name not known
1126                          * ESRCH: well-known name not known */
1127
1128                         if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
1129                                 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Destination %s not known", m->destination);
1130                         else {
1131                                 log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m->destination);
1132                                 return 0;
1133                         }
1134
1135                 } else if (errno == EADDRNOTAVAIL) {
1136
1137                         /* EADDRNOTAVAIL: activation is possible, but turned off in request flags */
1138
1139                         if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
1140                                 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Activation of %s not requested", m->destination);
1141                         else {
1142                                 log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m->destination);
1143                                 return 0;
1144                         }
1145                 } else
1146                         return -errno;
1147
1148                 r = bus_message_new_synthetic_error(
1149                                 bus,
1150                                 BUS_MESSAGE_COOKIE(m),
1151                                 &error,
1152                                 &reply);
1153
1154                 if (r < 0)
1155                         return r;
1156
1157                 r = bus_seal_synthetic_message(bus, reply);
1158                 if (r < 0)
1159                         return r;
1160
1161                 bus->rqueue[bus->rqueue_size++] = reply;
1162
1163         } else if (hint_sync_call) {
1164                 struct kdbus_msg *k;
1165
1166                 k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + cmd.reply.offset);
1167                 assert(k);
1168
1169                 if (k->payload_type == KDBUS_PAYLOAD_DBUS) {
1170
1171                         r = bus_kernel_make_message(bus, k);
1172                         if (r < 0) {
1173                                 close_kdbus_msg(bus, k);
1174
1175                                 /* Anybody can send us invalid messages, let's just drop them. */
1176                                 if (r == -EBADMSG || r == -EPROTOTYPE)
1177                                         log_debug_errno(r, "Ignoring invalid synchronous reply: %m");
1178                                 else
1179                                         return r;
1180                         }
1181                 } else {
1182                         log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
1183                         close_kdbus_msg(bus, k);
1184                 }
1185         }
1186
1187         return 1;
1188 }
1189
1190 static int push_name_owner_changed(
1191                 sd_bus *bus,
1192                 const char *name,
1193                 const char *old_owner,
1194                 const char *new_owner,
1195                 const struct kdbus_timestamp *ts) {
1196
1197         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
1198         int r;
1199
1200         assert(bus);
1201
1202         r = sd_bus_message_new_signal(
1203                         bus,
1204                         &m,
1205                         "/org/freedesktop/DBus",
1206                         "org.freedesktop.DBus",
1207                         "NameOwnerChanged");
1208         if (r < 0)
1209                 return r;
1210
1211         r = sd_bus_message_append(m, "sss", name, old_owner, new_owner);
1212         if (r < 0)
1213                 return r;
1214
1215         bus_message_set_sender_driver(bus, m);
1216         message_set_timestamp(bus, m, ts);
1217
1218         r = bus_seal_synthetic_message(bus, m);
1219         if (r < 0)
1220                 return r;
1221
1222         bus->rqueue[bus->rqueue_size++] = m;
1223         m = NULL;
1224
1225         return 1;
1226 }
1227
1228 static int translate_name_change(
1229                 sd_bus *bus,
1230                 const struct kdbus_msg *k,
1231                 const struct kdbus_item *d,
1232                 const struct kdbus_timestamp *ts) {
1233
1234         char new_owner[UNIQUE_NAME_MAX], old_owner[UNIQUE_NAME_MAX];
1235
1236         assert(bus);
1237         assert(k);
1238         assert(d);
1239
1240         if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR)))
1241                 old_owner[0] = 0;
1242         else
1243                 sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old_id.id);
1244
1245         if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) {
1246
1247                 if (isempty(old_owner))
1248                         return 0;
1249
1250                 new_owner[0] = 0;
1251         } else
1252                 sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new_id.id);
1253
1254         return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner, ts);
1255 }
1256
1257 static int translate_id_change(
1258                 sd_bus *bus,
1259                 const struct kdbus_msg *k,
1260                 const struct kdbus_item *d,
1261                 const struct kdbus_timestamp *ts) {
1262
1263         char owner[UNIQUE_NAME_MAX];
1264
1265         assert(bus);
1266         assert(k);
1267         assert(d);
1268
1269         sprintf(owner, ":1.%llu", d->id_change.id);
1270
1271         return push_name_owner_changed(
1272                         bus, owner,
1273                         d->type == KDBUS_ITEM_ID_ADD ? NULL : owner,
1274                         d->type == KDBUS_ITEM_ID_ADD ? owner : NULL,
1275                         ts);
1276 }
1277
1278 static int translate_reply(
1279                 sd_bus *bus,
1280                 const struct kdbus_msg *k,
1281                 const struct kdbus_item *d,
1282                 const struct kdbus_timestamp *ts) {
1283
1284         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
1285         int r;
1286
1287         assert(bus);
1288         assert(k);
1289         assert(d);
1290
1291         r = bus_message_new_synthetic_error(
1292                         bus,
1293                         k->cookie_reply,
1294                         d->type == KDBUS_ITEM_REPLY_TIMEOUT ?
1295                         &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out") :
1296                         &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call peer died"),
1297                         &m);
1298         if (r < 0)
1299                 return r;
1300
1301         message_set_timestamp(bus, m, ts);
1302
1303         r = bus_seal_synthetic_message(bus, m);
1304         if (r < 0)
1305                 return r;
1306
1307         bus->rqueue[bus->rqueue_size++] = m;
1308         m = NULL;
1309
1310         return 1;
1311 }
1312
1313 static int bus_kernel_translate_message(sd_bus *bus, struct kdbus_msg *k) {
1314         static int (* const translate[])(sd_bus *bus, const struct kdbus_msg *k, const struct kdbus_item *d, const struct kdbus_timestamp *ts) = {
1315                 [KDBUS_ITEM_NAME_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1316                 [KDBUS_ITEM_NAME_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1317                 [KDBUS_ITEM_NAME_CHANGE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1318
1319                 [KDBUS_ITEM_ID_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
1320                 [KDBUS_ITEM_ID_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
1321
1322                 [KDBUS_ITEM_REPLY_TIMEOUT - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
1323                 [KDBUS_ITEM_REPLY_DEAD - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
1324         };
1325
1326         struct kdbus_item *d, *found = NULL;
1327         struct kdbus_timestamp *ts = NULL;
1328
1329         assert(bus);
1330         assert(k);
1331         assert(k->payload_type == KDBUS_PAYLOAD_KERNEL);
1332
1333         KDBUS_ITEM_FOREACH(d, k, items) {
1334                 if (d->type == KDBUS_ITEM_TIMESTAMP)
1335                         ts = &d->timestamp;
1336                 else if (d->type >= _KDBUS_ITEM_KERNEL_BASE && d->type < _KDBUS_ITEM_KERNEL_BASE + ELEMENTSOF(translate)) {
1337                         if (found)
1338                                 return -EBADMSG;
1339                         found = d;
1340                 } else
1341                         log_debug("Got unknown field from kernel %llu", d->type);
1342         }
1343
1344         if (!found) {
1345                 log_debug("Didn't find a kernel message to translate.");
1346                 return 0;
1347         }
1348
1349         return translate[found->type - _KDBUS_ITEM_KERNEL_BASE](bus, k, found, ts);
1350 }
1351
1352 int bus_kernel_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1353         struct kdbus_cmd_recv recv = { .size = sizeof(recv) };
1354         struct kdbus_msg *k;
1355         int r;
1356
1357         assert(bus);
1358
1359         r = bus_rqueue_make_room(bus);
1360         if (r < 0)
1361                 return r;
1362
1363         if (hint_priority) {
1364                 recv.flags |= KDBUS_RECV_USE_PRIORITY;
1365                 recv.priority = priority;
1366         }
1367
1368         r = ioctl(bus->input_fd, KDBUS_CMD_RECV, &recv);
1369         if (recv.return_flags & KDBUS_RECV_RETURN_DROPPED_MSGS)
1370                 log_debug("%s: kdbus reports %" PRIu64 " dropped broadcast messages, ignoring.", strna(bus->description), (uint64_t) recv.dropped_msgs);
1371         if (r < 0) {
1372                 if (errno == EAGAIN)
1373                         return 0;
1374
1375                 return -errno;
1376         }
1377
1378         k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + recv.msg.offset);
1379         if (k->payload_type == KDBUS_PAYLOAD_DBUS) {
1380                 r = bus_kernel_make_message(bus, k);
1381
1382                 /* Anybody can send us invalid messages, let's just drop them. */
1383                 if (r == -EBADMSG || r == -EPROTOTYPE) {
1384                         log_debug_errno(r, "Ignoring invalid message: %m");
1385                         r = 0;
1386                 }
1387
1388                 if (r <= 0)
1389                         close_kdbus_msg(bus, k);
1390         } else if (k->payload_type == KDBUS_PAYLOAD_KERNEL) {
1391                 r = bus_kernel_translate_message(bus, k);
1392                 close_kdbus_msg(bus, k);
1393         } else {
1394                 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
1395                 r = 0;
1396                 close_kdbus_msg(bus, k);
1397         }
1398
1399         return r < 0 ? r : 1;
1400 }
1401
1402 int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *allocated) {
1403         struct memfd_cache *c;
1404         int fd;
1405
1406         assert(address);
1407         assert(mapped);
1408         assert(allocated);
1409
1410         if (!bus || !bus->is_kernel)
1411                 return -EOPNOTSUPP;
1412
1413         assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
1414
1415         if (bus->n_memfd_cache <= 0) {
1416                 int r;
1417
1418                 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1419
1420                 r = memfd_new(bus->description);
1421                 if (r < 0)
1422                         return r;
1423
1424                 *address = NULL;
1425                 *mapped = 0;
1426                 *allocated = 0;
1427                 return r;
1428         }
1429
1430         c = &bus->memfd_cache[--bus->n_memfd_cache];
1431
1432         assert(c->fd >= 0);
1433         assert(c->mapped == 0 || c->address);
1434
1435         *address = c->address;
1436         *mapped = c->mapped;
1437         *allocated = c->allocated;
1438         fd = c->fd;
1439
1440         assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1441
1442         return fd;
1443 }
1444
1445 static void close_and_munmap(int fd, void *address, size_t size) {
1446         if (size > 0)
1447                 assert_se(munmap(address, PAGE_ALIGN(size)) >= 0);
1448
1449         safe_close(fd);
1450 }
1451
1452 void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t mapped, size_t allocated) {
1453         struct memfd_cache *c;
1454         uint64_t max_mapped = PAGE_ALIGN(MEMFD_CACHE_ITEM_SIZE_MAX);
1455
1456         assert(fd >= 0);
1457         assert(mapped == 0 || address);
1458
1459         if (!bus || !bus->is_kernel) {
1460                 close_and_munmap(fd, address, mapped);
1461                 return;
1462         }
1463
1464         assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
1465
1466         if (bus->n_memfd_cache >= ELEMENTSOF(bus->memfd_cache)) {
1467                 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1468
1469                 close_and_munmap(fd, address, mapped);
1470                 return;
1471         }
1472
1473         c = &bus->memfd_cache[bus->n_memfd_cache++];
1474         c->fd = fd;
1475         c->address = address;
1476
1477         /* If overly long, let's return a bit to the OS */
1478         if (mapped > max_mapped) {
1479                 assert_se(memfd_set_size(fd, max_mapped) >= 0);
1480                 assert_se(munmap((uint8_t*) address + max_mapped, PAGE_ALIGN(mapped - max_mapped)) >= 0);
1481                 c->mapped = c->allocated = max_mapped;
1482         } else {
1483                 c->mapped = mapped;
1484                 c->allocated = allocated;
1485         }
1486
1487         assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1488 }
1489
1490 void bus_kernel_flush_memfd(sd_bus *b) {
1491         unsigned i;
1492
1493         assert(b);
1494
1495         for (i = 0; i < b->n_memfd_cache; i++)
1496                 close_and_munmap(b->memfd_cache[i].fd, b->memfd_cache[i].address, b->memfd_cache[i].mapped);
1497 }
1498
1499 uint64_t request_name_flags_to_kdbus(uint64_t flags) {
1500         uint64_t f = 0;
1501
1502         if (flags & SD_BUS_NAME_ALLOW_REPLACEMENT)
1503                 f |= KDBUS_NAME_ALLOW_REPLACEMENT;
1504
1505         if (flags & SD_BUS_NAME_REPLACE_EXISTING)
1506                 f |= KDBUS_NAME_REPLACE_EXISTING;
1507
1508         if (flags & SD_BUS_NAME_QUEUE)
1509                 f |= KDBUS_NAME_QUEUE;
1510
1511         return f;
1512 }
1513
1514 uint64_t attach_flags_to_kdbus(uint64_t mask) {
1515         uint64_t m = 0;
1516
1517         if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID|
1518                     SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID))
1519                 m |= KDBUS_ATTACH_CREDS;
1520
1521         if (mask & (SD_BUS_CREDS_PID|SD_BUS_CREDS_TID|SD_BUS_CREDS_PPID))
1522                 m |= KDBUS_ATTACH_PIDS;
1523
1524         if (mask & SD_BUS_CREDS_COMM)
1525                 m |= KDBUS_ATTACH_PID_COMM;
1526
1527         if (mask & SD_BUS_CREDS_TID_COMM)
1528                 m |= KDBUS_ATTACH_TID_COMM;
1529
1530         if (mask & SD_BUS_CREDS_EXE)
1531                 m |= KDBUS_ATTACH_EXE;
1532
1533         if (mask & SD_BUS_CREDS_CMDLINE)
1534                 m |= KDBUS_ATTACH_CMDLINE;
1535
1536         if (mask & (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID))
1537                 m |= KDBUS_ATTACH_CGROUP;
1538
1539         if (mask & (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS))
1540                 m |= KDBUS_ATTACH_CAPS;
1541
1542         if (mask & SD_BUS_CREDS_SELINUX_CONTEXT)
1543                 m |= KDBUS_ATTACH_SECLABEL;
1544
1545         if (mask & (SD_BUS_CREDS_AUDIT_SESSION_ID|SD_BUS_CREDS_AUDIT_LOGIN_UID))
1546                 m |= KDBUS_ATTACH_AUDIT;
1547
1548         if (mask & SD_BUS_CREDS_WELL_KNOWN_NAMES)
1549                 m |= KDBUS_ATTACH_NAMES;
1550
1551         if (mask & SD_BUS_CREDS_DESCRIPTION)
1552                 m |= KDBUS_ATTACH_CONN_DESCRIPTION;
1553
1554         if (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS)
1555                 m |= KDBUS_ATTACH_AUXGROUPS;
1556
1557         return m;
1558 }
1559
1560 /// UNNEEDED by elogind
1561 #if 0
1562 int bus_kernel_create_bus(const char *name, bool world, char **s) {
1563         struct kdbus_cmd *make;
1564         struct kdbus_item *n;
1565         size_t l;
1566         int fd;
1567
1568         assert(name);
1569         assert(s);
1570
1571         fd = open("/sys/fs/kdbus/control", O_RDWR|O_NOCTTY|O_CLOEXEC);
1572         if (fd < 0)
1573                 return -errno;
1574
1575         l = strlen(name);
1576         make = alloca0_align(offsetof(struct kdbus_cmd, items) +
1577                              ALIGN8(offsetof(struct kdbus_item, bloom_parameter) + sizeof(struct kdbus_bloom_parameter)) +
1578                              ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)) +
1579                              ALIGN8(offsetof(struct kdbus_item, str) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1),
1580                              8);
1581
1582         make->size = offsetof(struct kdbus_cmd, items);
1583
1584         /* Set the bloom parameters */
1585         n = make->items;
1586         n->size = offsetof(struct kdbus_item, bloom_parameter) +
1587                   sizeof(struct kdbus_bloom_parameter);
1588         n->type = KDBUS_ITEM_BLOOM_PARAMETER;
1589         n->bloom_parameter.size = DEFAULT_BLOOM_SIZE;
1590         n->bloom_parameter.n_hash = DEFAULT_BLOOM_N_HASH;
1591
1592         assert_cc(DEFAULT_BLOOM_SIZE > 0);
1593         assert_cc(DEFAULT_BLOOM_N_HASH > 0);
1594
1595         make->size += ALIGN8(n->size);
1596
1597         /* Provide all metadata via bus-owner queries */
1598         n = KDBUS_ITEM_NEXT(n);
1599         n->type = KDBUS_ITEM_ATTACH_FLAGS_SEND;
1600         n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
1601         n->data64[0] = _KDBUS_ATTACH_ANY;
1602         make->size += ALIGN8(n->size);
1603
1604         /* Set the a good name */
1605         n = KDBUS_ITEM_NEXT(n);
1606         sprintf(n->str, UID_FMT "-%s", getuid(), name);
1607         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1608         n->type = KDBUS_ITEM_MAKE_NAME;
1609         make->size += ALIGN8(n->size);
1610
1611         make->flags = world ? KDBUS_MAKE_ACCESS_WORLD : 0;
1612
1613         if (ioctl(fd, KDBUS_CMD_BUS_MAKE, make) < 0) {
1614                 safe_close(fd);
1615
1616                 /* Major API change? then the ioctls got shuffled around. */
1617                 if (errno == ENOTTY)
1618                         return -ESOCKTNOSUPPORT;
1619
1620                 return -errno;
1621         }
1622
1623         if (s) {
1624                 char *p;
1625
1626                 p = strjoin("/sys/fs/kdbus/", n->str, "/bus", NULL);
1627                 if (!p) {
1628                         safe_close(fd);
1629                         return -ENOMEM;
1630                 }
1631
1632                 *s = p;
1633         }
1634
1635         return fd;
1636 }
1637 #endif // 0
1638
1639 int bus_kernel_open_bus_fd(const char *bus, char **path) {
1640         char *p;
1641         int fd;
1642         size_t len;
1643
1644         assert(bus);
1645
1646         len = strlen("/sys/fs/kdbus/") + DECIMAL_STR_MAX(uid_t) + 1 + strlen(bus) + strlen("/bus") + 1;
1647
1648         if (path) {
1649                 p = new(char, len);
1650                 if (!p)
1651                         return -ENOMEM;
1652         } else
1653                 p = newa(char, len);
1654
1655         sprintf(p, "/sys/fs/kdbus/" UID_FMT "-%s/bus", getuid(), bus);
1656
1657         fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC);
1658         if (fd < 0) {
1659                 if (path)
1660                         free(p);
1661
1662                 return -errno;
1663         }
1664
1665         if (path)
1666                 *path = p;
1667
1668         return fd;
1669 }
1670
1671 /// UNNEEDED by elogind
1672 #if 0
1673 int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char **ep_path) {
1674         _cleanup_free_ char *path = NULL;
1675         struct kdbus_cmd *make;
1676         struct kdbus_item *n;
1677         const char *name;
1678         int fd;
1679
1680         fd = bus_kernel_open_bus_fd(bus_name, &path);
1681         if (fd < 0)
1682                 return fd;
1683
1684         make = alloca0_align(ALIGN8(offsetof(struct kdbus_cmd, items)) +
1685                              ALIGN8(offsetof(struct kdbus_item, str) + DECIMAL_STR_MAX(uid_t) + 1 + strlen(ep_name) + 1),
1686                              8);
1687         make->size = ALIGN8(offsetof(struct kdbus_cmd, items));
1688         make->flags = KDBUS_MAKE_ACCESS_WORLD;
1689
1690         n = make->items;
1691         sprintf(n->str, UID_FMT "-%s", getuid(), ep_name);
1692         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1693         n->type = KDBUS_ITEM_MAKE_NAME;
1694         make->size += ALIGN8(n->size);
1695         name = n->str;
1696
1697         if (ioctl(fd, KDBUS_CMD_ENDPOINT_MAKE, make) < 0) {
1698                 safe_close(fd);
1699                 return -errno;
1700         }
1701
1702         if (ep_path) {
1703                 char *p;
1704
1705                 p = strjoin(dirname(path), "/", name, NULL);
1706                 if (!p) {
1707                         safe_close(fd);
1708                         return -ENOMEM;
1709                 }
1710
1711                 *ep_path = p;
1712         }
1713
1714         return fd;
1715 }
1716 #endif // 0
1717
1718 int bus_kernel_try_close(sd_bus *bus) {
1719         struct kdbus_cmd byebye = { .size = sizeof(byebye) };
1720
1721         assert(bus);
1722         assert(bus->is_kernel);
1723
1724         if (ioctl(bus->input_fd, KDBUS_CMD_BYEBYE, &byebye) < 0)
1725                 return -errno;
1726
1727         return 0;
1728 }
1729
1730 /// UNNEEDED by elogind
1731 #if 0
1732 int bus_kernel_drop_one(int fd) {
1733         struct kdbus_cmd_recv recv = {
1734                 .size = sizeof(recv),
1735                 .flags = KDBUS_RECV_DROP,
1736         };
1737
1738         assert(fd >= 0);
1739
1740         if (ioctl(fd, KDBUS_CMD_RECV, &recv) < 0)
1741                 return -errno;
1742
1743         return 0;
1744 }
1745 #endif // 0
1746
1747 int bus_kernel_realize_attach_flags(sd_bus *bus) {
1748         struct kdbus_cmd *update;
1749         struct kdbus_item *n;
1750
1751         assert(bus);
1752         assert(bus->is_kernel);
1753
1754         update = alloca0_align(offsetof(struct kdbus_cmd, items) +
1755                                ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)),
1756                                8);
1757
1758         n = update->items;
1759         n->type = KDBUS_ITEM_ATTACH_FLAGS_RECV;
1760         n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
1761         n->data64[0] = bus->attach_flags;
1762
1763         update->size =
1764                 offsetof(struct kdbus_cmd, items) +
1765                 ALIGN8(n->size);
1766
1767         if (ioctl(bus->input_fd, KDBUS_CMD_UPDATE, update) < 0)
1768                 return -errno;
1769
1770         return 0;
1771 }
1772
1773 int bus_kernel_get_bus_name(sd_bus *bus, char **name) {
1774         struct kdbus_cmd_info cmd = {
1775                 .size = sizeof(struct kdbus_cmd_info),
1776         };
1777         struct kdbus_info *info;
1778         struct kdbus_item *item;
1779         char *n = NULL;
1780         int r;
1781
1782         assert(bus);
1783         assert(name);
1784         assert(bus->is_kernel);
1785
1786         r = ioctl(bus->input_fd, KDBUS_CMD_BUS_CREATOR_INFO, &cmd);
1787         if (r < 0)
1788                 return -errno;
1789
1790         info = (struct kdbus_info*) ((uint8_t*) bus->kdbus_buffer + cmd.offset);
1791
1792         KDBUS_ITEM_FOREACH(item, info, items)
1793                 if (item->type == KDBUS_ITEM_MAKE_NAME) {
1794                         r = free_and_strdup(&n, item->str);
1795                         break;
1796                 }
1797
1798         bus_kernel_cmd_free(bus, cmd.offset);
1799
1800         if (r < 0)
1801                 return r;
1802         if (!n)
1803                 return -EIO;
1804
1805         *name = n;
1806         return 0;
1807 }