1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Lennart Poettering
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.
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.
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/>.
22 #ifdef HAVE_VALGRIND_MEMCHECK_H
23 #include <valgrind/memcheck.h>
29 #include <sys/prctl.h>
31 /* When we include libgen.h because we need dirname() we immediately
32 * undefine basename() since libgen.h defines it as a macro to the XDG
33 * version which is really broken. */
39 #include "memfd-util.h"
40 #include "capability.h"
42 #include "formats-util.h"
44 #include "bus-internal.h"
45 #include "bus-message.h"
46 #include "bus-kernel.h"
47 #include "bus-bloom.h"
49 #include "bus-label.h"
51 #define UNIQUE_NAME_MAX (3+DECIMAL_STR_MAX(uint64_t))
53 int bus_kernel_parse_unique_name(const char *s
, uint64_t *id
) {
59 if (!startswith(s
, ":1."))
62 r
= safe_atou64(s
+ 3, id
);
69 static void append_payload_vec(struct kdbus_item
**d
, const void *p
, size_t sz
) {
75 /* Note that p can be NULL, which encodes a region full of
76 * zeroes, which is useful to optimize certain padding
79 (*d
)->size
= offsetof(struct kdbus_item
, vec
) + sizeof(struct kdbus_vec
);
80 (*d
)->type
= KDBUS_ITEM_PAYLOAD_VEC
;
81 (*d
)->vec
.address
= PTR_TO_UINT64(p
);
84 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
87 static void append_payload_memfd(struct kdbus_item
**d
, int memfd
, size_t start
, size_t sz
) {
93 (*d
)->size
= offsetof(struct kdbus_item
, memfd
) + sizeof(struct kdbus_memfd
);
94 (*d
)->type
= KDBUS_ITEM_PAYLOAD_MEMFD
;
95 (*d
)->memfd
.fd
= memfd
;
96 (*d
)->memfd
.start
= start
;
97 (*d
)->memfd
.size
= sz
;
99 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
102 static void append_destination(struct kdbus_item
**d
, const char *s
, size_t length
) {
108 (*d
)->size
= offsetof(struct kdbus_item
, str
) + length
+ 1;
109 (*d
)->type
= KDBUS_ITEM_DST_NAME
;
110 memcpy((*d
)->str
, s
, length
+ 1);
112 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
115 static struct kdbus_bloom_filter
*append_bloom(struct kdbus_item
**d
, size_t length
) {
116 struct kdbus_item
*i
;
122 i
->size
= offsetof(struct kdbus_item
, bloom_filter
) +
123 offsetof(struct kdbus_bloom_filter
, data
) +
125 i
->type
= KDBUS_ITEM_BLOOM_FILTER
;
127 *d
= (struct kdbus_item
*) ((uint8_t*) i
+ i
->size
);
129 return &i
->bloom_filter
;
132 static void append_fds(struct kdbus_item
**d
, const int fds
[], unsigned n_fds
) {
138 (*d
)->size
= offsetof(struct kdbus_item
, fds
) + sizeof(int) * n_fds
;
139 (*d
)->type
= KDBUS_ITEM_FDS
;
140 memcpy((*d
)->fds
, fds
, sizeof(int) * n_fds
);
142 *d
= (struct kdbus_item
*) ((uint8_t*) *d
+ (*d
)->size
);
145 static void add_bloom_arg(void *data
, size_t size
, unsigned n_hash
, unsigned i
, const char *t
) {
146 char buf
[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")];
154 e
= stpcpy(buf
, "arg");
156 *(e
++) = '0' + (char) i
;
158 *(e
++) = '0' + (char) (i
/ 10);
159 *(e
++) = '0' + (char) (i
% 10);
163 bloom_add_pair(data
, size
, n_hash
, buf
, t
);
165 strcpy(e
, "-dot-prefix");
166 bloom_add_prefixes(data
, size
, n_hash
, buf
, t
, '.');
167 strcpy(e
, "-slash-prefix");
168 bloom_add_prefixes(data
, size
, n_hash
, buf
, t
, '/');
171 static int bus_message_setup_bloom(sd_bus_message
*m
, struct kdbus_bloom_filter
*bloom
) {
180 memzero(data
, m
->bus
->bloom_size
);
181 bloom
->generation
= 0;
183 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "message-type", bus_message_type_to_string(m
->header
->type
));
186 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "interface", m
->interface
);
188 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "member", m
->member
);
190 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "path", m
->path
);
191 bloom_add_pair(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "path-slash-prefix", m
->path
);
192 bloom_add_prefixes(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, "path-slash-prefix", m
->path
, '/');
195 r
= sd_bus_message_rewind(m
, true);
199 for (i
= 0; i
< 64; i
++) {
200 const char *t
, *contents
;
203 r
= sd_bus_message_peek_type(m
, &type
, &contents
);
207 if (IN_SET(type
, SD_BUS_TYPE_STRING
, SD_BUS_TYPE_OBJECT_PATH
, SD_BUS_TYPE_SIGNATURE
)) {
209 /* The bloom filter includes simple strings of any kind */
210 r
= sd_bus_message_read_basic(m
, type
, &t
);
214 add_bloom_arg(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, i
, t
);
215 } if (type
== SD_BUS_TYPE_ARRAY
&& STR_IN_SET(contents
, "s", "o", "g")) {
217 /* As well as array of simple strings of any kinds */
218 r
= sd_bus_message_enter_container(m
, type
, contents
);
222 while ((r
= sd_bus_message_read_basic(m
, contents
[0], &t
)) > 0)
223 add_bloom_arg(data
, m
->bus
->bloom_size
, m
->bus
->bloom_n_hash
, i
, t
);
227 r
= sd_bus_message_exit_container(m
);
232 /* Stop adding to bloom filter as soon as we
233 * run into the first argument we cannot add
241 static int bus_message_setup_kmsg(sd_bus
*b
, sd_bus_message
*m
) {
242 struct bus_body_part
*part
;
243 struct kdbus_item
*d
;
244 const char *destination
;
255 /* We put this together only once, if this message is reused
256 * we reuse the earlier-built version */
260 destination
= m
->destination
?: m
->destination_ptr
;
263 r
= bus_kernel_parse_unique_name(destination
, &unique
);
271 sz
= offsetof(struct kdbus_msg
, items
);
273 /* Add in fixed header, fields header and payload */
274 sz
+= (1 + m
->n_body_parts
) * ALIGN8(offsetof(struct kdbus_item
, vec
) +
275 MAX(sizeof(struct kdbus_vec
),
276 sizeof(struct kdbus_memfd
)));
278 /* Add space for bloom filter */
279 sz
+= ALIGN8(offsetof(struct kdbus_item
, bloom_filter
) +
280 offsetof(struct kdbus_bloom_filter
, data
) +
283 /* Add in well-known destination header */
285 dl
= strlen(destination
);
286 sz
+= ALIGN8(offsetof(struct kdbus_item
, str
) + dl
+ 1);
289 /* Add space for unix fds */
291 sz
+= ALIGN8(offsetof(struct kdbus_item
, fds
) + sizeof(int)*m
->n_fds
);
293 m
->kdbus
= memalign(8, sz
);
299 m
->free_kdbus
= true;
300 memzero(m
->kdbus
, sz
);
303 ((m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
) ? 0 : KDBUS_MSG_EXPECT_REPLY
) |
304 ((m
->header
->flags
& BUS_MESSAGE_NO_AUTO_START
) ? KDBUS_MSG_NO_AUTO_START
: 0) |
305 ((m
->header
->type
== SD_BUS_MESSAGE_SIGNAL
) ? KDBUS_MSG_SIGNAL
: 0);
308 /* verify_destination_id will usually be 0, which makes the kernel driver only look
309 * at the provided well-known name. Otherwise, the kernel will make sure the provided
310 * destination id matches the owner of the provided weel-known-name, and fail if they
311 * differ. Currently, this is only needed for bus-proxyd. */
312 m
->kdbus
->dst_id
= m
->verify_destination_id
;
314 m
->kdbus
->dst_id
= destination
? unique
: KDBUS_DST_ID_BROADCAST
;
316 m
->kdbus
->payload_type
= KDBUS_PAYLOAD_DBUS
;
317 m
->kdbus
->cookie
= m
->header
->dbus2
.cookie
;
318 m
->kdbus
->priority
= m
->priority
;
320 if (m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
)
321 m
->kdbus
->cookie_reply
= m
->reply_cookie
;
325 assert_se(clock_gettime(CLOCK_MONOTONIC_COARSE
, &now
) == 0);
326 m
->kdbus
->timeout_ns
= now
.tv_sec
* NSEC_PER_SEC
+ now
.tv_nsec
+
327 m
->timeout
* NSEC_PER_USEC
;
333 append_destination(&d
, destination
, dl
);
335 append_payload_vec(&d
, m
->header
, BUS_MESSAGE_BODY_BEGIN(m
));
337 MESSAGE_FOREACH_PART(part
, i
, m
) {
339 /* If this is padding then simply send a
340 * vector with a NULL data pointer which the
341 * kernel will just pass through. This is the
342 * most efficient way to encode zeroes */
344 append_payload_vec(&d
, NULL
, part
->size
);
348 if (part
->memfd
>= 0 && part
->sealed
&& destination
) {
349 /* Try to send a memfd, if the part is
350 * sealed and this is not a broadcast. Since we can only */
352 append_payload_memfd(&d
, part
->memfd
, part
->memfd_offset
, part
->size
);
356 /* Otherwise, let's send a vector to the actual data.
357 * For that, we need to map it first. */
358 r
= bus_body_part_map(part
);
362 append_payload_vec(&d
, part
->data
, part
->size
);
365 if (m
->header
->type
== SD_BUS_MESSAGE_SIGNAL
) {
366 struct kdbus_bloom_filter
*bloom
;
368 bloom
= append_bloom(&d
, m
->bus
->bloom_size
);
369 r
= bus_message_setup_bloom(m
, bloom
);
375 append_fds(&d
, m
->fds
, m
->n_fds
);
377 m
->kdbus
->size
= (uint8_t*) d
- (uint8_t*) m
->kdbus
;
378 assert(m
->kdbus
->size
<= sz
);
387 static void unset_memfds(struct sd_bus_message
*m
) {
388 struct bus_body_part
*part
;
393 /* Make sure the memfds are not freed twice */
394 MESSAGE_FOREACH_PART(part
, i
, m
)
395 if (part
->memfd
>= 0)
399 static void message_set_timestamp(sd_bus
*bus
, sd_bus_message
*m
, const struct kdbus_timestamp
*ts
) {
406 if (!(bus
->attach_flags
& KDBUS_ATTACH_TIMESTAMP
))
409 m
->realtime
= ts
->realtime_ns
/ NSEC_PER_USEC
;
410 m
->monotonic
= ts
->monotonic_ns
/ NSEC_PER_USEC
;
411 m
->seqnum
= ts
->seqnum
;
414 static int bus_kernel_make_message(sd_bus
*bus
, struct kdbus_msg
*k
) {
415 sd_bus_message
*m
= NULL
;
416 struct kdbus_item
*d
;
418 _cleanup_free_
int *fds
= NULL
;
419 struct bus_header
*header
= NULL
;
421 size_t header_size
= 0, footer_size
= 0;
422 size_t n_bytes
= 0, idx
= 0;
423 const char *destination
= NULL
, *seclabel
= NULL
;
424 bool last_was_memfd
= false;
429 assert(k
->payload_type
== KDBUS_PAYLOAD_DBUS
);
431 KDBUS_ITEM_FOREACH(d
, k
, items
) {
434 l
= d
->size
- offsetof(struct kdbus_item
, data
);
438 case KDBUS_ITEM_PAYLOAD_OFF
:
440 header
= (struct bus_header
*)((uint8_t*) k
+ d
->vec
.offset
);
441 header_size
= d
->vec
.size
;
444 footer
= (uint8_t*) k
+ d
->vec
.offset
;
445 footer_size
= d
->vec
.size
;
447 n_bytes
+= d
->vec
.size
;
448 last_was_memfd
= false;
451 case KDBUS_ITEM_PAYLOAD_MEMFD
:
452 if (!header
) /* memfd cannot be first part */
455 n_bytes
+= d
->memfd
.size
;
456 last_was_memfd
= true;
459 case KDBUS_ITEM_FDS
: {
464 f
= realloc(fds
, sizeof(int) * (n_fds
+ j
));
469 memcpy(fds
+ n_fds
, d
->fds
, sizeof(int) * j
);
474 case KDBUS_ITEM_SECLABEL
:
480 if (last_was_memfd
) /* memfd cannot be last part */
486 if (header_size
< sizeof(struct bus_header
))
489 /* on kdbus we only speak native endian gvariant, never dbus1
490 * marshalling or reverse endian */
491 if (header
->version
!= 2 ||
492 header
->endian
!= BUS_NATIVE_ENDIAN
)
495 r
= bus_message_from_header(
506 /* The well-known names list is different from the other
507 credentials. If we asked for it, but nothing is there, this
508 means that the list of well-known names is simply empty, not
509 that we lack any data */
511 m
->creds
.mask
|= (SD_BUS_CREDS_UNIQUE_NAME
|SD_BUS_CREDS_WELL_KNOWN_NAMES
) & bus
->creds_mask
;
513 KDBUS_ITEM_FOREACH(d
, k
, items
) {
516 l
= d
->size
- offsetof(struct kdbus_item
, data
);
520 case KDBUS_ITEM_PAYLOAD_OFF
: {
523 begin_body
= BUS_MESSAGE_BODY_BEGIN(m
);
525 if (idx
+ d
->vec
.size
> begin_body
) {
526 struct bus_body_part
*part
;
528 /* Contains body material */
530 part
= message_append_part(m
);
536 /* A -1 offset is NUL padding. */
537 part
->is_zero
= d
->vec
.offset
== ~0ULL;
539 if (idx
>= begin_body
) {
541 part
->data
= (uint8_t* )k
+ d
->vec
.offset
;
542 part
->size
= d
->vec
.size
;
545 part
->data
= (uint8_t*) k
+ d
->vec
.offset
+ (begin_body
- idx
);
546 part
->size
= d
->vec
.size
- (begin_body
- idx
);
556 case KDBUS_ITEM_PAYLOAD_MEMFD
: {
557 struct bus_body_part
*part
;
559 if (idx
< BUS_MESSAGE_BODY_BEGIN(m
)) {
564 part
= message_append_part(m
);
570 part
->memfd
= d
->memfd
.fd
;
571 part
->memfd_offset
= d
->memfd
.start
;
572 part
->size
= d
->memfd
.size
;
575 idx
+= d
->memfd
.size
;
579 case KDBUS_ITEM_PIDS
:
581 /* The PID/TID might be missing, when the data
582 * is faked by a bus proxy and it lacks that
583 * information about the real client (since
584 * SO_PEERCRED is used for that). Also kernel
585 * namespacing might make some of this data
586 * unavailable when untranslatable. */
588 if (d
->pids
.pid
> 0) {
589 m
->creds
.pid
= (pid_t
) d
->pids
.pid
;
590 m
->creds
.mask
|= SD_BUS_CREDS_PID
& bus
->creds_mask
;
593 if (d
->pids
.tid
> 0) {
594 m
->creds
.tid
= (pid_t
) d
->pids
.tid
;
595 m
->creds
.mask
|= SD_BUS_CREDS_TID
& bus
->creds_mask
;
598 if (d
->pids
.ppid
> 0) {
599 m
->creds
.ppid
= (pid_t
) d
->pids
.ppid
;
600 m
->creds
.mask
|= SD_BUS_CREDS_PPID
& bus
->creds_mask
;
605 case KDBUS_ITEM_CREDS
:
607 /* EUID/SUID/FSUID/EGID/SGID/FSGID might be
608 * missing too (see above). */
610 if ((uid_t
) d
->creds
.uid
!= UID_INVALID
) {
611 m
->creds
.uid
= (uid_t
) d
->creds
.uid
;
612 m
->creds
.mask
|= SD_BUS_CREDS_UID
& bus
->creds_mask
;
615 if ((uid_t
) d
->creds
.euid
!= UID_INVALID
) {
616 m
->creds
.euid
= (uid_t
) d
->creds
.euid
;
617 m
->creds
.mask
|= SD_BUS_CREDS_EUID
& bus
->creds_mask
;
620 if ((uid_t
) d
->creds
.suid
!= UID_INVALID
) {
621 m
->creds
.suid
= (uid_t
) d
->creds
.suid
;
622 m
->creds
.mask
|= SD_BUS_CREDS_SUID
& bus
->creds_mask
;
625 if ((uid_t
) d
->creds
.fsuid
!= UID_INVALID
) {
626 m
->creds
.fsuid
= (uid_t
) d
->creds
.fsuid
;
627 m
->creds
.mask
|= SD_BUS_CREDS_FSUID
& bus
->creds_mask
;
630 if ((gid_t
) d
->creds
.gid
!= GID_INVALID
) {
631 m
->creds
.gid
= (gid_t
) d
->creds
.gid
;
632 m
->creds
.mask
|= SD_BUS_CREDS_GID
& bus
->creds_mask
;
635 if ((gid_t
) d
->creds
.egid
!= GID_INVALID
) {
636 m
->creds
.egid
= (gid_t
) d
->creds
.egid
;
637 m
->creds
.mask
|= SD_BUS_CREDS_EGID
& bus
->creds_mask
;
640 if ((gid_t
) d
->creds
.sgid
!= GID_INVALID
) {
641 m
->creds
.sgid
= (gid_t
) d
->creds
.sgid
;
642 m
->creds
.mask
|= SD_BUS_CREDS_SGID
& bus
->creds_mask
;
645 if ((gid_t
) d
->creds
.fsgid
!= GID_INVALID
) {
646 m
->creds
.fsgid
= (gid_t
) d
->creds
.fsgid
;
647 m
->creds
.mask
|= SD_BUS_CREDS_FSGID
& bus
->creds_mask
;
652 case KDBUS_ITEM_TIMESTAMP
:
653 message_set_timestamp(bus
, m
, &d
->timestamp
);
656 case KDBUS_ITEM_PID_COMM
:
657 m
->creds
.comm
= d
->str
;
658 m
->creds
.mask
|= SD_BUS_CREDS_COMM
& bus
->creds_mask
;
661 case KDBUS_ITEM_TID_COMM
:
662 m
->creds
.tid_comm
= d
->str
;
663 m
->creds
.mask
|= SD_BUS_CREDS_TID_COMM
& bus
->creds_mask
;
667 m
->creds
.exe
= d
->str
;
668 m
->creds
.mask
|= SD_BUS_CREDS_EXE
& bus
->creds_mask
;
671 case KDBUS_ITEM_CMDLINE
:
672 m
->creds
.cmdline
= d
->str
;
673 m
->creds
.cmdline_size
= l
;
674 m
->creds
.mask
|= SD_BUS_CREDS_CMDLINE
& bus
->creds_mask
;
677 case KDBUS_ITEM_CGROUP
:
678 m
->creds
.cgroup
= d
->str
;
679 m
->creds
.mask
|= (SD_BUS_CREDS_CGROUP
|SD_BUS_CREDS_UNIT
|SD_BUS_CREDS_USER_UNIT
|SD_BUS_CREDS_SLICE
|SD_BUS_CREDS_SESSION
|SD_BUS_CREDS_OWNER_UID
) & bus
->creds_mask
;
681 r
= bus_get_root_path(bus
);
685 m
->creds
.cgroup_root
= bus
->cgroup_root
;
688 case KDBUS_ITEM_AUDIT
:
689 if ((uint32_t) d
->audit
.sessionid
!= (uint32_t) -1) {
690 m
->creds
.audit_session_id
= (uint32_t) d
->audit
.sessionid
;
691 m
->creds
.mask
|= SD_BUS_CREDS_AUDIT_SESSION_ID
& bus
->creds_mask
;
694 if ((uid_t
) d
->audit
.loginuid
!= UID_INVALID
) {
695 m
->creds
.audit_login_uid
= (uid_t
) d
->audit
.loginuid
;
696 m
->creds
.mask
|= SD_BUS_CREDS_AUDIT_LOGIN_UID
& bus
->creds_mask
;
700 case KDBUS_ITEM_CAPS
:
701 if (d
->caps
.last_cap
!= cap_last_cap() ||
702 d
->size
- offsetof(struct kdbus_item
, caps
.caps
) < DIV_ROUND_UP(d
->caps
.last_cap
, 32U) * 4 * 4) {
707 m
->creds
.capability
= d
->caps
.caps
;
708 m
->creds
.mask
|= (SD_BUS_CREDS_EFFECTIVE_CAPS
|SD_BUS_CREDS_PERMITTED_CAPS
|SD_BUS_CREDS_INHERITABLE_CAPS
|SD_BUS_CREDS_BOUNDING_CAPS
) & bus
->creds_mask
;
711 case KDBUS_ITEM_DST_NAME
:
712 if (!service_name_is_valid(d
->str
)) {
717 destination
= d
->str
;
720 case KDBUS_ITEM_OWNED_NAME
:
721 if (!service_name_is_valid(d
->name
.name
)) {
726 if (bus
->creds_mask
& SD_BUS_CREDS_WELL_KNOWN_NAMES
) {
730 /* We just extend the array here, but
731 * do not allocate the strings inside
732 * of it, instead we just point to our
733 * buffer directly. */
734 n
= strv_length(m
->creds
.well_known_names
);
735 wkn
= realloc(m
->creds
.well_known_names
, (n
+ 2) * sizeof(char*));
741 wkn
[n
] = d
->name
.name
;
743 m
->creds
.well_known_names
= wkn
;
745 m
->creds
.mask
|= SD_BUS_CREDS_WELL_KNOWN_NAMES
;
749 case KDBUS_ITEM_CONN_DESCRIPTION
:
750 m
->creds
.description
= d
->str
;
751 m
->creds
.mask
|= SD_BUS_CREDS_DESCRIPTION
& bus
->creds_mask
;
754 case KDBUS_ITEM_AUXGROUPS
:
756 if (bus
->creds_mask
& SD_BUS_CREDS_SUPPLEMENTARY_GIDS
) {
760 n
= (d
->size
- offsetof(struct kdbus_item
, data64
)) / sizeof(uint64_t);
767 for (i
= 0; i
< n
; i
++)
770 m
->creds
.supplementary_gids
= g
;
771 m
->creds
.n_supplementary_gids
= n
;
772 m
->creds
.mask
|= SD_BUS_CREDS_SUPPLEMENTARY_GIDS
;
778 case KDBUS_ITEM_SECLABEL
:
782 log_debug("Got unknown field from kernel %llu", d
->type
);
786 /* If we requested the list of well-known names to be appended
787 * and the sender had none no item for it will be
788 * attached. However, this does *not* mean that the kernel
789 * didn't want to provide this information to us. Hence, let's
790 * explicitly mark this information as available if it was
792 m
->creds
.mask
|= bus
->creds_mask
& SD_BUS_CREDS_WELL_KNOWN_NAMES
;
794 r
= bus_message_parse_fields(m
);
798 /* Refuse messages if kdbus and dbus1 cookie doesn't match up */
799 if ((uint64_t) m
->header
->dbus2
.cookie
!= k
->cookie
) {
804 /* Refuse messages where the reply flag doesn't match up */
805 if (!(m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
) != !!(k
->flags
& KDBUS_MSG_EXPECT_REPLY
)) {
810 /* Refuse reply messages where the reply cookie doesn't match up */
811 if ((m
->header
->flags
& BUS_MESSAGE_NO_REPLY_EXPECTED
) && m
->reply_cookie
!= k
->cookie_reply
) {
816 /* Refuse messages where the autostart flag doesn't match up */
817 if (!(m
->header
->flags
& BUS_MESSAGE_NO_AUTO_START
) != !(k
->flags
& KDBUS_MSG_NO_AUTO_START
)) {
822 /* Override information from the user header with data from the kernel */
823 if (k
->src_id
== KDBUS_SRC_ID_KERNEL
)
824 bus_message_set_sender_driver(bus
, m
);
826 snprintf(m
->sender_buffer
, sizeof(m
->sender_buffer
), ":1.%llu", (unsigned long long) k
->src_id
);
827 m
->sender
= m
->creds
.unique_name
= m
->sender_buffer
;
831 m
->destination
= destination
;
832 else if (k
->dst_id
== KDBUS_DST_ID_BROADCAST
)
833 m
->destination
= NULL
;
834 else if (k
->dst_id
== KDBUS_DST_ID_NAME
)
835 m
->destination
= bus
->unique_name
; /* fill in unique name if the well-known name is missing */
837 snprintf(m
->destination_buffer
, sizeof(m
->destination_buffer
), ":1.%llu", (unsigned long long) k
->dst_id
);
838 m
->destination
= m
->destination_buffer
;
841 /* We take possession of the kmsg struct now */
843 m
->release_kdbus
= true;
847 bus
->rqueue
[bus
->rqueue_size
++] = m
;
853 sd_bus_message_unref(m
);
858 int bus_kernel_take_fd(sd_bus
*b
) {
859 struct kdbus_bloom_parameter
*bloom
= NULL
;
860 struct kdbus_item
*items
, *item
;
861 struct kdbus_cmd_hello
*hello
;
862 _cleanup_free_
char *g
= NULL
;
864 size_t l
= 0, m
= 0, sz
;
874 if (b
->description
) {
875 g
= bus_label_escape(b
->description
);
883 /* If no name is explicitly set, we'll include a hint
884 * indicating the library implementation, a hint which
885 * kind of bus this is and the thread name */
887 assert_se(prctl(PR_GET_NAME
, (unsigned long) pr
) >= 0);
890 name
= b
->is_system
? "sd-system" :
891 b
->is_user
? "sd-user" : "sd";
893 _cleanup_free_
char *e
= NULL
;
895 e
= bus_label_escape(pr
);
899 g
= strappend(b
->is_system
? "sd-system-" :
900 b
->is_user
? "sd-user-" : "sd-",
908 b
->description
= bus_label_unescape(name
);
915 sz
= ALIGN8(offsetof(struct kdbus_cmd_hello
, items
)) +
916 ALIGN8(offsetof(struct kdbus_item
, str
) + m
+ 1);
918 if (b
->fake_creds_valid
)
919 sz
+= ALIGN8(offsetof(struct kdbus_item
, creds
) + sizeof(struct kdbus_creds
));
921 if (b
->fake_pids_valid
)
922 sz
+= ALIGN8(offsetof(struct kdbus_item
, pids
) + sizeof(struct kdbus_pids
));
925 l
= strlen(b
->fake_label
);
926 sz
+= ALIGN8(offsetof(struct kdbus_item
, str
) + l
+ 1);
929 hello
= alloca0_align(sz
, 8);
931 hello
->flags
= b
->hello_flags
;
932 hello
->attach_flags_send
= _KDBUS_ATTACH_ANY
;
933 hello
->attach_flags_recv
= b
->attach_flags
;
934 hello
->pool_size
= KDBUS_POOL_SIZE
;
938 item
->size
= offsetof(struct kdbus_item
, str
) + m
+ 1;
939 item
->type
= KDBUS_ITEM_CONN_DESCRIPTION
;
940 memcpy(item
->str
, name
, m
+ 1);
941 item
= KDBUS_ITEM_NEXT(item
);
943 if (b
->fake_creds_valid
) {
944 item
->size
= offsetof(struct kdbus_item
, creds
) + sizeof(struct kdbus_creds
);
945 item
->type
= KDBUS_ITEM_CREDS
;
946 item
->creds
= b
->fake_creds
;
948 item
= KDBUS_ITEM_NEXT(item
);
951 if (b
->fake_pids_valid
) {
952 item
->size
= offsetof(struct kdbus_item
, pids
) + sizeof(struct kdbus_pids
);
953 item
->type
= KDBUS_ITEM_PIDS
;
954 item
->pids
= b
->fake_pids
;
956 item
= KDBUS_ITEM_NEXT(item
);
960 item
->size
= offsetof(struct kdbus_item
, str
) + l
+ 1;
961 item
->type
= KDBUS_ITEM_SECLABEL
;
962 memcpy(item
->str
, b
->fake_label
, l
+1);
965 r
= ioctl(b
->input_fd
, KDBUS_CMD_HELLO
, hello
);
969 if (!b
->kdbus_buffer
) {
970 b
->kdbus_buffer
= mmap(NULL
, KDBUS_POOL_SIZE
, PROT_READ
, MAP_SHARED
, b
->input_fd
, 0);
971 if (b
->kdbus_buffer
== MAP_FAILED
) {
972 b
->kdbus_buffer
= NULL
;
978 /* The higher 32bit of the bus_flags fields are considered
979 * 'incompatible flags'. Refuse them all for now. */
980 if (hello
->bus_flags
> 0xFFFFFFFFULL
) {
985 /* extract bloom parameters from items */
986 items
= (void*)((uint8_t*)b
->kdbus_buffer
+ hello
->offset
);
987 KDBUS_FOREACH(item
, items
, hello
->items_size
) {
988 switch (item
->type
) {
989 case KDBUS_ITEM_BLOOM_PARAMETER
:
990 bloom
= &item
->bloom_parameter
;
995 if (!bloom
|| !bloom_validate_parameters((size_t) bloom
->size
, (unsigned) bloom
->n_hash
)) {
1000 b
->bloom_size
= (size_t) bloom
->size
;
1001 b
->bloom_n_hash
= (unsigned) bloom
->n_hash
;
1003 if (asprintf(&b
->unique_name
, ":1.%llu", (unsigned long long) hello
->id
) < 0) {
1008 b
->unique_id
= hello
->id
;
1010 b
->is_kernel
= true;
1011 b
->bus_client
= true;
1012 b
->can_fds
= !!(hello
->flags
& KDBUS_HELLO_ACCEPT_FD
);
1013 b
->message_version
= 2;
1014 b
->message_endian
= BUS_NATIVE_ENDIAN
;
1016 /* the kernel told us the UUID of the underlying bus */
1017 memcpy(b
->server_id
.bytes
, hello
->id128
, sizeof(b
->server_id
.bytes
));
1019 /* free returned items */
1020 (void) bus_kernel_cmd_free(b
, hello
->offset
);
1021 return bus_start_running(b
);
1024 (void) bus_kernel_cmd_free(b
, hello
->offset
);
1028 int bus_kernel_connect(sd_bus
*b
) {
1030 assert(b
->input_fd
< 0);
1031 assert(b
->output_fd
< 0);
1037 b
->input_fd
= open(b
->kernel
, O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
1038 if (b
->input_fd
< 0)
1041 b
->output_fd
= b
->input_fd
;
1043 return bus_kernel_take_fd(b
);
1046 int bus_kernel_cmd_free(sd_bus
*bus
, uint64_t offset
) {
1047 struct kdbus_cmd_free cmd
= {
1048 .size
= sizeof(cmd
),
1054 assert(bus
->is_kernel
);
1056 r
= ioctl(bus
->input_fd
, KDBUS_CMD_FREE
, &cmd
);
1063 static void close_kdbus_msg(sd_bus
*bus
, struct kdbus_msg
*k
) {
1064 struct kdbus_item
*d
;
1069 KDBUS_ITEM_FOREACH(d
, k
, items
) {
1070 if (d
->type
== KDBUS_ITEM_FDS
)
1071 close_many(d
->fds
, (d
->size
- offsetof(struct kdbus_item
, fds
)) / sizeof(int));
1072 else if (d
->type
== KDBUS_ITEM_PAYLOAD_MEMFD
)
1073 safe_close(d
->memfd
.fd
);
1076 bus_kernel_cmd_free(bus
, (uint8_t*) k
- (uint8_t*) bus
->kdbus_buffer
);
1079 int bus_kernel_write_message(sd_bus
*bus
, sd_bus_message
*m
, bool hint_sync_call
) {
1080 struct kdbus_cmd_send cmd
= { };
1085 assert(bus
->state
== BUS_RUNNING
);
1087 /* If we can't deliver, we want room for the error message */
1088 r
= bus_rqueue_make_room(bus
);
1092 r
= bus_message_setup_kmsg(bus
, m
);
1096 cmd
.size
= sizeof(cmd
);
1097 cmd
.msg_address
= (uintptr_t)m
->kdbus
;
1099 /* If this is a synchronous method call, then let's tell the
1100 * kernel, so that it can pass CPU time/scheduling to the
1101 * destination for the time, if it wants to. If we
1102 * synchronously wait for the result anyway, we won't need CPU
1104 if (hint_sync_call
) {
1105 m
->kdbus
->flags
|= KDBUS_MSG_EXPECT_REPLY
;
1106 cmd
.flags
|= KDBUS_SEND_SYNC_REPLY
;
1109 r
= ioctl(bus
->output_fd
, KDBUS_CMD_SEND
, &cmd
);
1111 _cleanup_bus_error_free_ sd_bus_error error
= SD_BUS_ERROR_NULL
;
1112 sd_bus_message
*reply
;
1114 if (errno
== EAGAIN
|| errno
== EINTR
)
1116 else if (errno
== ENXIO
|| errno
== ESRCH
) {
1118 /* ENXIO: unique name not known
1119 * ESRCH: well-known name not known */
1121 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
)
1122 sd_bus_error_setf(&error
, SD_BUS_ERROR_SERVICE_UNKNOWN
, "Destination %s not known", m
->destination
);
1124 log_debug("Could not deliver message to %s as destination is not known. Ignoring.", m
->destination
);
1128 } else if (errno
== EADDRNOTAVAIL
) {
1130 /* EADDRNOTAVAIL: activation is possible, but turned off in request flags */
1132 if (m
->header
->type
== SD_BUS_MESSAGE_METHOD_CALL
)
1133 sd_bus_error_setf(&error
, SD_BUS_ERROR_SERVICE_UNKNOWN
, "Activation of %s not requested", m
->destination
);
1135 log_debug("Could not deliver message to %s as destination is not activated. Ignoring.", m
->destination
);
1141 r
= bus_message_new_synthetic_error(
1143 BUS_MESSAGE_COOKIE(m
),
1150 r
= bus_seal_synthetic_message(bus
, reply
);
1154 bus
->rqueue
[bus
->rqueue_size
++] = reply
;
1156 } else if (hint_sync_call
) {
1157 struct kdbus_msg
*k
;
1159 k
= (struct kdbus_msg
*)((uint8_t *)bus
->kdbus_buffer
+ cmd
.reply
.offset
);
1162 if (k
->payload_type
== KDBUS_PAYLOAD_DBUS
) {
1164 r
= bus_kernel_make_message(bus
, k
);
1166 close_kdbus_msg(bus
, k
);
1168 /* Anybody can send us invalid messages, let's just drop them. */
1169 if (r
== -EBADMSG
|| r
== -EPROTOTYPE
)
1170 log_debug_errno(r
, "Ignoring invalid synchronous reply: %m");
1175 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k
->payload_type
);
1176 close_kdbus_msg(bus
, k
);
1183 static int push_name_owner_changed(
1186 const char *old_owner
,
1187 const char *new_owner
,
1188 const struct kdbus_timestamp
*ts
) {
1190 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
1195 r
= sd_bus_message_new_signal(
1198 "/org/freedesktop/DBus",
1199 "org.freedesktop.DBus",
1200 "NameOwnerChanged");
1204 r
= sd_bus_message_append(m
, "sss", name
, old_owner
, new_owner
);
1208 bus_message_set_sender_driver(bus
, m
);
1209 message_set_timestamp(bus
, m
, ts
);
1211 r
= bus_seal_synthetic_message(bus
, m
);
1215 bus
->rqueue
[bus
->rqueue_size
++] = m
;
1221 static int translate_name_change(
1223 const struct kdbus_msg
*k
,
1224 const struct kdbus_item
*d
,
1225 const struct kdbus_timestamp
*ts
) {
1227 char new_owner
[UNIQUE_NAME_MAX
], old_owner
[UNIQUE_NAME_MAX
];
1233 if (d
->type
== KDBUS_ITEM_NAME_ADD
|| (d
->name_change
.old_id
.flags
& (KDBUS_NAME_IN_QUEUE
|KDBUS_NAME_ACTIVATOR
)))
1236 sprintf(old_owner
, ":1.%llu", (unsigned long long) d
->name_change
.old_id
.id
);
1238 if (d
->type
== KDBUS_ITEM_NAME_REMOVE
|| (d
->name_change
.new_id
.flags
& (KDBUS_NAME_IN_QUEUE
|KDBUS_NAME_ACTIVATOR
))) {
1240 if (isempty(old_owner
))
1245 sprintf(new_owner
, ":1.%llu", (unsigned long long) d
->name_change
.new_id
.id
);
1247 return push_name_owner_changed(bus
, d
->name_change
.name
, old_owner
, new_owner
, ts
);
1250 static int translate_id_change(
1252 const struct kdbus_msg
*k
,
1253 const struct kdbus_item
*d
,
1254 const struct kdbus_timestamp
*ts
) {
1256 char owner
[UNIQUE_NAME_MAX
];
1262 sprintf(owner
, ":1.%llu", d
->id_change
.id
);
1264 return push_name_owner_changed(
1266 d
->type
== KDBUS_ITEM_ID_ADD
? NULL
: owner
,
1267 d
->type
== KDBUS_ITEM_ID_ADD
? owner
: NULL
,
1271 static int translate_reply(
1273 const struct kdbus_msg
*k
,
1274 const struct kdbus_item
*d
,
1275 const struct kdbus_timestamp
*ts
) {
1277 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
1284 r
= bus_message_new_synthetic_error(
1287 d
->type
== KDBUS_ITEM_REPLY_TIMEOUT
?
1288 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call timed out") :
1289 &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY
, "Method call peer died"),
1294 message_set_timestamp(bus
, m
, ts
);
1296 r
= bus_seal_synthetic_message(bus
, m
);
1300 bus
->rqueue
[bus
->rqueue_size
++] = m
;
1306 static int bus_kernel_translate_message(sd_bus
*bus
, struct kdbus_msg
*k
) {
1307 static int (* const translate
[])(sd_bus
*bus
, const struct kdbus_msg
*k
, const struct kdbus_item
*d
, const struct kdbus_timestamp
*ts
) = {
1308 [KDBUS_ITEM_NAME_ADD
- _KDBUS_ITEM_KERNEL_BASE
] = translate_name_change
,
1309 [KDBUS_ITEM_NAME_REMOVE
- _KDBUS_ITEM_KERNEL_BASE
] = translate_name_change
,
1310 [KDBUS_ITEM_NAME_CHANGE
- _KDBUS_ITEM_KERNEL_BASE
] = translate_name_change
,
1312 [KDBUS_ITEM_ID_ADD
- _KDBUS_ITEM_KERNEL_BASE
] = translate_id_change
,
1313 [KDBUS_ITEM_ID_REMOVE
- _KDBUS_ITEM_KERNEL_BASE
] = translate_id_change
,
1315 [KDBUS_ITEM_REPLY_TIMEOUT
- _KDBUS_ITEM_KERNEL_BASE
] = translate_reply
,
1316 [KDBUS_ITEM_REPLY_DEAD
- _KDBUS_ITEM_KERNEL_BASE
] = translate_reply
,
1319 struct kdbus_item
*d
, *found
= NULL
;
1320 struct kdbus_timestamp
*ts
= NULL
;
1324 assert(k
->payload_type
== KDBUS_PAYLOAD_KERNEL
);
1326 KDBUS_ITEM_FOREACH(d
, k
, items
) {
1327 if (d
->type
== KDBUS_ITEM_TIMESTAMP
)
1330 if (d
->type
>= _KDBUS_ITEM_KERNEL_BASE
&& d
->type
< _KDBUS_ITEM_KERNEL_BASE
+ ELEMENTSOF(translate
)) {
1335 log_debug("Got unknown field from kernel %llu", d
->type
);
1339 log_debug("Didn't find a kernel message to translate.");
1343 return translate
[found
->type
- _KDBUS_ITEM_KERNEL_BASE
](bus
, k
, found
, ts
);
1346 int bus_kernel_read_message(sd_bus
*bus
, bool hint_priority
, int64_t priority
) {
1347 struct kdbus_cmd_recv recv
= { .size
= sizeof(recv
) };
1348 struct kdbus_msg
*k
;
1353 r
= bus_rqueue_make_room(bus
);
1357 if (hint_priority
) {
1358 recv
.flags
|= KDBUS_RECV_USE_PRIORITY
;
1359 recv
.priority
= priority
;
1362 r
= ioctl(bus
->input_fd
, KDBUS_CMD_RECV
, &recv
);
1363 if (recv
.return_flags
& KDBUS_RECV_RETURN_DROPPED_MSGS
)
1364 log_debug("%s: kdbus reports %" PRIu64
" dropped broadcast messages, ignoring.", strna(bus
->description
), (uint64_t) recv
.dropped_msgs
);
1366 if (errno
== EAGAIN
)
1372 k
= (struct kdbus_msg
*)((uint8_t *)bus
->kdbus_buffer
+ recv
.msg
.offset
);
1373 if (k
->payload_type
== KDBUS_PAYLOAD_DBUS
) {
1374 r
= bus_kernel_make_message(bus
, k
);
1376 /* Anybody can send us invalid messages, let's just drop them. */
1377 if (r
== -EBADMSG
|| r
== -EPROTOTYPE
) {
1378 log_debug_errno(r
, "Ignoring invalid message: %m");
1382 } else if (k
->payload_type
== KDBUS_PAYLOAD_KERNEL
)
1383 r
= bus_kernel_translate_message(bus
, k
);
1385 log_debug("Ignoring message with unknown payload type %llu.", (unsigned long long) k
->payload_type
);
1390 close_kdbus_msg(bus
, k
);
1392 return r
< 0 ? r
: 1;
1395 int bus_kernel_pop_memfd(sd_bus
*bus
, void **address
, size_t *mapped
, size_t *allocated
) {
1396 struct memfd_cache
*c
;
1403 if (!bus
|| !bus
->is_kernel
)
1406 assert_se(pthread_mutex_lock(&bus
->memfd_cache_mutex
) >= 0);
1408 if (bus
->n_memfd_cache
<= 0) {
1411 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) >= 0);
1413 r
= memfd_new(bus
->description
);
1423 c
= &bus
->memfd_cache
[--bus
->n_memfd_cache
];
1426 assert(c
->mapped
== 0 || c
->address
);
1428 *address
= c
->address
;
1429 *mapped
= c
->mapped
;
1430 *allocated
= c
->allocated
;
1433 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) >= 0);
1438 static void close_and_munmap(int fd
, void *address
, size_t size
) {
1440 assert_se(munmap(address
, PAGE_ALIGN(size
)) >= 0);
1445 void bus_kernel_push_memfd(sd_bus
*bus
, int fd
, void *address
, size_t mapped
, size_t allocated
) {
1446 struct memfd_cache
*c
;
1447 uint64_t max_mapped
= PAGE_ALIGN(MEMFD_CACHE_ITEM_SIZE_MAX
);
1450 assert(mapped
== 0 || address
);
1452 if (!bus
|| !bus
->is_kernel
) {
1453 close_and_munmap(fd
, address
, mapped
);
1457 assert_se(pthread_mutex_lock(&bus
->memfd_cache_mutex
) >= 0);
1459 if (bus
->n_memfd_cache
>= ELEMENTSOF(bus
->memfd_cache
)) {
1460 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) >= 0);
1462 close_and_munmap(fd
, address
, mapped
);
1466 c
= &bus
->memfd_cache
[bus
->n_memfd_cache
++];
1468 c
->address
= address
;
1470 /* If overly long, let's return a bit to the OS */
1471 if (mapped
> max_mapped
) {
1472 assert_se(memfd_set_size(fd
, max_mapped
) >= 0);
1473 assert_se(munmap((uint8_t*) address
+ max_mapped
, PAGE_ALIGN(mapped
- max_mapped
)) >= 0);
1474 c
->mapped
= c
->allocated
= max_mapped
;
1477 c
->allocated
= allocated
;
1480 assert_se(pthread_mutex_unlock(&bus
->memfd_cache_mutex
) >= 0);
1483 void bus_kernel_flush_memfd(sd_bus
*b
) {
1488 for (i
= 0; i
< b
->n_memfd_cache
; i
++)
1489 close_and_munmap(b
->memfd_cache
[i
].fd
, b
->memfd_cache
[i
].address
, b
->memfd_cache
[i
].mapped
);
1492 uint64_t request_name_flags_to_kdbus(uint64_t flags
) {
1495 if (flags
& SD_BUS_NAME_ALLOW_REPLACEMENT
)
1496 f
|= KDBUS_NAME_ALLOW_REPLACEMENT
;
1498 if (flags
& SD_BUS_NAME_REPLACE_EXISTING
)
1499 f
|= KDBUS_NAME_REPLACE_EXISTING
;
1501 if (flags
& SD_BUS_NAME_QUEUE
)
1502 f
|= KDBUS_NAME_QUEUE
;
1507 uint64_t attach_flags_to_kdbus(uint64_t mask
) {
1510 if (mask
& (SD_BUS_CREDS_UID
|SD_BUS_CREDS_EUID
|SD_BUS_CREDS_SUID
|SD_BUS_CREDS_FSUID
|
1511 SD_BUS_CREDS_GID
|SD_BUS_CREDS_EGID
|SD_BUS_CREDS_SGID
|SD_BUS_CREDS_FSGID
))
1512 m
|= KDBUS_ATTACH_CREDS
;
1514 if (mask
& (SD_BUS_CREDS_PID
|SD_BUS_CREDS_TID
|SD_BUS_CREDS_PPID
))
1515 m
|= KDBUS_ATTACH_PIDS
;
1517 if (mask
& SD_BUS_CREDS_COMM
)
1518 m
|= KDBUS_ATTACH_PID_COMM
;
1520 if (mask
& SD_BUS_CREDS_TID_COMM
)
1521 m
|= KDBUS_ATTACH_TID_COMM
;
1523 if (mask
& SD_BUS_CREDS_EXE
)
1524 m
|= KDBUS_ATTACH_EXE
;
1526 if (mask
& SD_BUS_CREDS_CMDLINE
)
1527 m
|= KDBUS_ATTACH_CMDLINE
;
1529 if (mask
& (SD_BUS_CREDS_CGROUP
|SD_BUS_CREDS_UNIT
|SD_BUS_CREDS_USER_UNIT
|SD_BUS_CREDS_SLICE
|SD_BUS_CREDS_SESSION
|SD_BUS_CREDS_OWNER_UID
))
1530 m
|= KDBUS_ATTACH_CGROUP
;
1532 if (mask
& (SD_BUS_CREDS_EFFECTIVE_CAPS
|SD_BUS_CREDS_PERMITTED_CAPS
|SD_BUS_CREDS_INHERITABLE_CAPS
|SD_BUS_CREDS_BOUNDING_CAPS
))
1533 m
|= KDBUS_ATTACH_CAPS
;
1535 if (mask
& SD_BUS_CREDS_SELINUX_CONTEXT
)
1536 m
|= KDBUS_ATTACH_SECLABEL
;
1538 if (mask
& (SD_BUS_CREDS_AUDIT_SESSION_ID
|SD_BUS_CREDS_AUDIT_LOGIN_UID
))
1539 m
|= KDBUS_ATTACH_AUDIT
;
1541 if (mask
& SD_BUS_CREDS_WELL_KNOWN_NAMES
)
1542 m
|= KDBUS_ATTACH_NAMES
;
1544 if (mask
& SD_BUS_CREDS_DESCRIPTION
)
1545 m
|= KDBUS_ATTACH_CONN_DESCRIPTION
;
1547 if (mask
& SD_BUS_CREDS_SUPPLEMENTARY_GIDS
)
1548 m
|= KDBUS_ATTACH_AUXGROUPS
;
1553 int bus_kernel_create_bus(const char *name
, bool world
, char **s
) {
1554 struct kdbus_cmd
*make
;
1555 struct kdbus_item
*n
;
1562 fd
= open("/sys/fs/kdbus/control", O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
1567 make
= alloca0_align(offsetof(struct kdbus_cmd
, items
) +
1568 ALIGN8(offsetof(struct kdbus_item
, bloom_parameter
) + sizeof(struct kdbus_bloom_parameter
)) +
1569 ALIGN8(offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t)) +
1570 ALIGN8(offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t)) +
1571 ALIGN8(offsetof(struct kdbus_item
, str
) + DECIMAL_STR_MAX(uid_t
) + 1 + l
+ 1),
1574 make
->size
= offsetof(struct kdbus_cmd
, items
);
1576 /* Set the bloom parameters */
1578 n
->size
= offsetof(struct kdbus_item
, bloom_parameter
) +
1579 sizeof(struct kdbus_bloom_parameter
);
1580 n
->type
= KDBUS_ITEM_BLOOM_PARAMETER
;
1581 n
->bloom_parameter
.size
= DEFAULT_BLOOM_SIZE
;
1582 n
->bloom_parameter
.n_hash
= DEFAULT_BLOOM_N_HASH
;
1584 assert_cc(DEFAULT_BLOOM_SIZE
> 0);
1585 assert_cc(DEFAULT_BLOOM_N_HASH
> 0);
1587 make
->size
+= ALIGN8(n
->size
);
1589 /* The busses we create make no restrictions on what metadata
1590 * peers can read from incoming messages. */
1591 n
= KDBUS_ITEM_NEXT(n
);
1592 n
->type
= KDBUS_ITEM_ATTACH_FLAGS_RECV
;
1593 n
->size
= offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t);
1594 n
->data64
[0] = _KDBUS_ATTACH_ANY
;
1595 make
->size
+= ALIGN8(n
->size
);
1597 /* Provide all metadata via bus-owner queries */
1598 n
= KDBUS_ITEM_NEXT(n
);
1599 n
->type
= KDBUS_ITEM_ATTACH_FLAGS_SEND
;
1600 n
->size
= offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t);
1601 n
->data64
[0] = _KDBUS_ATTACH_ANY
;
1602 make
->size
+= ALIGN8(n
->size
);
1604 /* Set the a good name */
1605 n
= KDBUS_ITEM_NEXT(n
);
1606 sprintf(n
->str
, UID_FMT
"-%s", getuid(), name
);
1607 n
->size
= offsetof(struct kdbus_item
, str
) + strlen(n
->str
) + 1;
1608 n
->type
= KDBUS_ITEM_MAKE_NAME
;
1609 make
->size
+= ALIGN8(n
->size
);
1611 make
->flags
= world
? KDBUS_MAKE_ACCESS_WORLD
: 0;
1613 if (ioctl(fd
, KDBUS_CMD_BUS_MAKE
, make
) < 0) {
1621 p
= strjoin("/sys/fs/kdbus/", n
->str
, "/bus", NULL
);
1633 int bus_kernel_open_bus_fd(const char *bus
, char **path
) {
1640 len
= strlen("/sys/fs/kdbus/") + DECIMAL_STR_MAX(uid_t
) + 1 + strlen(bus
) + strlen("/bus") + 1;
1647 p
= newa(char, len
);
1649 sprintf(p
, "/sys/fs/kdbus/" UID_FMT
"-%s/bus", getuid(), bus
);
1651 fd
= open(p
, O_RDWR
|O_NOCTTY
|O_CLOEXEC
);
1665 int bus_kernel_create_endpoint(const char *bus_name
, const char *ep_name
, char **ep_path
) {
1666 _cleanup_free_
char *path
= NULL
;
1667 struct kdbus_cmd
*make
;
1668 struct kdbus_item
*n
;
1672 fd
= bus_kernel_open_bus_fd(bus_name
, &path
);
1676 make
= alloca0_align(ALIGN8(offsetof(struct kdbus_cmd
, items
)) +
1677 ALIGN8(offsetof(struct kdbus_item
, str
) + DECIMAL_STR_MAX(uid_t
) + 1 + strlen(ep_name
) + 1),
1679 make
->size
= ALIGN8(offsetof(struct kdbus_cmd
, items
));
1680 make
->flags
= KDBUS_MAKE_ACCESS_WORLD
;
1683 sprintf(n
->str
, UID_FMT
"-%s", getuid(), ep_name
);
1684 n
->size
= offsetof(struct kdbus_item
, str
) + strlen(n
->str
) + 1;
1685 n
->type
= KDBUS_ITEM_MAKE_NAME
;
1686 make
->size
+= ALIGN8(n
->size
);
1689 if (ioctl(fd
, KDBUS_CMD_ENDPOINT_MAKE
, make
) < 0) {
1697 p
= strjoin(dirname(path
), "/", name
, NULL
);
1709 int bus_kernel_try_close(sd_bus
*bus
) {
1710 struct kdbus_cmd byebye
= { .size
= sizeof(byebye
) };
1713 assert(bus
->is_kernel
);
1715 if (ioctl(bus
->input_fd
, KDBUS_CMD_BYEBYE
, &byebye
) < 0)
1721 int bus_kernel_drop_one(int fd
) {
1722 struct kdbus_cmd_recv recv
= {
1723 .size
= sizeof(recv
),
1724 .flags
= KDBUS_RECV_DROP
,
1729 if (ioctl(fd
, KDBUS_CMD_RECV
, &recv
) < 0)
1735 int bus_kernel_realize_attach_flags(sd_bus
*bus
) {
1736 struct kdbus_cmd
*update
;
1737 struct kdbus_item
*n
;
1740 assert(bus
->is_kernel
);
1742 update
= alloca0_align(offsetof(struct kdbus_cmd
, items
) +
1743 ALIGN8(offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t)),
1747 n
->type
= KDBUS_ITEM_ATTACH_FLAGS_RECV
;
1748 n
->size
= offsetof(struct kdbus_item
, data64
) + sizeof(uint64_t);
1749 n
->data64
[0] = bus
->attach_flags
;
1752 offsetof(struct kdbus_cmd
, items
) +
1755 if (ioctl(bus
->input_fd
, KDBUS_CMD_UPDATE
, update
) < 0)
1761 int bus_kernel_fix_attach_mask(void) {
1762 _cleanup_free_
char *mask
= NULL
;
1763 uint64_t m
= (uint64_t) -1;
1767 /* By default we don't want any kdbus metadata fields to be
1768 * suppressed, hence we reset the kernel mask for it to
1769 * (uint64_t) -1. If the module argument was overwritten by
1770 * the kernel cmdline, we leave it as is. */
1772 r
= get_proc_cmdline_key("kdbus.attach_flags_mask=", &mask
);
1774 return log_warning_errno(r
, "Failed to read kernel command line: %m");
1777 sprintf(buf
, "0x%" PRIx64
"\n", m
);
1778 r
= write_string_file("/sys/module/kdbus/parameters/attach_flags_mask", buf
);
1780 return log_full_errno(IN_SET(r
, -ENOENT
, -EROFS
) ? LOG_DEBUG
: LOG_WARNING
, r
,
1781 "Failed to write kdbus attach mask: %m");
1787 int bus_kernel_get_bus_name(sd_bus
*bus
, char **name
) {
1788 struct kdbus_cmd_info cmd
= {
1789 .size
= sizeof(struct kdbus_cmd_info
),
1791 struct kdbus_info
*info
;
1792 struct kdbus_item
*item
;
1798 assert(bus
->is_kernel
);
1800 r
= ioctl(bus
->input_fd
, KDBUS_CMD_BUS_CREATOR_INFO
, &cmd
);
1804 info
= (struct kdbus_info
*) ((uint8_t*) bus
->kdbus_buffer
+ cmd
.offset
);
1806 KDBUS_ITEM_FOREACH(item
, info
, items
)
1807 if (item
->type
== KDBUS_ITEM_MAKE_NAME
) {
1808 r
= free_and_strdup(&n
, item
->str
);
1812 bus_kernel_cmd_free(bus
, cmd
.offset
);