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