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