chiark / gitweb /
sd-bus: use proper cleanup macro
[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 XDG
33  * version which is really broken. */
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                         break;
778
779                 default:
780                         log_debug("Got unknown field from kernel %llu", d->type);
781                 }
782         }
783
784         /* If we requested the list of well-known names to be appended
785          * and the sender had none no item for it will be
786          * attached. However, this does *not* mean that the kernel
787          * didn't want to provide this information to us. Hence, let's
788          * explicitly mark this information as available if it was
789          * requested. */
790         m->creds.mask |= bus->creds_mask & SD_BUS_CREDS_WELL_KNOWN_NAMES;
791
792         r = bus_message_parse_fields(m);
793         if (r < 0)
794                 goto fail;
795
796         /* Refuse messages if kdbus and dbus1 cookie doesn't match up */
797         if ((uint64_t) m->header->dbus2.cookie != k->cookie) {
798                 r = -EBADMSG;
799                 goto fail;
800         }
801
802         /* Refuse messages where the reply flag doesn't match up */
803         if (!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) != !!(k->flags & KDBUS_MSG_EXPECT_REPLY)) {
804                 r = -EBADMSG;
805                 goto fail;
806         }
807
808         /* Refuse reply messages where the reply cookie doesn't match up */
809         if ((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) && m->reply_cookie != k->cookie_reply) {
810                 r = -EBADMSG;
811                 goto fail;
812         }
813
814         /* Refuse messages where the autostart flag doesn't match up */
815         if (!(m->header->flags & BUS_MESSAGE_NO_AUTO_START) != !(k->flags & KDBUS_MSG_NO_AUTO_START)) {
816                 r = -EBADMSG;
817                 goto fail;
818         }
819
820         /* Override information from the user header with data from the kernel */
821         if (k->src_id == KDBUS_SRC_ID_KERNEL)
822                 bus_message_set_sender_driver(bus, m);
823         else {
824                 snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id);
825                 m->sender = m->creds.unique_name = m->sender_buffer;
826         }
827
828         if (destination)
829                 m->destination = destination;
830         else if (k->dst_id == KDBUS_DST_ID_BROADCAST)
831                 m->destination = NULL;
832         else if (k->dst_id == KDBUS_DST_ID_NAME)
833                 m->destination = bus->unique_name; /* fill in unique name if the well-known name is missing */
834         else {
835                 snprintf(m->destination_buffer, sizeof(m->destination_buffer), ":1.%llu", (unsigned long long) k->dst_id);
836                 m->destination = m->destination_buffer;
837         }
838
839         /* We take possession of the kmsg struct now */
840         m->kdbus = k;
841         m->release_kdbus = true;
842         m->free_fds = true;
843         fds = NULL;
844
845         bus->rqueue[bus->rqueue_size++] = m;
846
847         return 1;
848
849 fail:
850         unset_memfds(m);
851         sd_bus_message_unref(m);
852
853         return r;
854 }
855
856 int bus_kernel_take_fd(sd_bus *b) {
857         struct kdbus_bloom_parameter *bloom = NULL;
858         struct kdbus_item *items, *item;
859         struct kdbus_cmd_hello *hello;
860         _cleanup_free_ char *g = NULL;
861         const char *name;
862         size_t l = 0, m = 0, sz;
863         int r;
864
865         assert(b);
866
867         if (b->is_server)
868                 return -EINVAL;
869
870         b->use_memfd = 1;
871
872         if (b->description) {
873                 g = bus_label_escape(b->description);
874                 if (!g)
875                         return -ENOMEM;
876
877                 name = g;
878         } else {
879                 char pr[17] = {};
880
881                 /* If no name is explicitly set, we'll include a hint
882                  * indicating the library implementation, a hint which
883                  * kind of bus this is and the thread name */
884
885                 assert_se(prctl(PR_GET_NAME, (unsigned long) pr) >= 0);
886
887                 if (isempty(pr)) {
888                         name = b->is_system ? "sd-system" :
889                                 b->is_user ? "sd-user" : "sd";
890                 } else {
891                         _cleanup_free_ char *e = NULL;
892
893                         e = bus_label_escape(pr);
894                         if (!e)
895                                 return -ENOMEM;
896
897                         g = strappend(b->is_system ? "sd-system-" :
898                                       b->is_user ? "sd-user-" : "sd-",
899                                       e);
900                         if (!g)
901                                 return -ENOMEM;
902
903                         name = g;
904                 }
905
906                 b->description = bus_label_unescape(name);
907                 if (!b->description)
908                         return -ENOMEM;
909         }
910
911         m = strlen(name);
912
913         sz = ALIGN8(offsetof(struct kdbus_cmd_hello, items)) +
914                 ALIGN8(offsetof(struct kdbus_item, str) + m + 1);
915
916         if (b->fake_creds_valid)
917                 sz += ALIGN8(offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds));
918
919         if (b->fake_pids_valid)
920                 sz += ALIGN8(offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids));
921
922         if (b->fake_label) {
923                 l = strlen(b->fake_label);
924                 sz += ALIGN8(offsetof(struct kdbus_item, str) + l + 1);
925         }
926
927         hello = alloca0_align(sz, 8);
928         hello->size = sz;
929         hello->flags = b->hello_flags;
930         hello->attach_flags_send = _KDBUS_ATTACH_ANY;
931         hello->attach_flags_recv = b->attach_flags;
932         hello->pool_size = KDBUS_POOL_SIZE;
933
934         item = hello->items;
935
936         item->size = offsetof(struct kdbus_item, str) + m + 1;
937         item->type = KDBUS_ITEM_CONN_DESCRIPTION;
938         memcpy(item->str, name, m + 1);
939         item = KDBUS_ITEM_NEXT(item);
940
941         if (b->fake_creds_valid) {
942                 item->size = offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds);
943                 item->type = KDBUS_ITEM_CREDS;
944                 item->creds = b->fake_creds;
945
946                 item = KDBUS_ITEM_NEXT(item);
947         }
948
949         if (b->fake_pids_valid) {
950                 item->size = offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids);
951                 item->type = KDBUS_ITEM_PIDS;
952                 item->pids = b->fake_pids;
953
954                 item = KDBUS_ITEM_NEXT(item);
955         }
956
957         if (b->fake_label) {
958                 item->size = offsetof(struct kdbus_item, str) + l + 1;
959                 item->type = KDBUS_ITEM_SECLABEL;
960                 memcpy(item->str, b->fake_label, l+1);
961         }
962
963         r = ioctl(b->input_fd, KDBUS_CMD_HELLO, hello);
964         if (r < 0) {
965                 if (errno == ENOTTY)
966                         /* If the ioctl is not supported we assume that the
967                          * API version changed in a major incompatible way,
968                          * let's indicate an API incompatibility in this
969                          * case. */
970                         return -ESOCKTNOSUPPORT;
971
972                 return -errno;
973         }
974
975         if (!b->kdbus_buffer) {
976                 b->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, b->input_fd, 0);
977                 if (b->kdbus_buffer == MAP_FAILED) {
978                         b->kdbus_buffer = NULL;
979                         r = -errno;
980                         goto fail;
981                 }
982         }
983
984         /* The higher 32bit of the bus_flags fields are considered
985          * 'incompatible flags'. Refuse them all for now. */
986         if (hello->bus_flags > 0xFFFFFFFFULL) {
987                 r = -ESOCKTNOSUPPORT;
988                 goto fail;
989         }
990
991         /* extract bloom parameters from items */
992         items = (void*)((uint8_t*)b->kdbus_buffer + hello->offset);
993         KDBUS_FOREACH(item, items, hello->items_size) {
994                 switch (item->type) {
995                 case KDBUS_ITEM_BLOOM_PARAMETER:
996                         bloom = &item->bloom_parameter;
997                         break;
998                 }
999         }
1000
1001         if (!bloom || !bloom_validate_parameters((size_t) bloom->size, (unsigned) bloom->n_hash)) {
1002                 r = -EOPNOTSUPP;
1003                 goto fail;
1004         }
1005
1006         b->bloom_size = (size_t) bloom->size;
1007         b->bloom_n_hash = (unsigned) bloom->n_hash;
1008
1009         if (asprintf(&b->unique_name, ":1.%llu", (unsigned long long) hello->id) < 0) {
1010                 r = -ENOMEM;
1011                 goto fail;
1012         }
1013
1014         b->unique_id = hello->id;
1015
1016         b->is_kernel = true;
1017         b->bus_client = true;
1018         b->can_fds = !!(hello->flags & KDBUS_HELLO_ACCEPT_FD);
1019         b->message_version = 2;
1020         b->message_endian = BUS_NATIVE_ENDIAN;
1021
1022         /* the kernel told us the UUID of the underlying bus */
1023         memcpy(b->server_id.bytes, hello->id128, sizeof(b->server_id.bytes));
1024
1025         /* free returned items */
1026         (void) bus_kernel_cmd_free(b, hello->offset);
1027         return bus_start_running(b);
1028
1029 fail:
1030         (void) bus_kernel_cmd_free(b, hello->offset);
1031         return r;
1032 }
1033
1034 int bus_kernel_connect(sd_bus *b) {
1035         assert(b);
1036         assert(b->input_fd < 0);
1037         assert(b->output_fd < 0);
1038         assert(b->kernel);
1039
1040         if (b->is_server)
1041                 return -EINVAL;
1042
1043         b->input_fd = open(b->kernel, O_RDWR|O_NOCTTY|O_CLOEXEC);
1044         if (b->input_fd < 0)
1045                 return -errno;
1046
1047         b->output_fd = b->input_fd;
1048
1049         return bus_kernel_take_fd(b);
1050 }
1051
1052 int bus_kernel_cmd_free(sd_bus *bus, uint64_t offset) {
1053         struct kdbus_cmd_free cmd = {
1054                 .size = sizeof(cmd),
1055                 .offset = offset,
1056         };
1057         int r;
1058
1059         assert(bus);
1060         assert(bus->is_kernel);
1061
1062         r = ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd);
1063         if (r < 0)
1064                 return -errno;
1065
1066         return 0;
1067 }
1068
1069 static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
1070         struct kdbus_item *d;
1071
1072         assert(bus);
1073         assert(k);
1074
1075         KDBUS_ITEM_FOREACH(d, k, items) {
1076                 if (d->type == KDBUS_ITEM_FDS)
1077                         close_many(d->fds, (d->size - offsetof(struct kdbus_item, fds)) / sizeof(int));
1078                 else if (d->type == KDBUS_ITEM_PAYLOAD_MEMFD)
1079                         safe_close(d->memfd.fd);
1080         }
1081
1082         bus_kernel_cmd_free(bus, (uint8_t*) k - (uint8_t*) bus->kdbus_buffer);
1083 }
1084
1085 int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call) {
1086         struct kdbus_cmd_send cmd = { };
1087         int r;
1088
1089         assert(bus);
1090         assert(m);
1091         assert(bus->state == BUS_RUNNING);
1092
1093         /* If we can't deliver, we want room for the error message */
1094         r = bus_rqueue_make_room(bus);
1095         if (r < 0)
1096                 return r;
1097
1098         r = bus_message_setup_kmsg(bus, m);
1099         if (r < 0)
1100                 return r;
1101
1102         cmd.size = sizeof(cmd);
1103         cmd.msg_address = (uintptr_t)m->kdbus;
1104
1105         /* If this is a synchronous method call, then let's tell the
1106          * kernel, so that it can pass CPU time/scheduling to the
1107          * destination for the time, if it wants to. If we
1108          * synchronously wait for the result anyway, we won't need CPU
1109          * anyway. */
1110         if (hint_sync_call) {
1111                 m->kdbus->flags |= KDBUS_MSG_EXPECT_REPLY;
1112                 cmd.flags |= KDBUS_SEND_SYNC_REPLY;
1113         }
1114
1115         r = ioctl(bus->output_fd, KDBUS_CMD_SEND, &cmd);
1116         if (r < 0) {
1117                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1118                 sd_bus_message *reply;
1119
1120                 if (errno == EAGAIN || errno == EINTR)
1121                         return 0;
1122                 else if (errno == ENXIO || errno == ESRCH) {
1123
1124                         /* ENXIO: unique name not known
1125                          * ESRCH: well-known name not known */
1126
1127                         if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
1128                                 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Destination %s not known", m->destination);
1129                         else {
1130                                 log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m->destination);
1131                                 return 0;
1132                         }
1133
1134                 } else if (errno == EADDRNOTAVAIL) {
1135
1136                         /* EADDRNOTAVAIL: activation is possible, but turned off in request flags */
1137
1138                         if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
1139                                 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Activation of %s not requested", m->destination);
1140                         else {
1141                                 log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m->destination);
1142                                 return 0;
1143                         }
1144                 } else
1145                         return -errno;
1146
1147                 r = bus_message_new_synthetic_error(
1148                                 bus,
1149                                 BUS_MESSAGE_COOKIE(m),
1150                                 &error,
1151                                 &reply);
1152
1153                 if (r < 0)
1154                         return r;
1155
1156                 r = bus_seal_synthetic_message(bus, reply);
1157                 if (r < 0)
1158                         return r;
1159
1160                 bus->rqueue[bus->rqueue_size++] = reply;
1161
1162         } else if (hint_sync_call) {
1163                 struct kdbus_msg *k;
1164
1165                 k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + cmd.reply.offset);
1166                 assert(k);
1167
1168                 if (k->payload_type == KDBUS_PAYLOAD_DBUS) {
1169
1170                         r = bus_kernel_make_message(bus, k);
1171                         if (r < 0) {
1172                                 close_kdbus_msg(bus, k);
1173
1174                                 /* Anybody can send us invalid messages, let's just drop them. */
1175                                 if (r == -EBADMSG || r == -EPROTOTYPE)
1176                                         log_debug_errno(r, "Ignoring invalid synchronous reply: %m");
1177                                 else
1178                                         return r;
1179                         }
1180                 } else {
1181                         log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
1182                         close_kdbus_msg(bus, k);
1183                 }
1184         }
1185
1186         return 1;
1187 }
1188
1189 static int push_name_owner_changed(
1190                 sd_bus *bus,
1191                 const char *name,
1192                 const char *old_owner,
1193                 const char *new_owner,
1194                 const struct kdbus_timestamp *ts) {
1195
1196         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
1197         int r;
1198
1199         assert(bus);
1200
1201         r = sd_bus_message_new_signal(
1202                         bus,
1203                         &m,
1204                         "/org/freedesktop/DBus",
1205                         "org.freedesktop.DBus",
1206                         "NameOwnerChanged");
1207         if (r < 0)
1208                 return r;
1209
1210         r = sd_bus_message_append(m, "sss", name, old_owner, new_owner);
1211         if (r < 0)
1212                 return r;
1213
1214         bus_message_set_sender_driver(bus, m);
1215         message_set_timestamp(bus, m, ts);
1216
1217         r = bus_seal_synthetic_message(bus, m);
1218         if (r < 0)
1219                 return r;
1220
1221         bus->rqueue[bus->rqueue_size++] = m;
1222         m = NULL;
1223
1224         return 1;
1225 }
1226
1227 static int translate_name_change(
1228                 sd_bus *bus,
1229                 const struct kdbus_msg *k,
1230                 const struct kdbus_item *d,
1231                 const struct kdbus_timestamp *ts) {
1232
1233         char new_owner[UNIQUE_NAME_MAX], old_owner[UNIQUE_NAME_MAX];
1234
1235         assert(bus);
1236         assert(k);
1237         assert(d);
1238
1239         if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR)))
1240                 old_owner[0] = 0;
1241         else
1242                 sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old_id.id);
1243
1244         if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) {
1245
1246                 if (isempty(old_owner))
1247                         return 0;
1248
1249                 new_owner[0] = 0;
1250         } else
1251                 sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new_id.id);
1252
1253         return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner, ts);
1254 }
1255
1256 static int translate_id_change(
1257                 sd_bus *bus,
1258                 const struct kdbus_msg *k,
1259                 const struct kdbus_item *d,
1260                 const struct kdbus_timestamp *ts) {
1261
1262         char owner[UNIQUE_NAME_MAX];
1263
1264         assert(bus);
1265         assert(k);
1266         assert(d);
1267
1268         sprintf(owner, ":1.%llu", d->id_change.id);
1269
1270         return push_name_owner_changed(
1271                         bus, owner,
1272                         d->type == KDBUS_ITEM_ID_ADD ? NULL : owner,
1273                         d->type == KDBUS_ITEM_ID_ADD ? owner : NULL,
1274                         ts);
1275 }
1276
1277 static int translate_reply(
1278                 sd_bus *bus,
1279                 const struct kdbus_msg *k,
1280                 const struct kdbus_item *d,
1281                 const struct kdbus_timestamp *ts) {
1282
1283         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
1284         int r;
1285
1286         assert(bus);
1287         assert(k);
1288         assert(d);
1289
1290         r = bus_message_new_synthetic_error(
1291                         bus,
1292                         k->cookie_reply,
1293                         d->type == KDBUS_ITEM_REPLY_TIMEOUT ?
1294                         &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out") :
1295                         &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call peer died"),
1296                         &m);
1297         if (r < 0)
1298                 return r;
1299
1300         message_set_timestamp(bus, m, ts);
1301
1302         r = bus_seal_synthetic_message(bus, m);
1303         if (r < 0)
1304                 return r;
1305
1306         bus->rqueue[bus->rqueue_size++] = m;
1307         m = NULL;
1308
1309         return 1;
1310 }
1311
1312 static int bus_kernel_translate_message(sd_bus *bus, struct kdbus_msg *k) {
1313         static int (* const translate[])(sd_bus *bus, const struct kdbus_msg *k, const struct kdbus_item *d, const struct kdbus_timestamp *ts) = {
1314                 [KDBUS_ITEM_NAME_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1315                 [KDBUS_ITEM_NAME_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1316                 [KDBUS_ITEM_NAME_CHANGE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1317
1318                 [KDBUS_ITEM_ID_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
1319                 [KDBUS_ITEM_ID_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
1320
1321                 [KDBUS_ITEM_REPLY_TIMEOUT - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
1322                 [KDBUS_ITEM_REPLY_DEAD - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
1323         };
1324
1325         struct kdbus_item *d, *found = NULL;
1326         struct kdbus_timestamp *ts = NULL;
1327
1328         assert(bus);
1329         assert(k);
1330         assert(k->payload_type == KDBUS_PAYLOAD_KERNEL);
1331
1332         KDBUS_ITEM_FOREACH(d, k, items) {
1333                 if (d->type == KDBUS_ITEM_TIMESTAMP)
1334                         ts = &d->timestamp;
1335
1336                 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         } else if (k->payload_type == KDBUS_PAYLOAD_KERNEL)
1389                 r = bus_kernel_translate_message(bus, k);
1390         else {
1391                 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
1392                 r = 0;
1393         }
1394
1395         if (r <= 0)
1396                 close_kdbus_msg(bus, k);
1397
1398         return r < 0 ? r : 1;
1399 }
1400
1401 int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *allocated) {
1402         struct memfd_cache *c;
1403         int fd;
1404
1405         assert(address);
1406         assert(mapped);
1407         assert(allocated);
1408
1409         if (!bus || !bus->is_kernel)
1410                 return -EOPNOTSUPP;
1411
1412         assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
1413
1414         if (bus->n_memfd_cache <= 0) {
1415                 int r;
1416
1417                 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1418
1419                 r = memfd_new(bus->description);
1420                 if (r < 0)
1421                         return r;
1422
1423                 *address = NULL;
1424                 *mapped = 0;
1425                 *allocated = 0;
1426                 return r;
1427         }
1428
1429         c = &bus->memfd_cache[--bus->n_memfd_cache];
1430
1431         assert(c->fd >= 0);
1432         assert(c->mapped == 0 || c->address);
1433
1434         *address = c->address;
1435         *mapped = c->mapped;
1436         *allocated = c->allocated;
1437         fd = c->fd;
1438
1439         assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1440
1441         return fd;
1442 }
1443
1444 static void close_and_munmap(int fd, void *address, size_t size) {
1445         if (size > 0)
1446                 assert_se(munmap(address, PAGE_ALIGN(size)) >= 0);
1447
1448         safe_close(fd);
1449 }
1450
1451 void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t mapped, size_t allocated) {
1452         struct memfd_cache *c;
1453         uint64_t max_mapped = PAGE_ALIGN(MEMFD_CACHE_ITEM_SIZE_MAX);
1454
1455         assert(fd >= 0);
1456         assert(mapped == 0 || address);
1457
1458         if (!bus || !bus->is_kernel) {
1459                 close_and_munmap(fd, address, mapped);
1460                 return;
1461         }
1462
1463         assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
1464
1465         if (bus->n_memfd_cache >= ELEMENTSOF(bus->memfd_cache)) {
1466                 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1467
1468                 close_and_munmap(fd, address, mapped);
1469                 return;
1470         }
1471
1472         c = &bus->memfd_cache[bus->n_memfd_cache++];
1473         c->fd = fd;
1474         c->address = address;
1475
1476         /* If overly long, let's return a bit to the OS */
1477         if (mapped > max_mapped) {
1478                 assert_se(memfd_set_size(fd, max_mapped) >= 0);
1479                 assert_se(munmap((uint8_t*) address + max_mapped, PAGE_ALIGN(mapped - max_mapped)) >= 0);
1480                 c->mapped = c->allocated = max_mapped;
1481         } else {
1482                 c->mapped = mapped;
1483                 c->allocated = allocated;
1484         }
1485
1486         assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1487 }
1488
1489 void bus_kernel_flush_memfd(sd_bus *b) {
1490         unsigned i;
1491
1492         assert(b);
1493
1494         for (i = 0; i < b->n_memfd_cache; i++)
1495                 close_and_munmap(b->memfd_cache[i].fd, b->memfd_cache[i].address, b->memfd_cache[i].mapped);
1496 }
1497
1498 uint64_t request_name_flags_to_kdbus(uint64_t flags) {
1499         uint64_t f = 0;
1500
1501         if (flags & SD_BUS_NAME_ALLOW_REPLACEMENT)
1502                 f |= KDBUS_NAME_ALLOW_REPLACEMENT;
1503
1504         if (flags & SD_BUS_NAME_REPLACE_EXISTING)
1505                 f |= KDBUS_NAME_REPLACE_EXISTING;
1506
1507         if (flags & SD_BUS_NAME_QUEUE)
1508                 f |= KDBUS_NAME_QUEUE;
1509
1510         return f;
1511 }
1512
1513 uint64_t attach_flags_to_kdbus(uint64_t mask) {
1514         uint64_t m = 0;
1515
1516         if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID|
1517                     SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID))
1518                 m |= KDBUS_ATTACH_CREDS;
1519
1520         if (mask & (SD_BUS_CREDS_PID|SD_BUS_CREDS_TID|SD_BUS_CREDS_PPID))
1521                 m |= KDBUS_ATTACH_PIDS;
1522
1523         if (mask & SD_BUS_CREDS_COMM)
1524                 m |= KDBUS_ATTACH_PID_COMM;
1525
1526         if (mask & SD_BUS_CREDS_TID_COMM)
1527                 m |= KDBUS_ATTACH_TID_COMM;
1528
1529         if (mask & SD_BUS_CREDS_EXE)
1530                 m |= KDBUS_ATTACH_EXE;
1531
1532         if (mask & SD_BUS_CREDS_CMDLINE)
1533                 m |= KDBUS_ATTACH_CMDLINE;
1534
1535         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))
1536                 m |= KDBUS_ATTACH_CGROUP;
1537
1538         if (mask & (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS))
1539                 m |= KDBUS_ATTACH_CAPS;
1540
1541         if (mask & SD_BUS_CREDS_SELINUX_CONTEXT)
1542                 m |= KDBUS_ATTACH_SECLABEL;
1543
1544         if (mask & (SD_BUS_CREDS_AUDIT_SESSION_ID|SD_BUS_CREDS_AUDIT_LOGIN_UID))
1545                 m |= KDBUS_ATTACH_AUDIT;
1546
1547         if (mask & SD_BUS_CREDS_WELL_KNOWN_NAMES)
1548                 m |= KDBUS_ATTACH_NAMES;
1549
1550         if (mask & SD_BUS_CREDS_DESCRIPTION)
1551                 m |= KDBUS_ATTACH_CONN_DESCRIPTION;
1552
1553         if (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS)
1554                 m |= KDBUS_ATTACH_AUXGROUPS;
1555
1556         return m;
1557 }
1558
1559 int bus_kernel_create_bus(const char *name, bool world, char **s) {
1560         struct kdbus_cmd *make;
1561         struct kdbus_item *n;
1562         size_t l;
1563         int fd;
1564
1565         assert(name);
1566         assert(s);
1567
1568         fd = open("/sys/fs/kdbus/control", O_RDWR|O_NOCTTY|O_CLOEXEC);
1569         if (fd < 0)
1570                 return -errno;
1571
1572         l = strlen(name);
1573         make = alloca0_align(offsetof(struct kdbus_cmd, items) +
1574                              ALIGN8(offsetof(struct kdbus_item, bloom_parameter) + sizeof(struct kdbus_bloom_parameter)) +
1575                              ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)) +
1576                              ALIGN8(offsetof(struct kdbus_item, str) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1),
1577                              8);
1578
1579         make->size = offsetof(struct kdbus_cmd, items);
1580
1581         /* Set the bloom parameters */
1582         n = make->items;
1583         n->size = offsetof(struct kdbus_item, bloom_parameter) +
1584                   sizeof(struct kdbus_bloom_parameter);
1585         n->type = KDBUS_ITEM_BLOOM_PARAMETER;
1586         n->bloom_parameter.size = DEFAULT_BLOOM_SIZE;
1587         n->bloom_parameter.n_hash = DEFAULT_BLOOM_N_HASH;
1588
1589         assert_cc(DEFAULT_BLOOM_SIZE > 0);
1590         assert_cc(DEFAULT_BLOOM_N_HASH > 0);
1591
1592         make->size += ALIGN8(n->size);
1593
1594         /* Provide all metadata via bus-owner queries */
1595         n = KDBUS_ITEM_NEXT(n);
1596         n->type = KDBUS_ITEM_ATTACH_FLAGS_SEND;
1597         n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
1598         n->data64[0] = _KDBUS_ATTACH_ANY;
1599         make->size += ALIGN8(n->size);
1600
1601         /* Set the a good name */
1602         n = KDBUS_ITEM_NEXT(n);
1603         sprintf(n->str, UID_FMT "-%s", getuid(), name);
1604         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1605         n->type = KDBUS_ITEM_MAKE_NAME;
1606         make->size += ALIGN8(n->size);
1607
1608         make->flags = world ? KDBUS_MAKE_ACCESS_WORLD : 0;
1609
1610         if (ioctl(fd, KDBUS_CMD_BUS_MAKE, make) < 0) {
1611                 safe_close(fd);
1612
1613                 /* Major API change? then the ioctls got shuffled around. */
1614                 if (errno == ENOTTY)
1615                         return -ESOCKTNOSUPPORT;
1616
1617                 return -errno;
1618         }
1619
1620         if (s) {
1621                 char *p;
1622
1623                 p = strjoin("/sys/fs/kdbus/", n->str, "/bus", NULL);
1624                 if (!p) {
1625                         safe_close(fd);
1626                         return -ENOMEM;
1627                 }
1628
1629                 *s = p;
1630         }
1631
1632         return fd;
1633 }
1634
1635 int bus_kernel_open_bus_fd(const char *bus, char **path) {
1636         char *p;
1637         int fd;
1638         size_t len;
1639
1640         assert(bus);
1641
1642         len = strlen("/sys/fs/kdbus/") + DECIMAL_STR_MAX(uid_t) + 1 + strlen(bus) + strlen("/bus") + 1;
1643
1644         if (path) {
1645                 p = new(char, len);
1646                 if (!p)
1647                         return -ENOMEM;
1648         } else
1649                 p = newa(char, len);
1650
1651         sprintf(p, "/sys/fs/kdbus/" UID_FMT "-%s/bus", getuid(), bus);
1652
1653         fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC);
1654         if (fd < 0) {
1655                 if (path)
1656                         free(p);
1657
1658                 return -errno;
1659         }
1660
1661         if (path)
1662                 *path = p;
1663
1664         return fd;
1665 }
1666
1667 int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char **ep_path) {
1668         _cleanup_free_ char *path = NULL;
1669         struct kdbus_cmd *make;
1670         struct kdbus_item *n;
1671         const char *name;
1672         int fd;
1673
1674         fd = bus_kernel_open_bus_fd(bus_name, &path);
1675         if (fd < 0)
1676                 return fd;
1677
1678         make = alloca0_align(ALIGN8(offsetof(struct kdbus_cmd, items)) +
1679                              ALIGN8(offsetof(struct kdbus_item, str) + DECIMAL_STR_MAX(uid_t) + 1 + strlen(ep_name) + 1),
1680                              8);
1681         make->size = ALIGN8(offsetof(struct kdbus_cmd, items));
1682         make->flags = KDBUS_MAKE_ACCESS_WORLD;
1683
1684         n = make->items;
1685         sprintf(n->str, UID_FMT "-%s", getuid(), ep_name);
1686         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1687         n->type = KDBUS_ITEM_MAKE_NAME;
1688         make->size += ALIGN8(n->size);
1689         name = n->str;
1690
1691         if (ioctl(fd, KDBUS_CMD_ENDPOINT_MAKE, make) < 0) {
1692                 safe_close(fd);
1693                 return -errno;
1694         }
1695
1696         if (ep_path) {
1697                 char *p;
1698
1699                 p = strjoin(dirname(path), "/", name, NULL);
1700                 if (!p) {
1701                         safe_close(fd);
1702                         return -ENOMEM;
1703                 }
1704
1705                 *ep_path = p;
1706         }
1707
1708         return fd;
1709 }
1710
1711 int bus_kernel_try_close(sd_bus *bus) {
1712         struct kdbus_cmd byebye = { .size = sizeof(byebye) };
1713
1714         assert(bus);
1715         assert(bus->is_kernel);
1716
1717         if (ioctl(bus->input_fd, KDBUS_CMD_BYEBYE, &byebye) < 0)
1718                 return -errno;
1719
1720         return 0;
1721 }
1722
1723 int bus_kernel_drop_one(int fd) {
1724         struct kdbus_cmd_recv recv = {
1725                 .size = sizeof(recv),
1726                 .flags = KDBUS_RECV_DROP,
1727         };
1728
1729         assert(fd >= 0);
1730
1731         if (ioctl(fd, KDBUS_CMD_RECV, &recv) < 0)
1732                 return -errno;
1733
1734         return 0;
1735 }
1736
1737 int bus_kernel_realize_attach_flags(sd_bus *bus) {
1738         struct kdbus_cmd *update;
1739         struct kdbus_item *n;
1740
1741         assert(bus);
1742         assert(bus->is_kernel);
1743
1744         update = alloca0_align(offsetof(struct kdbus_cmd, items) +
1745                                ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)),
1746                                8);
1747
1748         n = update->items;
1749         n->type = KDBUS_ITEM_ATTACH_FLAGS_RECV;
1750         n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
1751         n->data64[0] = bus->attach_flags;
1752
1753         update->size =
1754                 offsetof(struct kdbus_cmd, items) +
1755                 ALIGN8(n->size);
1756
1757         if (ioctl(bus->input_fd, KDBUS_CMD_UPDATE, update) < 0)
1758                 return -errno;
1759
1760         return 0;
1761 }
1762
1763 int bus_kernel_get_bus_name(sd_bus *bus, char **name) {
1764         struct kdbus_cmd_info cmd = {
1765                 .size = sizeof(struct kdbus_cmd_info),
1766         };
1767         struct kdbus_info *info;
1768         struct kdbus_item *item;
1769         char *n = NULL;
1770         int r;
1771
1772         assert(bus);
1773         assert(name);
1774         assert(bus->is_kernel);
1775
1776         r = ioctl(bus->input_fd, KDBUS_CMD_BUS_CREATOR_INFO, &cmd);
1777         if (r < 0)
1778                 return -errno;
1779
1780         info = (struct kdbus_info*) ((uint8_t*) bus->kdbus_buffer + cmd.offset);
1781
1782         KDBUS_ITEM_FOREACH(item, info, items)
1783                 if (item->type == KDBUS_ITEM_MAKE_NAME) {
1784                         r = free_and_strdup(&n, item->str);
1785                         break;
1786                 }
1787
1788         bus_kernel_cmd_free(bus, cmd.offset);
1789
1790         if (r < 0)
1791                 return r;
1792         if (!n)
1793                 return -EIO;
1794
1795         *name = n;
1796         return 0;
1797 }