chiark / gitweb /
event: make gcc shut up
[elogind.git] / src / libsystemd-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
30 #include "util.h"
31 #include "strv.h"
32
33 #include "bus-internal.h"
34 #include "bus-message.h"
35 #include "bus-kernel.h"
36 #include "bus-bloom.h"
37 #include "bus-util.h"
38
39 #define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
40
41 int bus_kernel_parse_unique_name(const char *s, uint64_t *id) {
42         int r;
43
44         assert(s);
45         assert(id);
46
47         if (!startswith(s, ":1."))
48                 return 0;
49
50         r = safe_atou64(s + 3, id);
51         if (r < 0)
52                 return r;
53
54         return 1;
55 }
56
57 static void append_payload_vec(struct kdbus_item **d, const void *p, size_t sz) {
58         assert(d);
59         assert(sz > 0);
60
61         *d = ALIGN8_PTR(*d);
62
63         /* Note that p can be NULL, which encodes a region full of
64          * zeroes, which is useful to optimize certain padding
65          * conditions */
66
67         (*d)->size = offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec);
68         (*d)->type = KDBUS_ITEM_PAYLOAD_VEC;
69         (*d)->vec.address = PTR_TO_UINT64(p);
70         (*d)->vec.size = sz;
71
72         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
73 }
74
75 static void append_payload_memfd(struct kdbus_item **d, int memfd, size_t sz) {
76         assert(d);
77         assert(memfd >= 0);
78         assert(sz > 0);
79
80         *d = ALIGN8_PTR(*d);
81         (*d)->size = offsetof(struct kdbus_item, memfd) + sizeof(struct kdbus_memfd);
82         (*d)->type = KDBUS_ITEM_PAYLOAD_MEMFD;
83         (*d)->memfd.fd = memfd;
84         (*d)->memfd.size = sz;
85
86         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
87 }
88
89 static void append_destination(struct kdbus_item **d, const char *s, size_t length) {
90         assert(d);
91         assert(s);
92
93         *d = ALIGN8_PTR(*d);
94
95         (*d)->size = offsetof(struct kdbus_item, str) + length + 1;
96         (*d)->type = KDBUS_ITEM_DST_NAME;
97         memcpy((*d)->str, s, length + 1);
98
99         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
100 }
101
102 static void* append_bloom(struct kdbus_item **d, size_t length) {
103         void *r;
104
105         assert(d);
106
107         *d = ALIGN8_PTR(*d);
108
109         (*d)->size = offsetof(struct kdbus_item, data) + length;
110         (*d)->type = KDBUS_ITEM_BLOOM;
111         r = (*d)->data;
112
113         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
114
115         return r;
116 }
117
118 static void append_fds(struct kdbus_item **d, const int fds[], unsigned n_fds) {
119         assert(d);
120         assert(fds);
121         assert(n_fds > 0);
122
123         *d = ALIGN8_PTR(*d);
124         (*d)->size = offsetof(struct kdbus_item, fds) + sizeof(int) * n_fds;
125         (*d)->type = KDBUS_ITEM_FDS;
126         memcpy((*d)->fds, fds, sizeof(int) * n_fds);
127
128         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
129 }
130
131 static int bus_message_setup_bloom(sd_bus_message *m, void *bloom) {
132         unsigned i;
133         int r;
134
135         assert(m);
136         assert(bloom);
137
138         memset(bloom, 0, BLOOM_SIZE);
139
140         bloom_add_pair(bloom, "message-type", bus_message_type_to_string(m->header->type));
141
142         if (m->interface)
143                 bloom_add_pair(bloom, "interface", m->interface);
144         if (m->member)
145                 bloom_add_pair(bloom, "member", m->member);
146         if (m->path) {
147                 bloom_add_pair(bloom, "path", m->path);
148                 bloom_add_pair(bloom, "path-slash-prefix", m->path);
149                 bloom_add_prefixes(bloom, "path-slash-prefix", m->path, '/');
150         }
151
152         r = sd_bus_message_rewind(m, true);
153         if (r < 0)
154                 return r;
155
156         for (i = 0; i < 64; i++) {
157                 char type;
158                 const char *t;
159                 char buf[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")];
160                 char *e;
161
162                 r = sd_bus_message_peek_type(m, &type, NULL);
163                 if (r < 0)
164                         return r;
165
166                 if (type != SD_BUS_TYPE_STRING &&
167                     type != SD_BUS_TYPE_OBJECT_PATH &&
168                     type != SD_BUS_TYPE_SIGNATURE)
169                         break;
170
171                 r = sd_bus_message_read_basic(m, type, &t);
172                 if (r < 0)
173                         return r;
174
175                 e = stpcpy(buf, "arg");
176                 if (i < 10)
177                         *(e++) = '0' + i;
178                 else {
179                         *(e++) = '0' + (i / 10);
180                         *(e++) = '0' + (i % 10);
181                 }
182
183                 *e = 0;
184                 bloom_add_pair(bloom, buf, t);
185
186                 strcpy(e, "-dot-prefix");
187                 bloom_add_prefixes(bloom, buf, t, '.');
188                 strcpy(e, "-slash-prefix");
189                 bloom_add_prefixes(bloom, buf, t, '/');
190         }
191
192         return 0;
193 }
194
195 static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
196         struct bus_body_part *part;
197         struct kdbus_item *d;
198         bool well_known;
199         uint64_t unique;
200         size_t sz, dl;
201         unsigned i;
202         int r;
203
204         assert(b);
205         assert(m);
206         assert(m->sealed);
207
208         if (m->kdbus)
209                 return 0;
210
211         if (m->destination) {
212                 r = bus_kernel_parse_unique_name(m->destination, &unique);
213                 if (r < 0)
214                         return r;
215
216                 well_known = r == 0;
217         } else
218                 well_known = false;
219
220         sz = offsetof(struct kdbus_msg, items);
221
222         assert_cc(ALIGN8(offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec)) ==
223                   ALIGN8(offsetof(struct kdbus_item, memfd) + sizeof(struct kdbus_memfd)));
224
225         /* Add in fixed header, fields header and payload */
226         sz += (1 + m->n_body_parts) *
227                 ALIGN8(offsetof(struct kdbus_item, vec) + sizeof(struct kdbus_vec));
228
229         /* Add space for bloom filter */
230         sz += ALIGN8(offsetof(struct kdbus_item, data) + BLOOM_SIZE);
231
232         /* Add in well-known destination header */
233         if (well_known) {
234                 dl = strlen(m->destination);
235                 sz += ALIGN8(offsetof(struct kdbus_item, str) + dl + 1);
236         }
237
238         /* Add space for unix fds */
239         if (m->n_fds > 0)
240                 sz += ALIGN8(offsetof(struct kdbus_item, fds) + sizeof(int)*m->n_fds);
241
242         m->kdbus = memalign(8, sz);
243         if (!m->kdbus) {
244                 r = -ENOMEM;
245                 goto fail;
246         }
247
248         m->free_kdbus = true;
249         memset(m->kdbus, 0, sz);
250
251         m->kdbus->flags =
252                 ((m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED) ? 0 : KDBUS_MSG_FLAGS_EXPECT_REPLY) |
253                 ((m->header->flags & BUS_MESSAGE_NO_AUTO_START) ? KDBUS_MSG_FLAGS_NO_AUTO_START : 0);
254         m->kdbus->dst_id =
255                 well_known ? 0 :
256                 m->destination ? unique : KDBUS_DST_ID_BROADCAST;
257         m->kdbus->payload_type = KDBUS_PAYLOAD_DBUS;
258         m->kdbus->cookie = m->header->serial;
259
260         m->kdbus->timeout_ns = m->timeout * NSEC_PER_USEC;
261
262         d = m->kdbus->items;
263
264         if (well_known)
265                 append_destination(&d, m->destination, dl);
266
267         append_payload_vec(&d, m->header, BUS_MESSAGE_BODY_BEGIN(m));
268
269         MESSAGE_FOREACH_PART(part, i, m) {
270                 if (part->is_zero) {
271                         /* If this is padding then simply send a
272                          * vector with a NULL data pointer which the
273                          * kernel will just pass through. This is the
274                          * most efficient way to encode zeroes */
275
276                         append_payload_vec(&d, NULL, part->size);
277                         continue;
278                 }
279
280                 if (part->memfd >= 0 && part->sealed && m->destination) {
281                         /* Try to send a memfd, if the part is
282                          * sealed and this is not a broadcast. Since we can only  */
283
284                         append_payload_memfd(&d, part->memfd, part->size);
285                         continue;
286                 }
287
288                 /* Otherwise let's send a vector to the actual data,
289                  * for that we need to map it first. */
290                 r = bus_body_part_map(part);
291                 if (r < 0)
292                         goto fail;
293
294                 append_payload_vec(&d, part->data, part->size);
295         }
296
297         if (m->kdbus->dst_id == KDBUS_DST_ID_BROADCAST) {
298                 void *p;
299
300                 p = append_bloom(&d, BLOOM_SIZE);
301                 r = bus_message_setup_bloom(m, p);
302                 if (r < 0)
303                         goto fail;
304         }
305
306         if (m->n_fds > 0)
307                 append_fds(&d, m->fds, m->n_fds);
308
309         m->kdbus->size = (uint8_t*) d - (uint8_t*) m->kdbus;
310         assert(m->kdbus->size <= sz);
311
312         return 0;
313
314 fail:
315         m->poisoned = true;
316         return r;
317 }
318
319 int bus_kernel_take_fd(sd_bus *b) {
320         struct kdbus_cmd_hello hello;
321         int r;
322
323         assert(b);
324
325         if (b->is_server)
326                 return -EINVAL;
327
328         b->use_memfd = 1;
329
330         zero(hello);
331         hello.size = sizeof(hello);
332         hello.conn_flags = b->hello_flags;
333         hello.attach_flags = b->attach_flags;
334         hello.pool_size = KDBUS_POOL_SIZE;
335
336         r = ioctl(b->input_fd, KDBUS_CMD_HELLO, &hello);
337         if (r < 0)
338                 return -errno;
339
340         if (!b->kdbus_buffer) {
341                 b->kdbus_buffer = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, b->input_fd, 0);
342                 if (b->kdbus_buffer == MAP_FAILED) {
343                         b->kdbus_buffer = NULL;
344                         return -errno;
345                 }
346         }
347
348         /* The higher 32bit of both flags fields are considered
349          * 'incompatible flags'. Refuse them all for now. */
350         if (hello.bus_flags > 0xFFFFFFFFULL ||
351             hello.conn_flags > 0xFFFFFFFFULL)
352                 return -ENOTSUP;
353
354         if (hello.bloom_size != BLOOM_SIZE)
355                 return -ENOTSUP;
356
357         if (asprintf(&b->unique_name, ":1.%llu", (unsigned long long) hello.id) < 0)
358                 return -ENOMEM;
359
360         b->unique_id = hello.id;
361
362         b->is_kernel = true;
363         b->bus_client = true;
364         b->can_fds = !!(hello.conn_flags & KDBUS_HELLO_ACCEPT_FD);
365         b->message_version = 2;
366         b->message_endian = BUS_NATIVE_ENDIAN;
367
368         /* the kernel told us the UUID of the underlying bus */
369         memcpy(b->server_id.bytes, hello.id128, sizeof(b->server_id.bytes));
370
371         return bus_start_running(b);
372 }
373
374 int bus_kernel_connect(sd_bus *b) {
375         assert(b);
376         assert(b->input_fd < 0);
377         assert(b->output_fd < 0);
378         assert(b->kernel);
379
380         if (b->is_server)
381                 return -EINVAL;
382
383         b->input_fd = open(b->kernel, O_RDWR|O_NOCTTY|O_CLOEXEC);
384         if (b->input_fd < 0)
385                 return -errno;
386
387         b->output_fd = b->input_fd;
388
389         return bus_kernel_take_fd(b);
390 }
391
392 int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m) {
393         int r;
394
395         assert(bus);
396         assert(m);
397         assert(bus->state == BUS_RUNNING);
398
399         /* If we can't deliver, we want room for the error message */
400         r = bus_rqueue_make_room(bus);
401         if (r < 0)
402                 return r;
403
404         r = bus_message_setup_kmsg(bus, m);
405         if (r < 0)
406                 return r;
407
408         r = ioctl(bus->output_fd, KDBUS_CMD_MSG_SEND, m->kdbus);
409         if (r < 0) {
410                 _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL;
411                 sd_bus_message *reply;
412
413                 if (errno == EAGAIN || errno == EINTR)
414                         return 0;
415                 else if (errno == ENXIO || errno == ESRCH) {
416
417                         /* ENXIO: unique name not known
418                          * ESRCH: well-known name not known */
419
420                         if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
421                                 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Destination %s not known", m->destination);
422                         else {
423                                 log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m->destination);
424                                 return 0;
425                         }
426
427                 } else if (errno == EADDRNOTAVAIL) {
428
429                         /* EADDRNOTAVAIL: activation is possible, but turned off in request flags */
430
431                         if (m->header->type == SD_BUS_MESSAGE_METHOD_CALL)
432                                 sd_bus_error_setf(&error, SD_BUS_ERROR_SERVICE_UNKNOWN, "Activation of %s not requested", m->destination);
433                         else {
434                                 log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m->destination);
435                                 return 0;
436                         }
437                 } else
438                         return -errno;
439
440                 r = bus_message_new_synthetic_error(
441                                 bus,
442                                 BUS_MESSAGE_SERIAL(m),
443                                 &error,
444                                 &reply);
445
446                 if (r < 0)
447                         return r;
448
449                 r = bus_seal_synthetic_message(bus, reply);
450                 if (r < 0)
451                         return r;
452
453                 bus->rqueue[bus->rqueue_size++] = reply;
454
455                 return 0;
456         }
457
458         return 1;
459 }
460
461 static void close_kdbus_msg(sd_bus *bus, struct kdbus_msg *k) {
462         uint64_t off;
463         struct kdbus_item *d;
464
465         assert(bus);
466         assert(k);
467
468         off = (uint8_t *)k - (uint8_t *)bus->kdbus_buffer;
469         ioctl(bus->input_fd, KDBUS_CMD_FREE, &off);
470
471         KDBUS_ITEM_FOREACH(d, k, items) {
472
473                 if (d->type == KDBUS_ITEM_FDS)
474                         close_many(d->fds, (d->size - offsetof(struct kdbus_item, fds)) / sizeof(int));
475                 else if (d->type == KDBUS_ITEM_PAYLOAD_MEMFD)
476                         close_nointr_nofail(d->memfd.fd);
477         }
478 }
479
480 static int push_name_owner_changed(sd_bus *bus, const char *name, const char *old_owner, const char *new_owner) {
481         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
482         int r;
483
484         assert(bus);
485
486         r = sd_bus_message_new_signal(
487                         bus,
488                         "/org/freedesktop/DBus",
489                         "org.freedesktop.DBus",
490                         "NameOwnerChanged",
491                         &m);
492         if (r < 0)
493                 return r;
494
495         r = sd_bus_message_append(m, "sss", name, old_owner, new_owner);
496         if (r < 0)
497                 return r;
498
499         m->sender = "org.freedesktop.DBus";
500
501         r = bus_seal_synthetic_message(bus, m);
502         if (r < 0)
503                 return r;
504
505         bus->rqueue[bus->rqueue_size++] = m;
506         m = NULL;
507
508         return 1;
509 }
510
511 static int translate_name_change(sd_bus *bus, struct kdbus_msg *k, struct kdbus_item *d) {
512         char new_owner[UNIQUE_NAME_MAX], old_owner[UNIQUE_NAME_MAX];
513
514         assert(bus);
515         assert(k);
516         assert(d);
517
518         if (d->type == KDBUS_ITEM_NAME_ADD || (d->name_change.old_flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR)))
519                 old_owner[0] = 0;
520         else
521                 sprintf(old_owner, ":1.%llu", (unsigned long long) d->name_change.old_id);
522
523         if (d->type == KDBUS_ITEM_NAME_REMOVE || (d->name_change.new_flags & (KDBUS_NAME_IN_QUEUE|KDBUS_NAME_ACTIVATOR))) {
524
525                 if (isempty(old_owner))
526                         return 0;
527
528                 new_owner[0] = 0;
529         } else
530                 sprintf(new_owner, ":1.%llu", (unsigned long long) d->name_change.new_id);
531
532         return push_name_owner_changed(bus, d->name_change.name, old_owner, new_owner);
533 }
534
535 static int translate_id_change(sd_bus *bus, struct kdbus_msg *k, struct kdbus_item *d) {
536         char owner[UNIQUE_NAME_MAX];
537
538         assert(bus);
539         assert(k);
540         assert(d);
541
542         sprintf(owner, ":1.%llu", d->id_change.id);
543
544         return push_name_owner_changed(
545                         bus, owner,
546                         d->type == KDBUS_ITEM_ID_ADD ? NULL : owner,
547                         d->type == KDBUS_ITEM_ID_ADD ? owner : NULL);
548 }
549
550 static int translate_reply(sd_bus *bus, struct kdbus_msg *k, struct kdbus_item *d) {
551         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
552         int r;
553
554         assert(bus);
555         assert(k);
556         assert(d);
557
558         r = bus_message_new_synthetic_error(
559                         bus,
560                         k->cookie_reply,
561                         d->type == KDBUS_ITEM_REPLY_TIMEOUT ?
562                         &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call timed out") :
563                         &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Method call peer died"),
564                         &m);
565         if (r < 0)
566                 return r;
567
568         m->sender = "org.freedesktop.DBus";
569
570         r = bus_seal_synthetic_message(bus, m);
571         if (r < 0)
572                 return r;
573
574         bus->rqueue[bus->rqueue_size++] = m;
575         m = NULL;
576
577         return 1;
578 }
579
580 static int bus_kernel_translate_message(sd_bus *bus, struct kdbus_msg *k) {
581         struct kdbus_item *d, *found = NULL;
582
583         static int (* const translate[])(sd_bus *bus, struct kdbus_msg *k, struct kdbus_item *d) = {
584                 [KDBUS_ITEM_NAME_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
585                 [KDBUS_ITEM_NAME_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
586                 [KDBUS_ITEM_NAME_CHANGE - _KDBUS_ITEM_KERNEL_BASE] = translate_name_change,
587
588                 [KDBUS_ITEM_ID_ADD - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
589                 [KDBUS_ITEM_ID_REMOVE - _KDBUS_ITEM_KERNEL_BASE] = translate_id_change,
590
591                 [KDBUS_ITEM_REPLY_TIMEOUT - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
592                 [KDBUS_ITEM_REPLY_DEAD - _KDBUS_ITEM_KERNEL_BASE] = translate_reply,
593         };
594
595         assert(bus);
596         assert(k);
597         assert(k->payload_type == KDBUS_PAYLOAD_KERNEL);
598
599         KDBUS_ITEM_FOREACH(d, k, items) {
600                 if (d->type >= _KDBUS_ITEM_KERNEL_BASE && d->type < _KDBUS_ITEM_KERNEL_BASE + ELEMENTSOF(translate)) {
601                         if (found)
602                                 return -EBADMSG;
603                         found = d;
604                 } else
605                         log_debug("Got unknown field from kernel %llu", d->type);
606         }
607
608         if (!found) {
609                 log_debug("Didn't find a kernel message to translate.");
610                 return 0;
611         }
612
613         return translate[found->type - _KDBUS_ITEM_KERNEL_BASE](bus, k, found);
614 }
615
616 static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
617         sd_bus_message *m = NULL;
618         struct kdbus_item *d;
619         unsigned n_fds = 0;
620         _cleanup_free_ int *fds = NULL;
621         struct bus_header *h = NULL;
622         size_t total, n_bytes = 0, idx = 0;
623         const char *destination = NULL, *seclabel = NULL;
624         int r;
625
626         assert(bus);
627         assert(k);
628         assert(k->payload_type == KDBUS_PAYLOAD_DBUS);
629
630         KDBUS_ITEM_FOREACH(d, k, items) {
631                 size_t l;
632
633                 l = d->size - offsetof(struct kdbus_item, data);
634
635                 switch (d->type) {
636
637                 case KDBUS_ITEM_PAYLOAD_OFF:
638                         if (!h) {
639                                 h = (struct bus_header *)((uint8_t *)bus->kdbus_buffer + d->vec.offset);
640
641                                 if (!bus_header_is_complete(h, d->vec.size))
642                                         return -EBADMSG;
643                         }
644
645                         n_bytes += d->vec.size;
646                         break;
647
648                 case KDBUS_ITEM_PAYLOAD_MEMFD:
649                         if (!h)
650                                 return -EBADMSG;
651
652                         n_bytes += d->memfd.size;
653                         break;
654
655                 case KDBUS_ITEM_FDS: {
656                         int *f;
657                         unsigned j;
658
659                         j = l / sizeof(int);
660                         f = realloc(fds, sizeof(int) * (n_fds + j));
661                         if (!f)
662                                 return -ENOMEM;
663
664                         fds = f;
665                         memcpy(fds + n_fds, d->fds, sizeof(int) * j);
666                         n_fds += j;
667                         break;
668                 }
669
670                 case KDBUS_ITEM_SECLABEL:
671                         seclabel = d->str;
672                         break;
673                 }
674         }
675
676         if (!h)
677                 return -EBADMSG;
678
679         r = bus_header_message_size(h, &total);
680         if (r < 0)
681                 return r;
682
683         if (n_bytes != total)
684                 return -EBADMSG;
685
686         /* on kdbus we only speak native endian gvariant, never dbus1
687          * marshalling or reverse endian */
688         if (h->version != 2 ||
689             h->endian != BUS_NATIVE_ENDIAN)
690                 return -EPROTOTYPE;
691
692         r = bus_message_from_header(bus, h, sizeof(struct bus_header), fds, n_fds, NULL, seclabel, 0, &m);
693         if (r < 0)
694                 return r;
695
696         KDBUS_ITEM_FOREACH(d, k, items) {
697                 size_t l;
698
699                 l = d->size - offsetof(struct kdbus_item, data);
700
701                 switch (d->type) {
702
703                 case KDBUS_ITEM_PAYLOAD_OFF: {
704                         size_t begin_body;
705
706                         begin_body = BUS_MESSAGE_BODY_BEGIN(m);
707
708                         if (idx + d->vec.size > begin_body) {
709                                 struct bus_body_part *part;
710
711                                 /* Contains body material */
712
713                                 part = message_append_part(m);
714                                 if (!part) {
715                                         r = -ENOMEM;
716                                         goto fail;
717                                 }
718
719                                 /* A -1 offset is NUL padding. */
720                                 part->is_zero = d->vec.offset == ~0ULL;
721
722                                 if (idx >= begin_body) {
723                                         if (!part->is_zero)
724                                                 part->data = (uint8_t *)bus->kdbus_buffer + d->vec.offset;
725                                         part->size = d->vec.size;
726                                 } else {
727                                         if (!part->is_zero)
728                                                 part->data = (uint8_t *)bus->kdbus_buffer + d->vec.offset + (begin_body - idx);
729                                         part->size = d->vec.size - (begin_body - idx);
730                                 }
731
732                                 part->sealed = true;
733                         }
734
735                         idx += d->vec.size;
736                         break;
737                 }
738
739                 case KDBUS_ITEM_PAYLOAD_MEMFD: {
740                         struct bus_body_part *part;
741
742                         if (idx < BUS_MESSAGE_BODY_BEGIN(m)) {
743                                 r = -EBADMSG;
744                                 goto fail;
745                         }
746
747                         part = message_append_part(m);
748                         if (!part) {
749                                 r = -ENOMEM;
750                                 goto fail;
751                         }
752
753                         part->memfd = d->memfd.fd;
754                         part->size = d->memfd.size;
755                         part->sealed = true;
756
757                         idx += d->memfd.size;
758                         break;
759                 }
760
761                 case KDBUS_ITEM_CREDS:
762                         m->creds.pid_starttime = d->creds.starttime / NSEC_PER_USEC;
763                         m->creds.uid = d->creds.uid;
764                         m->creds.gid = d->creds.gid;
765                         m->creds.pid = d->creds.pid;
766                         m->creds.tid = d->creds.tid;
767                         m->creds.mask |= (SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_PID|SD_BUS_CREDS_PID_STARTTIME|SD_BUS_CREDS_TID) & bus->creds_mask;
768                         break;
769
770                 case KDBUS_ITEM_TIMESTAMP:
771                         m->realtime = d->timestamp.realtime_ns / NSEC_PER_USEC;
772                         m->monotonic = d->timestamp.monotonic_ns / NSEC_PER_USEC;
773                         break;
774
775                 case KDBUS_ITEM_PID_COMM:
776                         m->creds.comm = d->str;
777                         m->creds.mask |= SD_BUS_CREDS_COMM & bus->creds_mask;
778                         break;
779
780                 case KDBUS_ITEM_TID_COMM:
781                         m->creds.tid_comm = d->str;
782                         m->creds.mask |= SD_BUS_CREDS_TID_COMM & bus->creds_mask;
783                         break;
784
785                 case KDBUS_ITEM_EXE:
786                         m->creds.exe = d->str;
787                         m->creds.mask |= SD_BUS_CREDS_EXE & bus->creds_mask;
788                         break;
789
790                 case KDBUS_ITEM_CMDLINE:
791                         m->creds.cmdline = d->str;
792                         m->creds.cmdline_size = l;
793                         m->creds.mask |= SD_BUS_CREDS_CMDLINE & bus->creds_mask;
794                         break;
795
796                 case KDBUS_ITEM_CGROUP:
797                         m->creds.cgroup = d->str;
798                         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;
799                         break;
800
801                 case KDBUS_ITEM_AUDIT:
802                         m->creds.audit_session_id = d->audit.sessionid;
803                         m->creds.audit_login_uid = d->audit.loginuid;
804                         m->creds.mask |= (SD_BUS_CREDS_AUDIT_SESSION_ID|SD_BUS_CREDS_AUDIT_LOGIN_UID) & bus->creds_mask;
805                         break;
806
807                 case KDBUS_ITEM_CAPS:
808                         m->creds.capability = d->data;
809                         m->creds.capability_size = l;
810                         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;
811                         break;
812
813                 case KDBUS_ITEM_DST_NAME:
814                         destination = d->str;
815                         break;
816
817                 case KDBUS_ITEM_NAME:
818                         r = strv_extend(&m->creds.well_known_names, d->name.name);
819                         if (r < 0)
820                                 goto fail;
821                         m->creds.mask |= SD_BUS_CREDS_WELL_KNOWN_NAMES & bus->creds_mask;
822                         break;
823
824                 case KDBUS_ITEM_FDS:
825                 case KDBUS_ITEM_SECLABEL:
826                         break;
827
828                 default:
829                         log_debug("Got unknown field from kernel %llu", d->type);
830                 }
831         }
832
833         r = bus_message_parse_fields(m);
834         if (r < 0)
835                 goto fail;
836
837         /* Override information from the user header with data from the kernel */
838         if (k->src_id == KDBUS_SRC_ID_KERNEL)
839                 m->sender = "org.freedesktop.DBus";
840         else {
841                 snprintf(m->sender_buffer, sizeof(m->sender_buffer), ":1.%llu", (unsigned long long) k->src_id);
842                 m->sender = m->creds.unique_name = m->sender_buffer;
843                 m->creds.mask |= SD_BUS_CREDS_UNIQUE_NAME & bus->creds_mask;
844         }
845
846         if (!m->destination) {
847                 if (destination)
848                         m->destination = destination;
849                 else if (k->dst_id != KDBUS_DST_ID_NAME &&
850                          k->dst_id != KDBUS_DST_ID_BROADCAST) {
851                         snprintf(m->destination_buffer, sizeof(m->destination_buffer), ":1.%llu", (unsigned long long) k->dst_id);
852                         m->destination = m->destination_buffer;
853                 }
854         }
855
856         /* We take possession of the kmsg struct now */
857         m->kdbus = k;
858         m->release_kdbus = true;
859         m->free_fds = true;
860         fds = NULL;
861
862         bus->rqueue[bus->rqueue_size++] = m;
863
864         return 1;
865
866 fail:
867         if (m) {
868                 struct bus_body_part *part;
869                 unsigned i;
870
871                 /* Make sure the memfds are not freed twice */
872                 MESSAGE_FOREACH_PART(part, i, m)
873                         if (part->memfd >= 0)
874                                 part->memfd = -1;
875
876                 sd_bus_message_unref(m);
877         }
878
879         return r;
880 }
881
882 int bus_kernel_read_message(sd_bus *bus) {
883         struct kdbus_msg *k;
884         uint64_t off;
885         int r;
886
887         assert(bus);
888
889         r = bus_rqueue_make_room(bus);
890         if (r < 0)
891                 return r;
892
893         r = ioctl(bus->input_fd, KDBUS_CMD_MSG_RECV, &off);
894         if (r < 0) {
895                 if (errno == EAGAIN)
896                         return 0;
897
898                 return -errno;
899         }
900         k = (struct kdbus_msg *)((uint8_t *)bus->kdbus_buffer + off);
901
902         if (k->payload_type == KDBUS_PAYLOAD_DBUS) {
903                 r = bus_kernel_make_message(bus, k);
904
905                 /* Anybody can send us invalid messages, let's just drop them. */
906                 if (r == -EBADMSG || r == -EPROTOTYPE) {
907                         log_debug("Ignoring invalid message: %s", strerror(-r));
908                         r = 0;
909                 }
910
911         } else if (k->payload_type == KDBUS_PAYLOAD_KERNEL)
912                 r = bus_kernel_translate_message(bus, k);
913         else
914                 r = 0;
915
916         if (r <= 0)
917                 close_kdbus_msg(bus, k);
918
919         return r < 0 ? r : 1;
920 }
921
922 int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *size) {
923         struct memfd_cache *c;
924         int fd;
925
926         assert(address);
927         assert(size);
928
929         if (!bus || !bus->is_kernel)
930                 return -ENOTSUP;
931
932         assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
933
934         if (bus->n_memfd_cache <= 0) {
935                 int r;
936
937                 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
938
939                 r = ioctl(bus->input_fd, KDBUS_CMD_MEMFD_NEW, &fd);
940                 if (r < 0)
941                         return -errno;
942
943                 *address = NULL;
944                 *size = 0;
945                 return fd;
946         }
947
948         c = &bus->memfd_cache[--bus->n_memfd_cache];
949
950         assert(c->fd >= 0);
951         assert(c->size == 0 || c->address);
952
953         *address = c->address;
954         *size = c->size;
955         fd = c->fd;
956
957         assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
958
959         return fd;
960 }
961
962 static void close_and_munmap(int fd, void *address, size_t size) {
963         if (size > 0)
964                 assert_se(munmap(address, PAGE_ALIGN(size)) >= 0);
965
966         close_nointr_nofail(fd);
967 }
968
969 void bus_kernel_push_memfd(sd_bus *bus, int fd, void *address, size_t size) {
970         struct memfd_cache *c;
971         uint64_t max_sz = PAGE_ALIGN(MEMFD_CACHE_ITEM_SIZE_MAX);
972
973         assert(fd >= 0);
974         assert(size == 0 || address);
975
976         if (!bus || !bus->is_kernel) {
977                 close_and_munmap(fd, address, size);
978                 return;
979         }
980
981         assert_se(pthread_mutex_lock(&bus->memfd_cache_mutex) >= 0);
982
983         if (bus->n_memfd_cache >= ELEMENTSOF(bus->memfd_cache)) {
984                 assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
985
986                 close_and_munmap(fd, address, size);
987                 return;
988         }
989
990         c = &bus->memfd_cache[bus->n_memfd_cache++];
991         c->fd = fd;
992         c->address = address;
993
994         /* If overly long, let's return a bit to the OS */
995         if (size > max_sz) {
996                 assert_se(ioctl(fd, KDBUS_CMD_MEMFD_SIZE_SET, &max_sz) >= 0);
997                 assert_se(munmap((uint8_t*) address + max_sz, PAGE_ALIGN(size - max_sz)) >= 0);
998                 c->size = max_sz;
999         } else
1000                 c->size = size;
1001
1002         assert_se(pthread_mutex_unlock(&bus->memfd_cache_mutex) >= 0);
1003 }
1004
1005 void bus_kernel_flush_memfd(sd_bus *b) {
1006         unsigned i;
1007
1008         assert(b);
1009
1010         for (i = 0; i < b->n_memfd_cache; i++)
1011                 close_and_munmap(b->memfd_cache[i].fd, b->memfd_cache[i].address, b->memfd_cache[i].size);
1012 }
1013
1014 int kdbus_translate_request_name_flags(uint64_t flags, uint64_t *kdbus_flags) {
1015         uint64_t f = 0;
1016
1017         assert(kdbus_flags);
1018
1019         if (flags & SD_BUS_NAME_ALLOW_REPLACEMENT)
1020                 f |= KDBUS_NAME_ALLOW_REPLACEMENT;
1021
1022         if (flags & SD_BUS_NAME_REPLACE_EXISTING)
1023                 f |= KDBUS_NAME_REPLACE_EXISTING;
1024
1025         if (flags & SD_BUS_NAME_QUEUE)
1026                 f |= KDBUS_NAME_QUEUE;
1027
1028         *kdbus_flags = f;
1029         return 0;
1030 }
1031
1032 int kdbus_translate_attach_flags(uint64_t mask, uint64_t *kdbus_mask) {
1033         uint64_t m = 0;
1034
1035         assert(kdbus_mask);
1036
1037         if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_PID|SD_BUS_CREDS_PID_STARTTIME|SD_BUS_CREDS_TID))
1038                 m |= KDBUS_ATTACH_CREDS;
1039
1040         if (mask & (SD_BUS_CREDS_COMM|SD_BUS_CREDS_TID_COMM))
1041                 m |= KDBUS_ATTACH_COMM;
1042
1043         if (mask & SD_BUS_CREDS_EXE)
1044                 m |= KDBUS_ATTACH_EXE;
1045
1046         if (mask & SD_BUS_CREDS_CMDLINE)
1047                 m |= KDBUS_ATTACH_CMDLINE;
1048
1049         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))
1050                 m |= KDBUS_ATTACH_CGROUP;
1051
1052         if (mask & (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS))
1053                 m |= KDBUS_ATTACH_CAPS;
1054
1055         if (mask & SD_BUS_CREDS_SELINUX_CONTEXT)
1056                 m |= KDBUS_ATTACH_SECLABEL;
1057
1058         if (mask & (SD_BUS_CREDS_AUDIT_SESSION_ID|SD_BUS_CREDS_AUDIT_LOGIN_UID))
1059                 m |= KDBUS_ATTACH_AUDIT;
1060
1061         if (mask & SD_BUS_CREDS_WELL_KNOWN_NAMES)
1062                 m |= KDBUS_ATTACH_NAMES;
1063
1064         *kdbus_mask = m;
1065         return 0;
1066 }
1067
1068 int bus_kernel_create_bus(const char *name, char **s) {
1069         struct kdbus_cmd_bus_make *make;
1070         struct kdbus_item *n;
1071         int fd;
1072
1073         assert(name);
1074         assert(s);
1075
1076         fd = open("/dev/kdbus/control", O_RDWR|O_NOCTTY|O_CLOEXEC);
1077         if (fd < 0)
1078                 return -errno;
1079
1080         make = alloca0(ALIGN8(offsetof(struct kdbus_cmd_bus_make, items) +
1081                               offsetof(struct kdbus_item, str) +
1082                               DECIMAL_STR_MAX(uid_t) + 1 + strlen(name) + 1));
1083
1084         n = make->items;
1085         sprintf(n->str, "%lu-%s", (unsigned long) getuid(), name);
1086         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1087         n->type = KDBUS_ITEM_MAKE_NAME;
1088
1089         make->size = ALIGN8(offsetof(struct kdbus_cmd_bus_make, items) + n->size);
1090         make->flags = KDBUS_MAKE_POLICY_OPEN;
1091         make->bloom_size = BLOOM_SIZE;
1092         assert_cc(BLOOM_SIZE % 8 == 0);
1093
1094         if (ioctl(fd, KDBUS_CMD_BUS_MAKE, make) < 0) {
1095                 close_nointr_nofail(fd);
1096                 return -errno;
1097         }
1098
1099         /* The higher 32bit of the flags field are considered
1100          * 'incompatible flags'. Refuse them all for now. */
1101         if (make->flags > 0xFFFFFFFFULL) {
1102                 close_nointr_nofail(fd);
1103                 return -ENOTSUP;
1104         }
1105
1106         if (s) {
1107                 char *p;
1108
1109                 p = strjoin("/dev/kdbus/", n->str, "/bus", NULL);
1110                 if (!p) {
1111                         close_nointr_nofail(fd);
1112                         return -ENOMEM;
1113                 }
1114
1115                 *s = p;
1116         }
1117
1118         return fd;
1119 }
1120
1121 int bus_kernel_create_starter(const char *bus, const char *name) {
1122         struct kdbus_cmd_hello *hello;
1123         struct kdbus_item *n;
1124         char *p;
1125         int fd;
1126
1127         assert(bus);
1128         assert(name);
1129
1130         p = alloca(sizeof("/dev/kdbus/") - 1 + DECIMAL_STR_MAX(uid_t) + 1 + strlen(bus) + sizeof("/bus"));
1131         sprintf(p, "/dev/kdbus/%lu-%s/bus", (unsigned long) getuid(), bus);
1132
1133         fd = open(p, O_RDWR|O_NOCTTY|O_CLOEXEC);
1134         if (fd < 0)
1135                 return -errno;
1136
1137         hello = alloca0(ALIGN8(offsetof(struct kdbus_cmd_hello, items) +
1138                                offsetof(struct kdbus_item, str) +
1139                                strlen(name) + 1));
1140
1141         n = hello->items;
1142         strcpy(n->str, name);
1143         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1144         n->type = KDBUS_ITEM_ACTIVATOR_NAME;
1145
1146         hello->size = ALIGN8(offsetof(struct kdbus_cmd_hello, items) + n->size);
1147         hello->conn_flags = KDBUS_HELLO_ACTIVATOR;
1148         hello->pool_size = KDBUS_POOL_SIZE;
1149
1150         if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0) {
1151                 close_nointr_nofail(fd);
1152                 return -errno;
1153         }
1154
1155         /* The higher 32bit of both flags fields are considered
1156          * 'incompatible flags'. Refuse them all for now. */
1157         if (hello->bus_flags > 0xFFFFFFFFULL ||
1158             hello->conn_flags > 0xFFFFFFFFULL) {
1159                 close_nointr_nofail(fd);
1160                 return -ENOTSUP;
1161         }
1162
1163         if (hello->bloom_size != BLOOM_SIZE) {
1164                 close_nointr_nofail(fd);
1165                 return -ENOTSUP;
1166         }
1167
1168         return fd;
1169 }
1170
1171 int bus_kernel_create_namespace(const char *name, char **s) {
1172         struct kdbus_cmd_ns_make *make;
1173         struct kdbus_item *n;
1174         int fd;
1175
1176         assert(name);
1177         assert(s);
1178
1179         fd = open("/dev/kdbus/control", O_RDWR|O_NOCTTY|O_CLOEXEC);
1180         if (fd < 0)
1181                 return -errno;
1182
1183         make = alloca0(ALIGN8(offsetof(struct kdbus_cmd_ns_make, items) +
1184                               offsetof(struct kdbus_item, str) +
1185                               strlen(name) + 1));
1186
1187         n = make->items;
1188         strcpy(n->str, name);
1189         n->size = offsetof(struct kdbus_item, str) + strlen(n->str) + 1;
1190         n->type = KDBUS_ITEM_MAKE_NAME;
1191
1192         make->size = ALIGN8(offsetof(struct kdbus_cmd_ns_make, items) + n->size);
1193         make->flags = KDBUS_MAKE_POLICY_OPEN | KDBUS_MAKE_ACCESS_WORLD;
1194
1195         if (ioctl(fd, KDBUS_CMD_NS_MAKE, make) < 0) {
1196                 close_nointr_nofail(fd);
1197                 return -errno;
1198         }
1199
1200         /* The higher 32bit of the flags field are considered
1201          * 'incompatible flags'. Refuse them all for now. */
1202         if (make->flags > 0xFFFFFFFFULL) {
1203                 close_nointr_nofail(fd);
1204                 return -ENOTSUP;
1205         }
1206
1207         if (s) {
1208                 char *p;
1209
1210                 p = strappend("/dev/kdbus/ns/", name);
1211                 if (!p) {
1212                         close_nointr_nofail(fd);
1213                         return -ENOMEM;
1214                 }
1215
1216                 *s = p;
1217         }
1218
1219         return fd;
1220 }
1221
1222 int bus_kernel_monitor(sd_bus *bus) {
1223         struct kdbus_cmd_monitor cmd_monitor;
1224         int r;
1225
1226         assert(bus);
1227
1228         cmd_monitor.id = 0;
1229         cmd_monitor.flags = KDBUS_MONITOR_ENABLE;
1230
1231         r = ioctl(bus->input_fd, KDBUS_CMD_MONITOR, &cmd_monitor);
1232         if (r < 0)
1233                 return -errno;
1234
1235         return 1;
1236 }