chiark / gitweb /
bus-util: print correct warnings for units that fail but for which we have a NULL...
[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                         NULL,
502                         seclabel, 0, &m);
503         if (r < 0)
504                 return r;
505
506         /* The well-known names list is different from the other
507         credentials. If we asked for it, but nothing is there, this
508         means that the list of well-known names is simply empty, not
509         that we lack any data */
510
511         m->creds.mask |= (SD_BUS_CREDS_UNIQUE_NAME|SD_BUS_CREDS_WELL_KNOWN_NAMES) & bus->creds_mask;
512
513         KDBUS_ITEM_FOREACH(d, k, items) {
514                 size_t l;
515
516                 l = d->size - offsetof(struct kdbus_item, data);
517
518                 switch (d->type) {
519
520                 case KDBUS_ITEM_PAYLOAD_OFF: {
521                         size_t begin_body;
522
523                         begin_body = BUS_MESSAGE_BODY_BEGIN(m);
524
525                         if (idx + d->vec.size > begin_body) {
526                                 struct bus_body_part *part;
527
528                                 /* Contains body material */
529
530                                 part = message_append_part(m);
531                                 if (!part) {
532                                         r = -ENOMEM;
533                                         goto fail;
534                                 }
535
536                                 /* A -1 offset is NUL padding. */
537                                 part->is_zero = d->vec.offset == ~0ULL;
538
539                                 if (idx >= begin_body) {
540                                         if (!part->is_zero)
541                                                 part->data = (uint8_t* )k + d->vec.offset;
542                                         part->size = d->vec.size;
543                                 } else {
544                                         if (!part->is_zero)
545                                                 part->data = (uint8_t*) k + d->vec.offset + (begin_body - idx);
546                                         part->size = d->vec.size - (begin_body - idx);
547                                 }
548
549                                 part->sealed = true;
550                         }
551
552                         idx += d->vec.size;
553                         break;
554                 }
555
556                 case KDBUS_ITEM_PAYLOAD_MEMFD: {
557                         struct bus_body_part *part;
558
559                         if (idx < BUS_MESSAGE_BODY_BEGIN(m)) {
560                                 r = -EBADMSG;
561                                 goto fail;
562                         }
563
564                         part = message_append_part(m);
565                         if (!part) {
566                                 r = -ENOMEM;
567                                 goto fail;
568                         }
569
570                         part->memfd = d->memfd.fd;
571                         part->memfd_offset = d->memfd.start;
572                         part->size = d->memfd.size;
573                         part->sealed = true;
574
575                         idx += d->memfd.size;
576                         break;
577                 }
578
579                 case KDBUS_ITEM_PIDS:
580
581                         /* The PID/TID might be missing, when the data
582                          * is faked by a bus proxy and it lacks that
583                          * information about the real client (since
584                          * SO_PEERCRED is used for that). Also kernel
585                          * namespacing might make some of this data
586                          * unavailable when untranslatable. */
587
588                         if (d->pids.pid > 0) {
589                                 m->creds.pid = (pid_t) d->pids.pid;
590                                 m->creds.mask |= SD_BUS_CREDS_PID & bus->creds_mask;
591                         }
592
593                         if (d->pids.tid > 0) {
594                                 m->creds.tid = (pid_t) d->pids.tid;
595                                 m->creds.mask |= SD_BUS_CREDS_TID & bus->creds_mask;
596                         }
597
598                         if (d->pids.ppid > 0) {
599                                 m->creds.ppid = (pid_t) d->pids.ppid;
600                                 m->creds.mask |= SD_BUS_CREDS_PPID & bus->creds_mask;
601                         }
602
603                         break;
604
605                 case KDBUS_ITEM_CREDS:
606
607                         /* EUID/SUID/FSUID/EGID/SGID/FSGID might be
608                          * missing too (see above). */
609
610                         if ((uid_t) d->creds.uid != UID_INVALID) {
611                                 m->creds.uid = (uid_t) d->creds.uid;
612                                 m->creds.mask |= SD_BUS_CREDS_UID & bus->creds_mask;
613                         }
614
615                         if ((uid_t) d->creds.euid != UID_INVALID) {
616                                 m->creds.euid = (uid_t) d->creds.euid;
617                                 m->creds.mask |= SD_BUS_CREDS_EUID & bus->creds_mask;
618                         }
619
620                         if ((uid_t) d->creds.suid != UID_INVALID) {
621                                 m->creds.suid = (uid_t) d->creds.suid;
622                                 m->creds.mask |= SD_BUS_CREDS_SUID & bus->creds_mask;
623                         }
624
625                         if ((uid_t) d->creds.fsuid != UID_INVALID) {
626                                 m->creds.fsuid = (uid_t) d->creds.fsuid;
627                                 m->creds.mask |= SD_BUS_CREDS_FSUID & bus->creds_mask;
628                         }
629
630                         if ((gid_t) d->creds.gid != GID_INVALID) {
631                                 m->creds.gid = (gid_t) d->creds.gid;
632                                 m->creds.mask |= SD_BUS_CREDS_GID & bus->creds_mask;
633                         }
634
635                         if ((gid_t) d->creds.egid != GID_INVALID) {
636                                 m->creds.egid = (gid_t) d->creds.egid;
637                                 m->creds.mask |= SD_BUS_CREDS_EGID & bus->creds_mask;
638                         }
639
640                         if ((gid_t) d->creds.sgid != GID_INVALID) {
641                                 m->creds.sgid = (gid_t) d->creds.sgid;
642                                 m->creds.mask |= SD_BUS_CREDS_SGID & bus->creds_mask;
643                         }
644
645                         if ((gid_t) d->creds.fsgid != GID_INVALID) {
646                                 m->creds.fsgid = (gid_t) d->creds.fsgid;
647                                 m->creds.mask |= SD_BUS_CREDS_FSGID & bus->creds_mask;
648                         }
649
650                         break;
651
652                 case KDBUS_ITEM_TIMESTAMP:
653                         message_set_timestamp(bus, m, &d->timestamp);
654                         break;
655
656                 case KDBUS_ITEM_PID_COMM:
657                         m->creds.comm = d->str;
658                         m->creds.mask |= SD_BUS_CREDS_COMM & bus->creds_mask;
659                         break;
660
661                 case KDBUS_ITEM_TID_COMM:
662                         m->creds.tid_comm = d->str;
663                         m->creds.mask |= SD_BUS_CREDS_TID_COMM & bus->creds_mask;
664                         break;
665
666                 case KDBUS_ITEM_EXE:
667                         m->creds.exe = d->str;
668                         m->creds.mask |= SD_BUS_CREDS_EXE & bus->creds_mask;
669                         break;
670
671                 case KDBUS_ITEM_CMDLINE:
672                         m->creds.cmdline = d->str;
673                         m->creds.cmdline_size = l;
674                         m->creds.mask |= SD_BUS_CREDS_CMDLINE & bus->creds_mask;
675                         break;
676
677                 case KDBUS_ITEM_CGROUP:
678                         m->creds.cgroup = d->str;
679                         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;
680
681                         r = bus_get_root_path(bus);
682                         if (r < 0)
683                                 goto fail;
684
685                         m->creds.cgroup_root = bus->cgroup_root;
686                         break;
687
688                 case KDBUS_ITEM_AUDIT:
689                         if ((uint32_t) d->audit.sessionid != (uint32_t) -1) {
690                                 m->creds.audit_session_id = (uint32_t) d->audit.sessionid;
691                                 m->creds.mask |= SD_BUS_CREDS_AUDIT_SESSION_ID & bus->creds_mask;
692                         }
693
694                         if ((uid_t) d->audit.loginuid != UID_INVALID) {
695                                 m->creds.audit_login_uid = (uid_t) d->audit.loginuid;
696                                 m->creds.mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID & bus->creds_mask;
697                         }
698                         break;
699
700                 case KDBUS_ITEM_CAPS:
701                         if (d->caps.last_cap != cap_last_cap() ||
702                             d->size - offsetof(struct kdbus_item, caps.caps) < DIV_ROUND_UP(d->caps.last_cap, 32U) * 4 * 4) {
703                                 r = -EBADMSG;
704                                 goto fail;
705                         }
706
707                         m->creds.capability = d->caps.caps;
708                         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;
709                         break;
710
711                 case KDBUS_ITEM_DST_NAME:
712                         if (!service_name_is_valid(d->str)) {
713                                 r = -EBADMSG;
714                                 goto fail;
715                         }
716
717                         destination = d->str;
718                         break;
719
720                 case KDBUS_ITEM_OWNED_NAME:
721                         if (!service_name_is_valid(d->name.name)) {
722                                 r = -EBADMSG;
723                                 goto fail;
724                         }
725
726                         if (bus->creds_mask & SD_BUS_CREDS_WELL_KNOWN_NAMES) {
727                                 char **wkn;
728                                 size_t n;
729
730                                 /* We just extend the array here, but
731                                  * do not allocate the strings inside
732                                  * of it, instead we just point to our
733                                  * buffer directly. */
734                                 n = strv_length(m->creds.well_known_names);
735                                 wkn = realloc(m->creds.well_known_names, (n + 2) * sizeof(char*));
736                                 if (!wkn) {
737                                         r = -ENOMEM;
738                                         goto fail;
739                                 }
740
741                                 wkn[n] = d->name.name;
742                                 wkn[n+1] = NULL;
743                                 m->creds.well_known_names = wkn;
744
745                                 m->creds.mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES;
746                         }
747                         break;
748
749                 case KDBUS_ITEM_CONN_DESCRIPTION:
750                         m->creds.description = d->str;
751                         m->creds.mask |= SD_BUS_CREDS_DESCRIPTION & bus->creds_mask;
752                         break;
753
754                 case KDBUS_ITEM_AUXGROUPS:
755
756                         if (bus->creds_mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
757                                 size_t i, n;
758                                 gid_t *g;
759
760                                 n = (d->size - offsetof(struct kdbus_item, data64)) / sizeof(uint64_t);
761                                 g = new(gid_t, n);
762                                 if (!g) {
763                                         r = -ENOMEM;
764                                         goto fail;
765                                 }
766
767                                 for (i = 0; i < n; i++)
768                                         g[i] = d->data64[i];
769
770                                 m->creds.supplementary_gids = g;
771                                 m->creds.n_supplementary_gids = n;
772                                 m->creds.mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS;
773                         }
774
775                         break;
776
777                 case KDBUS_ITEM_FDS:
778                 case KDBUS_ITEM_SECLABEL:
779                         break;
780
781                 default:
782                         log_debug("Got unknown field from kernel %llu", d->type);
783                 }
784         }
785
786         /* If we requested the list of well-known names to be appended
787          * and the sender had none no item for it will be
788          * attached. However, this does *not* mean that the kernel
789          * didn't want to provide this information to us. Hence, let's
790          * explicitly mark this information as available if it was
791          * requested. */
792         m->creds.mask |= bus->creds_mask & SD_BUS_CREDS_WELL_KNOWN_NAMES;
793
794         r = bus_message_parse_fields(m);
795         if (r < 0)
796                 goto fail;
797
798         /* Refuse messages if kdbus and dbus1 cookie doesn't match up */
799         if ((uint64_t) m->header->dbus2.cookie != k->cookie) {
800                 r = -EBADMSG;
801                 goto fail;
802         }
803
804         /* Refuse messages where the reply flag doesn't match up */
805         if (!(m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) != !!(k->flags & KDBUS_MSG_EXPECT_REPLY)) {
806                 r = -EBADMSG;
807                 goto fail;
808         }
809
810         /* Refuse reply messages where the reply cookie doesn't match up */
811         if ((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) && m->reply_cookie != k->cookie_reply) {
812                 r = -EBADMSG;
813                 goto fail;
814         }
815
816         /* Refuse messages where the autostart flag doesn't match up */
817         if (!(m->header->flags & BUS_MESSAGE_NO_AUTO_START) != !(k->flags & KDBUS_MSG_NO_AUTO_START)) {
818                 r = -EBADMSG;
819                 goto fail;
820         }
821
822         /* Override information from the user header with data from the kernel */
823         if (k->src_id == KDBUS_SRC_ID_KERNEL)
824                 bus_message_set_sender_driver(bus, m);
825         else {
826                 snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id);
827                 m->sender = m->creds.unique_name = m->sender_buffer;
828         }
829
830         if (destination)
831                 m->destination = destination;
832         else if (k->dst_id == KDBUS_DST_ID_BROADCAST)
833                 m->destination = NULL;
834         else if (k->dst_id == KDBUS_DST_ID_NAME)
835                 m->destination = bus->unique_name; /* fill in unique name if the well-known name is missing */
836         else {
837                 snprintf(m->destination_buffer, sizeof(m->destination_buffer), ":1.%llu", (unsigned long long) k->dst_id);
838                 m->destination = m->destination_buffer;
839         }
840
841         /* We take possession of the kmsg struct now */
842         m->kdbus = k;
843         m->release_kdbus = true;
844         m->free_fds = true;
845         fds = NULL;
846
847         bus->rqueue[bus->rqueue_size++] = m;
848
849         return 1;
850
851 fail:
852         unset_memfds(m);
853         sd_bus_message_unref(m);
854
855         return r;
856 }
857
858 int bus_kernel_take_fd(sd_bus *b) {
859         struct kdbus_bloom_parameter *bloom = NULL;
860         struct kdbus_item *items, *item;
861         struct kdbus_cmd_hello *hello;
862         _cleanup_free_ char *g = NULL;
863         const char *name;
864         size_t l = 0, m = 0, sz;
865         int r;
866
867         assert(b);
868
869         if (b->is_server)
870                 return -EINVAL;
871
872         b->use_memfd = 1;
873
874         if (b->description) {
875                 g = bus_label_escape(b->description);
876                 if (!g)
877                         return -ENOMEM;
878
879                 name = g;
880         } else {
881                 char pr[17] = {};
882
883                 /* If no name is explicitly set, we'll include a hint
884                  * indicating the library implementation, a hint which
885                  * kind of bus this is and the thread name */
886
887                 assert_se(prctl(PR_GET_NAME, (unsigned long) pr) >= 0);
888
889                 if (isempty(pr)) {
890                         name = b->is_system ? "sd-system" :
891                                 b->is_user ? "sd-user" : "sd";
892                 } else {
893                         _cleanup_free_ char *e = NULL;
894
895                         e = bus_label_escape(pr);
896                         if (!e)
897                                 return -ENOMEM;
898
899                         g = strappend(b->is_system ? "sd-system-" :
900                                       b->is_user ? "sd-user-" : "sd-",
901                                       e);
902                         if (!g)
903                                 return -ENOMEM;
904
905                         name = g;
906                 }
907
908                 b->description = bus_label_unescape(name);
909                 if (!b->description)
910                         return -ENOMEM;
911         }
912
913         m = strlen(name);
914
915         sz = ALIGN8(offsetof(struct kdbus_cmd_hello, items)) +
916                 ALIGN8(offsetof(struct kdbus_item, str) + m + 1);
917
918         if (b->fake_creds_valid)
919                 sz += ALIGN8(offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds));
920
921         if (b->fake_pids_valid)
922                 sz += ALIGN8(offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids));
923
924         if (b->fake_label) {
925                 l = strlen(b->fake_label);
926                 sz += ALIGN8(offsetof(struct kdbus_item, str) + l + 1);
927         }
928
929         hello = alloca0_align(sz, 8);
930         hello->size = sz;
931         hello->flags = b->hello_flags;
932         hello->attach_flags_send = _KDBUS_ATTACH_ANY;
933         hello->attach_flags_recv = b->attach_flags;
934         hello->pool_size = KDBUS_POOL_SIZE;
935
936         item = hello->items;
937
938         item->size = offsetof(struct kdbus_item, str) + m + 1;
939         item->type = KDBUS_ITEM_CONN_DESCRIPTION;
940         memcpy(item->str, name, m + 1);
941         item = KDBUS_ITEM_NEXT(item);
942
943         if (b->fake_creds_valid) {
944                 item->size = offsetof(struct kdbus_item, creds) + sizeof(struct kdbus_creds);
945                 item->type = KDBUS_ITEM_CREDS;
946                 item->creds = b->fake_creds;
947
948                 item = KDBUS_ITEM_NEXT(item);
949         }
950
951         if (b->fake_pids_valid) {
952                 item->size = offsetof(struct kdbus_item, pids) + sizeof(struct kdbus_pids);
953                 item->type = KDBUS_ITEM_PIDS;
954                 item->pids = b->fake_pids;
955
956                 item = KDBUS_ITEM_NEXT(item);
957         }
958
959         if (b->fake_label) {
960                 item->size = offsetof(struct kdbus_item, str) + l + 1;
961                 item->type = KDBUS_ITEM_SECLABEL;
962                 memcpy(item->str, b->fake_label, l+1);
963         }
964
965         r = ioctl(b->input_fd, KDBUS_CMD_HELLO, hello);
966         if (r < 0)
967                 return -errno;
968
969         if (!b->kdbus_buffer) {
970                 b->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, b->input_fd, 0);
971                 if (b->kdbus_buffer == MAP_FAILED) {
972                         b->kdbus_buffer = NULL;
973                         r = -errno;
974                         goto fail;
975                 }
976         }
977
978         /* The higher 32bit of the bus_flags fields are considered
979          * 'incompatible flags'. Refuse them all for now. */
980         if (hello->bus_flags > 0xFFFFFFFFULL) {
981                 r = -EOPNOTSUPP;
982                 goto fail;
983         }
984
985         /* extract bloom parameters from items */
986         items = (void*)((uint8_t*)b->kdbus_buffer + hello->offset);
987         KDBUS_FOREACH(item, items, hello->items_size) {
988                 switch (item->type) {
989                 case KDBUS_ITEM_BLOOM_PARAMETER:
990                         bloom = &item->bloom_parameter;
991                         break;
992                 }
993         }
994
995         if (!bloom || !bloom_validate_parameters((size_t) bloom->size, (unsigned) bloom->n_hash)) {
996                 r = -EOPNOTSUPP;
997                 goto fail;
998         }
999
1000         b->bloom_size = (size_t) bloom->size;
1001         b->bloom_n_hash = (unsigned) bloom->n_hash;
1002
1003         if (asprintf(&b->unique_name, ":1.%llu", (unsigned long long) hello->id) < 0) {
1004                 r = -ENOMEM;
1005                 goto fail;
1006         }
1007
1008         b->unique_id = hello->id;
1009
1010         b->is_kernel = true;
1011         b->bus_client = true;
1012         b->can_fds = !!(hello->flags & KDBUS_HELLO_ACCEPT_FD);
1013         b->message_version = 2;
1014         b->message_endian = BUS_NATIVE_ENDIAN;
1015
1016         /* the kernel told us the UUID of the underlying bus */
1017         memcpy(b->server_id.bytes, hello->id128, sizeof(b->server_id.bytes));
1018
1019         /* free returned items */
1020         (void) bus_kernel_cmd_free(b, hello->offset);
1021         return bus_start_running(b);
1022
1023 fail:
1024         (void) bus_kernel_cmd_free(b, hello->offset);
1025         return r;
1026 }
1027
1028 int bus_kernel_connect(sd_bus *b) {
1029         assert(b);
1030         assert(b->input_fd < 0);
1031         assert(b->output_fd < 0);
1032         assert(b->kernel);
1033
1034         if (b->is_server)
1035                 return -EINVAL;
1036
1037         b->input_fd = open(b->kernel, O_RDWR|O_NOCTTY|O_CLOEXEC);
1038         if (b->input_fd < 0)
1039                 return -errno;
1040
1041         b->output_fd = b->input_fd;
1042
1043         return bus_kernel_take_fd(b);
1044 }
1045
1046 int bus_kernel_cmd_free(sd_bus *bus, uint64_t offset) {
1047         struct kdbus_cmd_free cmd = {
1048                 .size = sizeof(cmd),
1049                 .offset = offset,
1050         };
1051         int r;
1052
1053         assert(bus);
1054         assert(bus->is_kernel);
1055
1056         r = ioctl(bus->input_fd, KDBUS_CMD_FREE, &cmd);
1057         if (r < 0)
1058                 return -errno;
1059
1060         return 0;
1061 }
1062
1063 static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
1064         struct kdbus_item *d;
1065
1066         assert(bus);
1067         assert(k);
1068
1069         KDBUS_ITEM_FOREACH(d, k, items) {
1070                 if (d->type == KDBUS_ITEM_FDS)
1071                         close_many(d->fds, (d->size - offsetof(struct kdbus_item, fds)) / sizeof(int));
1072                 else if (d->type == KDBUS_ITEM_PAYLOAD_MEMFD)
1073                         safe_close(d->memfd.fd);
1074         }
1075
1076         bus_kernel_cmd_free(bus, (uint8_t*) k - (uint8_t*) bus->kdbus_buffer);
1077 }
1078
1079 int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call) {
1080         struct kdbus_cmd_send cmd = { };
1081         int r;
1082
1083         assert(bus);
1084         assert(m);
1085         assert(bus->state == BUS_RUNNING);
1086
1087         /* If we can't deliver, we want room for the error message */
1088         r = bus_rqueue_make_room(bus);
1089         if (r < 0)
1090                 return r;
1091
1092         r = bus_message_setup_kmsg(bus, m);
1093         if (r < 0)
1094                 return r;
1095
1096         cmd.size = sizeof(cmd);
1097         cmd.msg_address = (uintptr_t)m->kdbus;
1098
1099         /* If this is a synchronous method call, then let's tell the
1100          * kernel, so that it can pass CPU time/scheduling to the
1101          * destination for the time, if it wants to. If we
1102          * synchronously wait for the result anyway, we won't need CPU
1103          * anyway. */
1104         if (hint_sync_call) {
1105                 m->kdbus->flags |= KDBUS_MSG_EXPECT_REPLY;
1106                 cmd.flags |= KDBUS_SEND_SYNC_REPLY;
1107         }
1108
1109         r = ioctl(bus->output_fd, KDBUS_CMD_SEND, &cmd);
1110         if (r < 0) {
1111                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
1112                 sd_bus_message *reply;
1113
1114                 if (errno == EAGAIN || errno == EINTR)
1115                         return 0;
1116                 else if (errno == ENXIO || errno == ESRCH) {
1117
1118                         /* ENXIO: unique name not known
1119                          * ESRCH: well-known name not known */
1120
1121                         if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
1122                                 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Destination %s not known", m->destination);
1123                         else {
1124                                 log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m->destination);
1125                                 return 0;
1126                         }
1127
1128                 } else if (errno == EADDRNOTAVAIL) {
1129
1130                         /* EADDRNOTAVAIL: activation is possible, but turned off in request flags */
1131
1132                         if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
1133                                 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Activation of %s not requested", m->destination);
1134                         else {
1135                                 log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m->destination);
1136                                 return 0;
1137                         }
1138                 } else
1139                         return -errno;
1140
1141                 r = bus_message_new_synthetic_error(
1142                                 bus,
1143                                 BUS_MESSAGE_COOKIE(m),
1144                                 &error,
1145                                 &reply);
1146
1147                 if (r < 0)
1148                         return r;
1149
1150                 r = bus_seal_synthetic_message(bus, reply);
1151                 if (r < 0)
1152                         return r;
1153
1154                 bus->rqueue[bus->rqueue_size++] = reply;
1155
1156         } else if (hint_sync_call) {
1157                 struct kdbus_msg *k;
1158
1159                 k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + cmd.reply.offset);
1160                 assert(k);
1161
1162                 if (k->payload_type == KDBUS_PAYLOAD_DBUS) {
1163
1164                         r = bus_kernel_make_message(bus, k);
1165                         if (r < 0) {
1166                                 close_kdbus_msg(bus, k);
1167
1168                                 /* Anybody can send us invalid messages, let's just drop them. */
1169                                 if (r == -EBADMSG || r == -EPROTOTYPE)
1170                                         log_debug_errno(r, "Ignoring invalid synchronous reply: %m");
1171                                 else
1172                                         return r;
1173                         }
1174                 } else {
1175                         log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
1176                         close_kdbus_msg(bus, k);
1177                 }
1178         }
1179
1180         return 1;
1181 }
1182
1183 static int push_name_owner_changed(
1184                 sd_bus *bus,
1185                 const char *name,
1186                 const char *old_owner,
1187                 const char *new_owner,
1188                 const struct kdbus_timestamp *ts) {
1189
1190         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
1191         int r;
1192
1193         assert(bus);
1194
1195         r = sd_bus_message_new_signal(
1196                         bus,
1197                         &m,
1198                         "/org/freedesktop/DBus",
1199                         "org.freedesktop.DBus",
1200                         "NameOwnerChanged");
1201         if (r < 0)
1202                 return r;
1203
1204         r = sd_bus_message_append(m, "sss", name, old_owner, new_owner);
1205         if (r < 0)
1206                 return r;
1207
1208         bus_message_set_sender_driver(bus, m);
1209         message_set_timestamp(bus, m, ts);
1210
1211         r = bus_seal_synthetic_message(bus, m);
1212         if (r < 0)
1213                 return r;
1214
1215         bus->rqueue[bus->rqueue_size++] = m;
1216         m = NULL;
1217
1218         return 1;
1219 }
1220
1221 static int translate_name_change(
1222                 sd_bus *bus,
1223                 const struct kdbus_msg *k,
1224                 const struct kdbus_item *d,
1225                 const struct kdbus_timestamp *ts) {
1226
1227         char new_owner[UNIQUE_NAME_MAX], old_owner[UNIQUE_NAME_MAX];
1228
1229         assert(bus);
1230         assert(k);
1231         assert(d);
1232
1233         if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR)))
1234                 old_owner[0] = 0;
1235         else
1236                 sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old_id.id);
1237
1238         if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_id.flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) {
1239
1240                 if (isempty(old_owner))
1241                         return 0;
1242
1243                 new_owner[0] = 0;
1244         } else
1245                 sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new_id.id);
1246
1247         return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner, ts);
1248 }
1249
1250 static int translate_id_change(
1251                 sd_bus *bus,
1252                 const struct kdbus_msg *k,
1253                 const struct kdbus_item *d,
1254                 const struct kdbus_timestamp *ts) {
1255
1256         char owner[UNIQUE_NAME_MAX];
1257
1258         assert(bus);
1259         assert(k);
1260         assert(d);
1261
1262         sprintf(owner, ":1.%llu", d->id_change.id);
1263
1264         return push_name_owner_changed(
1265                         bus, owner,
1266                         d->type == KDBUS_ITEM_ID_ADD ? NULL : owner,
1267                         d->type == KDBUS_ITEM_ID_ADD ? owner : NULL,
1268                         ts);
1269 }
1270
1271 static int translate_reply(
1272                 sd_bus *bus,
1273                 const struct kdbus_msg *k,
1274                 const struct kdbus_item *d,
1275                 const struct kdbus_timestamp *ts) {
1276
1277         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
1278         int r;
1279
1280         assert(bus);
1281         assert(k);
1282         assert(d);
1283
1284         r = bus_message_new_synthetic_error(
1285                         bus,
1286                         k->cookie_reply,
1287                         d->type == KDBUS_ITEM_REPLY_TIMEOUT ?
1288                         &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out") :
1289                         &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call peer died"),
1290                         &m);
1291         if (r < 0)
1292                 return r;
1293
1294         message_set_timestamp(bus, m, ts);
1295
1296         r = bus_seal_synthetic_message(bus, m);
1297         if (r < 0)
1298                 return r;
1299
1300         bus->rqueue[bus->rqueue_size++] = m;
1301         m = NULL;
1302
1303         return 1;
1304 }
1305
1306 static int bus_kernel_translate_message(sd_bus *bus, struct kdbus_msg *k) {
1307         static int (* const translate[])(sd_bus *bus, const struct kdbus_msg *k, const struct kdbus_item *d, const struct kdbus_timestamp *ts) = {
1308                 [KDBUS_ITEM_NAME_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1309                 [KDBUS_ITEM_NAME_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1310                 [KDBUS_ITEM_NAME_CHANGE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
1311
1312                 [KDBUS_ITEM_ID_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
1313                 [KDBUS_ITEM_ID_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
1314
1315                 [KDBUS_ITEM_REPLY_TIMEOUT - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
1316                 [KDBUS_ITEM_REPLY_DEAD - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
1317         };
1318
1319         struct kdbus_item *d, *found = NULL;
1320         struct kdbus_timestamp *ts = NULL;
1321
1322         assert(bus);
1323         assert(k);
1324         assert(k->payload_type == KDBUS_PAYLOAD_KERNEL);
1325
1326         KDBUS_ITEM_FOREACH(d, k, items) {
1327                 if (d->type == KDBUS_ITEM_TIMESTAMP)
1328                         ts = &d->timestamp;
1329
1330                 if (d->type >= _KDBUS_ITEM_KERNEL_BASE && d->type < _KDBUS_ITEM_KERNEL_BASE + ELEMENTSOF(translate)) {
1331                         if (found)
1332                                 return -EBADMSG;
1333                         found = d;
1334                 } else
1335                         log_debug("Got unknown field from kernel %llu", d->type);
1336         }
1337
1338         if (!found) {
1339                 log_debug("Didn't find a kernel message to translate.");
1340                 return 0;
1341         }
1342
1343         return translate[found->type - _KDBUS_ITEM_KERNEL_BASE](bus, k, found, ts);
1344 }
1345
1346 int bus_kernel_read_message(sd_bus *bus, bool hint_priority, int64_t priority) {
1347         struct kdbus_cmd_recv recv = { .size = sizeof(recv) };
1348         struct kdbus_msg *k;
1349         int r;
1350
1351         assert(bus);
1352
1353         r = bus_rqueue_make_room(bus);
1354         if (r < 0)
1355                 return r;
1356
1357         if (hint_priority) {
1358                 recv.flags |= KDBUS_RECV_USE_PRIORITY;
1359                 recv.priority = priority;
1360         }
1361
1362         r = ioctl(bus->input_fd, KDBUS_CMD_RECV, &recv);
1363         if (recv.return_flags & KDBUS_RECV_RETURN_DROPPED_MSGS)
1364                 log_debug("%s: kdbus reports %" PRIu64 " dropped broadcast messages, ignoring.", strna(bus->description), (uint64_t) recv.dropped_msgs);
1365         if (r < 0) {
1366                 if (errno == EAGAIN)
1367                         return 0;
1368
1369                 return -errno;
1370         }
1371
1372         k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + recv.msg.offset);
1373         if (k->payload_type == KDBUS_PAYLOAD_DBUS) {
1374                 r = bus_kernel_make_message(bus, k);
1375
1376                 /* Anybody can send us invalid messages, let's just drop them. */
1377                 if (r == -EBADMSG || r == -EPROTOTYPE) {
1378                         log_debug_errno(r, "Ignoring invalid message: %m");
1379                         r = 0;
1380                 }
1381
1382         } else if (k->payload_type == KDBUS_PAYLOAD_KERNEL)
1383                 r = bus_kernel_translate_message(bus, k);
1384         else {
1385                 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k->payload_type);
1386                 r = 0;
1387         }
1388
1389         if (r <= 0)
1390                 close_kdbus_msg(bus, k);
1391
1392         return r < 0 ? r : 1;
1393 }
1394
1395 int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *allocated) {
1396         struct memfd_cache *c;
1397         int fd;
1398
1399         assert(address);
1400         assert(mapped);
1401         assert(allocated);
1402
1403         if (!bus || !bus->is_kernel)
1404                 return -EOPNOTSUPP;
1405
1406         assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
1407
1408         if (bus->n_memfd_cache <= 0) {
1409                 int r;
1410
1411                 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1412
1413                 r = memfd_new(bus->description);
1414                 if (r < 0)
1415                         return r;
1416
1417                 *address = NULL;
1418                 *mapped = 0;
1419                 *allocated = 0;
1420                 return r;
1421         }
1422
1423         c = &bus->memfd_cache[--bus->n_memfd_cache];
1424
1425         assert(c->fd >= 0);
1426         assert(c->mapped == 0 || c->address);
1427
1428         *address = c->address;
1429         *mapped = c->mapped;
1430         *allocated = c->allocated;
1431         fd = c->fd;
1432
1433         assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1434
1435         return fd;
1436 }
1437
1438 static void close_and_munmap(int fd, void *address, size_t size) {
1439         if (size > 0)
1440                 assert_se(munmap(address, PAGE_ALIGN(size)) >= 0);
1441
1442         safe_close(fd);
1443 }
1444
1445 void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t mapped, size_t allocated) {
1446         struct memfd_cache *c;
1447         uint64_t max_mapped = PAGE_ALIGN(MEMFD_CACHE_ITEM_SIZE_MAX);
1448
1449         assert(fd >= 0);
1450         assert(mapped == 0 || address);
1451
1452         if (!bus || !bus->is_kernel) {
1453                 close_and_munmap(fd, address, mapped);
1454                 return;
1455         }
1456
1457         assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
1458
1459         if (bus->n_memfd_cache >= ELEMENTSOF(bus->memfd_cache)) {
1460                 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1461
1462                 close_and_munmap(fd, address, mapped);
1463                 return;
1464         }
1465
1466         c = &bus->memfd_cache[bus->n_memfd_cache++];
1467         c->fd = fd;
1468         c->address = address;
1469
1470         /* If overly long, let's return a bit to the OS */
1471         if (mapped > max_mapped) {
1472                 assert_se(memfd_set_size(fd, max_mapped) >= 0);
1473                 assert_se(munmap((uint8_t*) address + max_mapped, PAGE_ALIGN(mapped - max_mapped)) >= 0);
1474                 c->mapped = c->allocated = max_mapped;
1475         } else {
1476                 c->mapped = mapped;
1477                 c->allocated = allocated;
1478         }
1479
1480         assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1481 }
1482
1483 void bus_kernel_flush_memfd(sd_bus *b) {
1484         unsigned i;
1485
1486         assert(b);
1487
1488         for (i = 0; i < b->n_memfd_cache; i++)
1489                 close_and_munmap(b->memfd_cache[i].fd, b->memfd_cache[i].address, b->memfd_cache[i].mapped);
1490 }
1491
1492 uint64_t request_name_flags_to_kdbus(uint64_t flags) {
1493         uint64_t f = 0;
1494
1495         if (flags & SD_BUS_NAME_ALLOW_REPLACEMENT)
1496                 f |= KDBUS_NAME_ALLOW_REPLACEMENT;
1497
1498         if (flags & SD_BUS_NAME_REPLACE_EXISTING)
1499                 f |= KDBUS_NAME_REPLACE_EXISTING;
1500
1501         if (flags & SD_BUS_NAME_QUEUE)
1502                 f |= KDBUS_NAME_QUEUE;
1503
1504         return f;
1505 }
1506
1507 uint64_t attach_flags_to_kdbus(uint64_t mask) {
1508         uint64_t m = 0;
1509
1510         if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_EUID|SD_BUS_CREDS_SUID|SD_BUS_CREDS_FSUID|
1511                     SD_BUS_CREDS_GID|SD_BUS_CREDS_EGID|SD_BUS_CREDS_SGID|SD_BUS_CREDS_FSGID))
1512                 m |= KDBUS_ATTACH_CREDS;
1513
1514         if (mask & (SD_BUS_CREDS_PID|SD_BUS_CREDS_TID|SD_BUS_CREDS_PPID))
1515                 m |= KDBUS_ATTACH_PIDS;
1516
1517         if (mask & SD_BUS_CREDS_COMM)
1518                 m |= KDBUS_ATTACH_PID_COMM;
1519
1520         if (mask & SD_BUS_CREDS_TID_COMM)
1521                 m |= KDBUS_ATTACH_TID_COMM;
1522
1523         if (mask & SD_BUS_CREDS_EXE)
1524                 m |= KDBUS_ATTACH_EXE;
1525
1526         if (mask & SD_BUS_CREDS_CMDLINE)
1527                 m |= KDBUS_ATTACH_CMDLINE;
1528
1529         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))
1530                 m |= KDBUS_ATTACH_CGROUP;
1531
1532         if (mask & (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS))
1533                 m |= KDBUS_ATTACH_CAPS;
1534
1535         if (mask & SD_BUS_CREDS_SELINUX_CONTEXT)
1536                 m |= KDBUS_ATTACH_SECLABEL;
1537
1538         if (mask & (SD_BUS_CREDS_AUDIT_SESSION_ID|SD_BUS_CREDS_AUDIT_LOGIN_UID))
1539                 m |= KDBUS_ATTACH_AUDIT;
1540
1541         if (mask & SD_BUS_CREDS_WELL_KNOWN_NAMES)
1542                 m |= KDBUS_ATTACH_NAMES;
1543
1544         if (mask & SD_BUS_CREDS_DESCRIPTION)
1545                 m |= KDBUS_ATTACH_CONN_DESCRIPTION;
1546
1547         if (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS)
1548                 m |= KDBUS_ATTACH_AUXGROUPS;
1549
1550         return m;
1551 }
1552
1553 int bus_kernel_create_bus(const char *name, bool world, char **s) {
1554         struct kdbus_cmd *make;
1555         struct kdbus_item *n;
1556         size_t l;
1557         int fd;
1558
1559         assert(name);
1560         assert(s);
1561
1562         fd = open("/sys/fs/kdbus/control", O_RDWR|O_NOCTTY|O_CLOEXEC);
1563         if (fd < 0)
1564                 return -errno;
1565
1566         l = strlen(name);
1567         make = alloca0_align(offsetof(struct kdbus_cmd, items) +
1568                              ALIGN8(offsetof(struct kdbus_item, bloom_parameter) + sizeof(struct kdbus_bloom_parameter)) +
1569                              ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)) +
1570                              ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)) +
1571                              ALIGN8(offsetof(struct kdbus_item, str) + DECIMAL_STR_MAX(uid_t) + 1 + l + 1),
1572                              8);
1573
1574         make->size = offsetof(struct kdbus_cmd, items);
1575
1576         /* Set the bloom parameters */
1577         n = make->items;
1578         n->size = offsetof(struct kdbus_item, bloom_parameter) +
1579                   sizeof(struct kdbus_bloom_parameter);
1580         n->type = KDBUS_ITEM_BLOOM_PARAMETER;
1581         n->bloom_parameter.size = DEFAULT_BLOOM_SIZE;
1582         n->bloom_parameter.n_hash = DEFAULT_BLOOM_N_HASH;
1583
1584         assert_cc(DEFAULT_BLOOM_SIZE > 0);
1585         assert_cc(DEFAULT_BLOOM_N_HASH > 0);
1586
1587         make->size += ALIGN8(n->size);
1588
1589         /* The busses we create make no restrictions on what metadata
1590          * peers can read from incoming messages. */
1591         n = KDBUS_ITEM_NEXT(n);
1592         n->type = KDBUS_ITEM_ATTACH_FLAGS_RECV;
1593         n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
1594         n->data64[0] = _KDBUS_ATTACH_ANY;
1595         make->size += ALIGN8(n->size);
1596
1597         /* Provide all metadata via bus-owner queries */
1598         n = KDBUS_ITEM_NEXT(n);
1599         n->type = KDBUS_ITEM_ATTACH_FLAGS_SEND;
1600         n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
1601         n->data64[0] = _KDBUS_ATTACH_ANY;
1602         make->size += ALIGN8(n->size);
1603
1604         /* Set the a good name */
1605         n = KDBUS_ITEM_NEXT(n);
1606         sprintf(n->str, UID_FMT "-%s", getuid(), name);
1607         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1608         n->type = KDBUS_ITEM_MAKE_NAME;
1609         make->size += ALIGN8(n->size);
1610
1611         make->flags = world ? KDBUS_MAKE_ACCESS_WORLD : 0;
1612
1613         if (ioctl(fd, KDBUS_CMD_BUS_MAKE, make) < 0) {
1614                 safe_close(fd);
1615                 return -errno;
1616         }
1617
1618         if (s) {
1619                 char *p;
1620
1621                 p = strjoin("/sys/fs/kdbus/", n->str, "/bus", NULL);
1622                 if (!p) {
1623                         safe_close(fd);
1624                         return -ENOMEM;
1625                 }
1626
1627                 *s = p;
1628         }
1629
1630         return fd;
1631 }
1632
1633 int bus_kernel_open_bus_fd(const char *bus, char **path) {
1634         char *p;
1635         int fd;
1636         size_t len;
1637
1638         assert(bus);
1639
1640         len = strlen("/sys/fs/kdbus/") + DECIMAL_STR_MAX(uid_t) + 1 + strlen(bus) + strlen("/bus") + 1;
1641
1642         if (path) {
1643                 p = new(char, len);
1644                 if (!p)
1645                         return -ENOMEM;
1646         } else
1647                 p = newa(char, len);
1648
1649         sprintf(p, "/sys/fs/kdbus/" UID_FMT "-%s/bus", getuid(), bus);
1650
1651         fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC);
1652         if (fd < 0) {
1653                 if (path)
1654                         free(p);
1655
1656                 return -errno;
1657         }
1658
1659         if (path)
1660                 *path = p;
1661
1662         return fd;
1663 }
1664
1665 int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char **ep_path) {
1666         _cleanup_free_ char *path = NULL;
1667         struct kdbus_cmd *make;
1668         struct kdbus_item *n;
1669         const char *name;
1670         int fd;
1671
1672         fd = bus_kernel_open_bus_fd(bus_name, &path);
1673         if (fd < 0)
1674                 return fd;
1675
1676         make = alloca0_align(ALIGN8(offsetof(struct kdbus_cmd, items)) +
1677                              ALIGN8(offsetof(struct kdbus_item, str) + DECIMAL_STR_MAX(uid_t) + 1 + strlen(ep_name) + 1),
1678                              8);
1679         make->size = ALIGN8(offsetof(struct kdbus_cmd, items));
1680         make->flags = KDBUS_MAKE_ACCESS_WORLD;
1681
1682         n = make->items;
1683         sprintf(n->str, UID_FMT "-%s", getuid(), ep_name);
1684         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1685         n->type = KDBUS_ITEM_MAKE_NAME;
1686         make->size += ALIGN8(n->size);
1687         name = n->str;
1688
1689         if (ioctl(fd, KDBUS_CMD_ENDPOINT_MAKE, make) < 0) {
1690                 safe_close(fd);
1691                 return -errno;
1692         }
1693
1694         if (ep_path) {
1695                 char *p;
1696
1697                 p = strjoin(dirname(path), "/", name, NULL);
1698                 if (!p) {
1699                         safe_close(fd);
1700                         return -ENOMEM;
1701                 }
1702
1703                 *ep_path = p;
1704         }
1705
1706         return fd;
1707 }
1708
1709 int bus_kernel_try_close(sd_bus *bus) {
1710         struct kdbus_cmd byebye = { .size = sizeof(byebye) };
1711
1712         assert(bus);
1713         assert(bus->is_kernel);
1714
1715         if (ioctl(bus->input_fd, KDBUS_CMD_BYEBYE, &byebye) < 0)
1716                 return -errno;
1717
1718         return 0;
1719 }
1720
1721 int bus_kernel_drop_one(int fd) {
1722         struct kdbus_cmd_recv recv = {
1723                 .size = sizeof(recv),
1724                 .flags = KDBUS_RECV_DROP,
1725         };
1726
1727         assert(fd >= 0);
1728
1729         if (ioctl(fd, KDBUS_CMD_RECV, &recv) < 0)
1730                 return -errno;
1731
1732         return 0;
1733 }
1734
1735 int bus_kernel_realize_attach_flags(sd_bus *bus) {
1736         struct kdbus_cmd *update;
1737         struct kdbus_item *n;
1738
1739         assert(bus);
1740         assert(bus->is_kernel);
1741
1742         update = alloca0_align(offsetof(struct kdbus_cmd, items) +
1743                                ALIGN8(offsetof(struct kdbus_item, data64) + sizeof(uint64_t)),
1744                                8);
1745
1746         n = update->items;
1747         n->type = KDBUS_ITEM_ATTACH_FLAGS_RECV;
1748         n->size = offsetof(struct kdbus_item, data64) + sizeof(uint64_t);
1749         n->data64[0] = bus->attach_flags;
1750
1751         update->size =
1752                 offsetof(struct kdbus_cmd, items) +
1753                 ALIGN8(n->size);
1754
1755         if (ioctl(bus->input_fd, KDBUS_CMD_UPDATE, update) < 0)
1756                 return -errno;
1757
1758         return 0;
1759 }
1760
1761 int bus_kernel_fix_attach_mask(void) {
1762         _cleanup_free_ char *mask = NULL;
1763         uint64_t m = (uint64_t) -1;
1764         char buf[2+16+2];
1765         int r;
1766
1767         /* By default we don't want any kdbus metadata fields to be
1768          * suppressed, hence we reset the kernel mask for it to
1769          * (uint64_t) -1. If the module argument was overwritten by
1770          * the kernel cmdline, we leave it as is. */
1771
1772         r = get_proc_cmdline_key("kdbus.attach_flags_mask=", &mask);
1773         if (r < 0)
1774                 return log_warning_errno(r, "Failed to read kernel command line: %m");
1775
1776         if (r == 0) {
1777                 sprintf(buf, "0x%" PRIx64 "\n", m);
1778                 r = write_string_file("/sys/module/kdbus/parameters/attach_flags_mask", buf);
1779                 if (r < 0)
1780                         return log_full_errno(IN_SET(r, -ENOENT, -EROFS) ? LOG_DEBUG : LOG_WARNING, r,
1781                                               "Failed to write kdbus attach mask: %m");
1782         }
1783
1784         return 0;
1785 }
1786
1787 int bus_kernel_get_bus_name(sd_bus *bus, char **name) {
1788         struct kdbus_cmd_info cmd = {
1789                 .size = sizeof(struct kdbus_cmd_info),
1790         };
1791         struct kdbus_info *info;
1792         struct kdbus_item *item;
1793         char *n = NULL;
1794         int r;
1795
1796         assert(bus);
1797         assert(name);
1798         assert(bus->is_kernel);
1799
1800         r = ioctl(bus->input_fd, KDBUS_CMD_BUS_CREATOR_INFO, &cmd);
1801         if (r < 0)
1802                 return -errno;
1803
1804         info = (struct kdbus_info*) ((uint8_t*) bus->kdbus_buffer + cmd.offset);
1805
1806         KDBUS_ITEM_FOREACH(item, info, items)
1807                 if (item->type == KDBUS_ITEM_MAKE_NAME) {
1808                         r = free_and_strdup(&n, item->str);
1809                         break;
1810                 }
1811
1812         bus_kernel_cmd_free(bus, cmd.offset);
1813
1814         if (r < 0)
1815                 return r;
1816         if (!n)
1817                 return -EIO;
1818
1819         *name = n;
1820         return 0;
1821 }