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