]> git.ipfire.org Git - thirdparty/systemd.git/log
thirdparty/systemd.git
12 days agoimportd: add assert for log_message_size accumulation bounds
Luca Boccassi [Sat, 28 Mar 2026 20:10:14 +0000 (20:10 +0000)] 
importd: add assert for log_message_size accumulation bounds

Coverity flags log_message_size += l as a potential overflow, but l
is bounded by the read() count parameter which is
sizeof(log_message) - log_message_size. Add an assert to make this
invariant explicit.

CID#1548062

Follow-up for 3d7415f43f0fe6a821d7bc4a341ba371e8a30ef3

12 days agosd-bus: add asserts for rbuffer_size accumulation bounds
Luca Boccassi [Sat, 28 Mar 2026 20:08:55 +0000 (20:08 +0000)] 
sd-bus: add asserts for rbuffer_size accumulation bounds

Coverity flags rbuffer_size += k as a potential overflow, but k is
always bounded by the iov size (which is the difference between the
allocated buffer and current rbuffer_size). Add asserts to make this
invariant explicit.

CID#1548044
CID#1548071

Follow-up for a7e3212d89d5aefee67de79c1e7eaccf2f5645ac

12 days agouid-range: add asserts to document overflow safety in coalesce
Luca Boccassi [Sat, 28 Mar 2026 19:55:35 +0000 (19:55 +0000)] 
uid-range: add asserts to document overflow safety in coalesce

Coverity flags the x->start + x->nr and y->start + y->nr additions
as potential overflows. These are safe because uid_range_add_internal()
validates start + nr <= UINT32_MAX before inserting entries. Add asserts
to document this invariant for static analyzers.

CID#1548015

Follow-up for 8530dc4467691a893aa2e07319b18a84fec96cad

12 days agosd-event: add assert to help static analysis trace signal bounds
Luca Boccassi [Sat, 28 Mar 2026 19:52:09 +0000 (19:52 +0000)] 
sd-event: add assert to help static analysis trace signal bounds

Coverity flags the signal_sources array access as a potential
out-of-bounds read because it cannot trace through the SIGNAL_VALID()
macro to know that ssi_signo < _NSIG. Add an explicit assert after
the runtime check to make the constraint visible to static analyzers.

CID#1548033

Follow-up for 7a64c5f23efbb51fe4f1229c1a8aed6dd858a0a9

12 days agocpu-set-util: add asserts to guide static analysis after realloc
Luca Boccassi [Sat, 28 Mar 2026 19:49:20 +0000 (19:49 +0000)] 
cpu-set-util: add asserts to guide static analysis after realloc

Coverity flags CPU_SET_S() calls as potential out-of-bounds writes
because it cannot trace that cpu_set_realloc() guarantees the
allocated buffer is large enough for the given index. Add asserts
to make the size invariant explicit.

CID#1611787
CID#1611788

Follow-up for 0985c7c4e22c8dbbea4398cf3453da45ebf63800

12 days agodebug-generator: use unsigned bit shift for breakpoint flags
Luca Boccassi [Sat, 28 Mar 2026 19:47:27 +0000 (19:47 +0000)] 
debug-generator: use unsigned bit shift for breakpoint flags

Using signed int literal '1' in left shift can lead to undefined
behavior if the shift amount causes overflow of a signed int. Use
UINT32_C(1) since the result is stored in a uint32_t variable.

CID#1568482

Follow-up for e9f781a5a4721d3e58798b37e30bb4dcdbe54c02

12 days agoscsi_id: use strscpy instead of strncpy for wwn fields
Luca Boccassi [Sat, 28 Mar 2026 19:35:36 +0000 (19:35 +0000)] 
scsi_id: use strscpy instead of strncpy for wwn fields

strncpy does not null-terminate the destination buffer if the source
string is longer than the count parameter. Since wwn and
wwn_vendor_extension are char[17] and we copy up to 16 bytes, there's
a risk of missing null termination. Use strscpy which always
null-terminates.

CID#1469706

Follow-up for 4e9fdfccbdd16f0cfdb5c8fa8484a8ba0f2e69d3

12 days agoresolved: fix TOCTOU in hook discovery
Luca Boccassi [Sat, 28 Mar 2026 19:05:19 +0000 (19:05 +0000)] 
resolved: fix TOCTOU in hook discovery

Coverity complains that the directory is not pinned by FD
so it might changed between the stat and the open

CID#1643236

Follow-up for 8209f4adcde08d225f56269e608ccd5f6704cd70

12 days agostat-util: add assert to silence coverity
Luca Boccassi [Sat, 28 Mar 2026 18:55:37 +0000 (18:55 +0000)] 
stat-util: add assert to silence coverity

Coverity thinks _mntidb can be used uninitialized, but this
is not the case when r == 0. Add a bool variable to make it
clearer instead of reusing 'r' later, and an assert to guide
static analyzers.

CID#1644850

Follow-up for 5817c73391b5f3599c50df2c0873b26ea426f848

12 days agostat-util: fix return type of mode_verify_socket()
Luca Boccassi [Sat, 28 Mar 2026 18:50:49 +0000 (18:50 +0000)] 
stat-util: fix return type of mode_verify_socket()

It returns an error code, not a mode

Follow-up for 97fe03e12faa4e50d25a3ca8999967801c7e2da9

12 days agope-binary: add explicit cast to silence coverity
Luca Boccassi [Sat, 28 Mar 2026 18:45:52 +0000 (18:45 +0000)] 
pe-binary: add explicit cast to silence coverity

Otherwise it gets confused about underflows (which are already checked)

CID#1645068

Follow-up for a43427013949c6593629f551cf46e9cf9c167100

12 days agope-binary: fix error reporting
Luca Boccassi [Sat, 28 Mar 2026 18:35:09 +0000 (18:35 +0000)] 
pe-binary: fix error reporting

This is a local calculation, errno is not set

Follow-up for a43427013949c6593629f551cf46e9cf9c167100

12 days agoboot: add overflow check in GPT parser
Luca Boccassi [Sat, 28 Mar 2026 18:29:28 +0000 (18:29 +0000)] 
boot: add overflow check in GPT parser

ALIGN_TO() can overflow and return SIZE_MAX

CID#1644887

Follow-up for ccbd324a3a522362de0863e8d06cdd06a58d2fca

12 days agoimdsd: voidify unchecked call
Luca Boccassi [Sat, 28 Mar 2026 17:56:51 +0000 (17:56 +0000)] 
imdsd: voidify unchecked call

CID#1646046

Follow-up for eb6e5b07f13cefddf1f49e1f7bda4af22f5aba17

12 days agodissect: add asserts to appease coverity
Luca Boccassi [Sat, 28 Mar 2026 15:37:53 +0000 (15:37 +0000)] 
dissect: add asserts to appease coverity

CID#1645844
CID#1645845

Follow-up for 91578e529395a0299a1e5eaa6da08e73db6eeacd

12 days agotest: add a mock ModemManager for basic coverage of sd-networkd's integration 41402/head
Luca Boccassi [Sat, 28 Mar 2026 14:40:11 +0000 (14:40 +0000)] 
test: add a mock ModemManager for basic coverage of sd-networkd's integration

Just the minimal setup and test case required to cover
https://github.com/systemd/systemd/issues/41389 for now, can be
expanded in the future

Boring boilerplate is bot-made, don't @ me

Co-developed-by: Claude Opus 4.6 noreply@anthropic.com
12 days agonetworkd: fix assert with IPFamily=both in MobileNetwork conf
Luca Boccassi [Sat, 28 Mar 2026 14:47:25 +0000 (14:47 +0000)] 
networkd: fix assert with IPFamily=both in MobileNetwork conf

Fixes https://github.com/systemd/systemd/issues/41389

Follow-up for f8a4c3d375b83f3ee249ca3f4b7f407b618a9491

12 days agohwdb: Add keymaps for Acer Nitro 5 AN517-54
RiskoZS [Sat, 28 Mar 2026 01:51:20 +0000 (21:51 -0400)] 
hwdb: Add keymaps for Acer Nitro 5 AN517-54

Add mappings for the Fn+F7 (microphone mute), NitroSense and power keys for the Acer Nitro 5 AN517-54

13 days agosysupdate: add more input validation
Luca Boccassi [Sat, 28 Mar 2026 00:58:32 +0000 (00:58 +0000)] 
sysupdate: add more input validation

Ensure bogus inputs are cleanly rejected. These are privileged
interfaces so in practice it's not a problem.

Reported on yeswehack.com as YWH-PGM9780-168

Follow-up for bf2c741fd772af6f04b4fa234ada2d364f9a5d6c

13 days agomkosi: add CI for Ubuntu 26.04 (#41383)
Luca Boccassi [Sat, 28 Mar 2026 01:19:35 +0000 (01:19 +0000)] 
mkosi: add CI for Ubuntu 26.04 (#41383)

It is in final beta now, so we can start building and testing it

13 days agomkosi: add test job for Ubuntu 26.04 41383/head
Luca Boccassi [Fri, 27 Mar 2026 17:04:29 +0000 (17:04 +0000)] 
mkosi: add test job for Ubuntu 26.04

It is now in beta freeze, so we can start adding test coverage

13 days agomkosi: pull in gnu coreutils for Ubuntu 26.04 and newer
Luca Boccassi [Fri, 27 Mar 2026 20:59:46 +0000 (20:59 +0000)] 
mkosi: pull in gnu coreutils for Ubuntu 26.04 and newer

The default coreutils in Ubuntu 26.04 moved to uutils, which is broken
in many subtle and annoying ways, breaking various tests. It's also
a giant monolithic megabinary which makes the minimal image size
go up and break other tests.

Force the gnu coreutils to be pulled in all images.

13 days agotest: exclude gnusleep from coredumps parsing
Luca Boccassi [Fri, 27 Mar 2026 22:29:27 +0000 (22:29 +0000)] 
test: exclude gnusleep from coredumps parsing

In Ubuntu 26.04 the actual binary is called gnusleep, and sleep is a symlink,
so fix the regex exclusion for the coredump checks

13 days agotest: check for bin/bash in dissect --mtree instead of cat
Luca Boccassi [Fri, 27 Mar 2026 17:02:41 +0000 (17:02 +0000)] 
test: check for bin/bash in dissect --mtree instead of cat

Ubuntu is doing shenanigans with their coreutils so they are now
symlinks instead of binaries, so the grep fails. Check bash instead
to fix test failure on 26.04.

13 days agomkosi: depend on bpftool for Ubuntu 26.04 build image
Luca Boccassi [Fri, 27 Mar 2026 17:03:32 +0000 (17:03 +0000)] 
mkosi: depend on bpftool for Ubuntu 26.04 build image

bpftool was disentangled, so we can depend on it, and build with bpf

13 days agoboot-entry: add 'auto' keyword to parse_boot_entry_token_type
Duncan Overbruck [Fri, 13 Mar 2026 21:35:42 +0000 (22:35 +0100)] 
boot-entry: add 'auto' keyword to parse_boot_entry_token_type

Add the auto keyword as documented in the help message and man pages of
`kernel-install`, `bootctl` and `systemd-pcrlock`.

13 days agoshutdown: remove kexec-tools dependency
Luca Boccassi [Fri, 27 Mar 2026 19:32:29 +0000 (19:32 +0000)] 
shutdown: remove kexec-tools dependency

'kexec -e' is just a small wrapper that does the xen hypercall
on xen, or otherwise just calls reboot(). Drop the dependency,
and reuse the existing xen hypercall helper.

13 days agomany: more checks for pointer access without NULL check (#41370)
Zbigniew Jędrzejewski-Szmek [Fri, 27 Mar 2026 13:58:27 +0000 (14:58 +0100)] 
many: more checks for pointer access without NULL check (#41370)

This is a followup for https://github.com/systemd/systemd/pull/41096
that makes more subsystems pass the new `check-pointer-deref` coccinelle
checks. See the individual commits.

My plan is to do a few more of these PRs until we have it all covered. I
could also do it in a single very big PR but I'm worried about a)
conflicts b) that its just too big/annoying to review. Only 7 dirs left
but some (like src/basic) are quite big (~50k loc) so those PRs will be
a bit bigger.

13 days agovmspawn: improve firmware selection to match mkosi's implementation
Daan De Meyer [Fri, 27 Mar 2026 11:40:59 +0000 (11:40 +0000)] 
vmspawn: improve firmware selection to match mkosi's implementation

Align find_ovmf_config() with mkosi's find_ovmf_firmware() by adding
checks that were previously missing:

- Filter on interface-types, only selecting UEFI firmware definitions.
  Previously non-UEFI (e.g. BIOS-only) firmware could be selected.

- Check machine type compatibility using substring matching against the
  target machine patterns in firmware descriptions (e.g. "q35" matches
  "pc-q35-*"), following the same approach as mkosi.

- Make nvram-template optional in the firmware JSON mapping. Firmware
  definitions without an nvram-template are now parsed successfully
  (with vars remaining NULL) rather than failing entirely.

Also rework the firmware target parsing to store both architecture and
machine arrays per target (instead of just a flat architecture list),
and extract the machine matching into firmware_data_matches_machine().

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
13 days agovmspawn: Add --firmware=describe
Daan De Meyer [Fri, 27 Mar 2026 11:55:32 +0000 (12:55 +0100)] 
vmspawn: Add --firmware=describe

It's useful to be able to check what firmware description vmspawn
will select. In particular, this will allow me to figure out the
nvram template file that will be picked up so I can pick it up in
mkosi and operate on it to pass a modified version of it to vmspawn
with --efi-nvram-template=.

13 days agovmspawn: add --efi-nvram-template= and --firmware-features= options
Daan De Meyer [Fri, 27 Mar 2026 10:43:26 +0000 (10:43 +0000)] 
vmspawn: add --efi-nvram-template= and --firmware-features= options

Add --efi-nvram-template=PATH to specify a custom firmware variables
file to copy and use as the initial EFI NVRAM state instead of the
default template from the firmware definition.

Add --firmware-features=FEATURE[,FEATURE...] to require or exclude
specific firmware features during automatic firmware discovery.
Features prefixed with "!" are excluded. If a feature appears in both
the included and excluded lists, inclusion takes priority. Firmware
with the "enrolled-keys" feature is excluded by default.

Refactor --secure-boot= to operate on the firmware features sets
instead of maintaining a separate tristate. --secure-boot=yes adds
"secure-boot" to the include set, --secure-boot=no adds it to the
exclude set, and --secure-boot=auto removes it from both.

Generalize find_ovmf_config() to accept include/exclude feature sets
instead of a secure boot tristate, removing the special-cased
enrolled-keys and secure-boot filtering logic.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
13 days agopo: Translated using Weblate (Czech)
Pavel Borecki [Fri, 27 Mar 2026 12:58:47 +0000 (12:58 +0000)] 
po: Translated using Weblate (Czech)

Currently translated at 100.0% (266 of 266 strings)

Co-authored-by: Pavel Borecki <pavel.borecki@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/cs/
Translation: systemd/main

13 days agotmpfile-util: don't log about lack of O_TMPFILE support
Lennart Poettering [Thu, 26 Mar 2026 17:11:30 +0000 (18:11 +0100)] 
tmpfile-util: don't log about lack of O_TMPFILE support

It's a very common case (vfat...), and it's just too much noise. After
all the whole function exists primarily to deal with O_TMPFILE not being
availeble everywhere...

13 days agosd-boot: 4 smaller fixes (#41367)
Luca Boccassi [Fri, 27 Mar 2026 11:47:33 +0000 (11:47 +0000)] 
sd-boot: 4 smaller fixes (#41367)

13 days agomachine: never ever allow non-root-owned host machine
Mike Yuan [Thu, 26 Mar 2026 11:16:36 +0000 (12:16 +0100)] 
machine: never ever allow non-root-owned host machine

We really should lock this down _hard_, as evidenced by recent
security fallouts.

13 days agomachine: introduce MACHINE_CLASS_CAN_REGISTER
Mike Yuan [Thu, 26 Mar 2026 10:59:45 +0000 (11:59 +0100)] 
machine: introduce MACHINE_CLASS_CAN_REGISTER

Follow-up for 6df5f80bd374be1b45c52d740e88f0236da922c7

Similar to SESSION_CAN_* macros in logind-session.h

13 days agomkosi: update debian commit reference to 23ef56be0050f78be704f288ed1ce30ace47cbfe
Luca Boccassi [Thu, 26 Mar 2026 23:36:25 +0000 (23:36 +0000)] 
mkosi: update debian commit reference to 23ef56be0050f78be704f288ed1ce30ace47cbfe

23ef56be00 Install new files for upstream build
98645a89ba Install new files for upstream build
dc2dd78cc0 Install new files for upstream build
aad316ec34 Drop wildcards, dh_exec does not suppor them for manpages
3bf8703dab Install new files for upstream build
d1e92a6493 Update changelog for 260.1-1 release
e7a80fe2b8 Install basic.conf in sd-standalone-sysusers package
48f796240e Add lpadmin group to basic.conf sysusers.d as requested by CUPS maintainer
c15703b8aa Update changelog for 260-1 release
f26cc52a43 Drop version from libselinux-dev dependency
7f3701ae2f Do not run "systemctl enable getty@.service" unconditionally
ec59ddd832 Switch from libselinux1-dev to libselinux-dev
35258cd599 Update changelog for 260~rc4-1 release
eb194c22ff Update changelog for 260~rc3-1 release
a6878815d6 Really enable getty@ via packaging scriptlets

13 days agoimport: make check-pointer-deref clean 41370/head
Michael Vogt [Fri, 27 Mar 2026 10:30:32 +0000 (11:30 +0100)] 
import: make check-pointer-deref clean

Add the needed assert changes to make the code clean
for the new check-pointer-deref script.

13 days agoboot: avoid division by zero in splash image handling
Luca Boccassi [Fri, 27 Mar 2026 01:04:25 +0000 (01:04 +0000)] 
boot: avoid division by zero in splash image handling

A malformed image can cause a division by zero, check that
the parameters are not zero.

Reported on yeswehackl.com as YWH-PGM9780-173

Follow-up for 0fa2cac4f0cdefaf1addd7f1fe0fd8113db9360b

13 days agonss-systemd: make check-pointer-deref clean
Michael Vogt [Fri, 27 Mar 2026 10:20:20 +0000 (11:20 +0100)] 
nss-systemd: make check-pointer-deref clean

Add the needed assert changes to make the code clean
for the new check-pointer-deref script.

13 days agoresolved: make check-pointer-deref clean
Michael Vogt [Fri, 27 Mar 2026 10:20:10 +0000 (11:20 +0100)] 
resolved: make check-pointer-deref clean

Add the needed assert changes to make the code clean
for the new check-pointer-deref script.

13 days agolibsystemd-network: make check-pointer-deref clean
Michael Vogt [Fri, 27 Mar 2026 10:20:01 +0000 (11:20 +0100)] 
libsystemd-network: make check-pointer-deref clean

Add the needed assert changes to make the code clean
for the new check-pointer-deref script.

13 days agococcinelle: document why src/libc/ and src/test/ are excluded
Michael Vogt [Fri, 27 Mar 2026 10:20:40 +0000 (11:20 +0100)] 
coccinelle: document why src/libc/ and src/test/ are excluded

For some of the directories it makes more sense to keep them
excluded from the coccinelle check. Specifically:
- libc: compatibility, no asserts or systemd headers yet
- test: uses NUL internally to test crashes etc

13 days agococcinelle: generalize pidref_is_set() to `=~ _is_set()`
Michael Vogt [Fri, 27 Mar 2026 09:44:03 +0000 (10:44 +0100)] 
coccinelle: generalize pidref_is_set() to `=~ _is_set()`

Our coccinelle/check-pointer-deref.cocci checker has a special
case for `assert(pidref_is_set(param))`. It turns out we can
generalize this and catch the following:
- iovec_is_set
- sd_dhcp_duid_is_set
- sd_dhcp_client_id_is_set

13 days agobootspec: honour profile number when sorting properly 41367/head
Lennart Poettering [Thu, 26 Mar 2026 22:44:59 +0000 (23:44 +0100)] 
bootspec: honour profile number when sorting properly

This corrects sorting of menu entries regarding profile numbers:

1. If the profile number is unset, let's treat this identical to profile
   0, when ordering stuff, because an item with no profile is
   conceptually the same as an item with only a profile 0.

2. Let's take the profile number into account also if sort keys are
   used. This was makes profiles work sensibly in type 1 entries, via
   the recently added "profile" stanza.

Follow-up for: 5fb90fa3194d998a971b21e4a643670ae5903f85

13 days agoboot: do no show pixel width/height in text mode
Lennart Poettering [Thu, 26 Mar 2026 22:43:32 +0000 (23:43 +0100)] 
boot: do no show pixel width/height in text mode

When running in pure text mode (i.e. serial terminal) the pixel
width/height is zero and makes no sense to report. Suppress it.

13 days agoboot: properly track internal menu entries
Lennart Poettering [Thu, 26 Mar 2026 22:43:12 +0000 (23:43 +0100)] 
boot: properly track internal menu entries

When showing the list of menu entries via "p", the "internal call:"
field was showing nonsense, since
fb6cf4bbb75baee8a6988d899de2c6b3e3805e31.

Fix that by adding a proper entry type for "internal" menu items such as
reboot/firmware/poweroff, and then check for that.

With this in place all entries now have a loader type that makes sense
and describes precisely what an entry is about.

2 weeks agofundamental: move strv_isempty() into src/fundamental/
Lennart Poettering [Wed, 25 Mar 2026 17:08:16 +0000 (18:08 +0100)] 
fundamental: move strv_isempty() into src/fundamental/

2 weeks agodetect-virt: use the new option macros 41335/head
Zbigniew Jędrzejewski-Szmek [Wed, 25 Mar 2026 21:19:01 +0000 (22:19 +0100)] 
detect-virt: use the new option macros

--help output changes: description is now highlighted, "Options:" header
added, option order follows declaration order, column width is auto-computed.

Co-developed-by: Claude <claude@anthropic.com>
2 weeks agofactory-reset: use the new option and verb macros
Zbigniew Jędrzejewski-Szmek [Wed, 25 Mar 2026 15:14:41 +0000 (16:14 +0100)] 
factory-reset: use the new option and verb macros

--help is the same except for strings in common options.

Co-developed-by: Claude <claude@anthropic.com>
2 weeks agohostnamectl: use the new option and verb macros
Zbigniew Jędrzejewski-Szmek [Wed, 25 Mar 2026 14:56:02 +0000 (15:56 +0100)] 
hostnamectl: use the new option and verb macros

--help is the same except for strings in common options.

Co-developed-by: Claude <claude@anthropic.com>
2 weeks agoshared/options: add OPTION_COMMON_LOWERCASE_J
Zbigniew Jędrzejewski-Szmek [Tue, 24 Mar 2026 22:44:01 +0000 (23:44 +0100)] 
shared/options: add OPTION_COMMON_LOWERCASE_J

2 weeks agoMake imds networking unlocked by default (#41359)
Mike Yuan [Thu, 26 Mar 2026 19:08:17 +0000 (20:08 +0100)] 
Make imds networking unlocked by default (#41359)

2 weeks agobasic/proc-cmdline: extend comments
Zbigniew Jędrzejewski-Szmek [Thu, 26 Mar 2026 12:47:44 +0000 (13:47 +0100)] 
basic/proc-cmdline: extend comments

Inspired by the discussion in #41161.

Also change the order of flags to be more logical. First the option
to specify at what fields we look, then the option to specify how we
return their name, the the value, and finally what to do if the value
is missing.

2 weeks agocreds: minor cleanups for --newline= handling (#41329)
Mike Yuan [Thu, 26 Mar 2026 17:36:51 +0000 (18:36 +0100)] 
creds: minor cleanups for --newline= handling (#41329)

Prompted by #41325

Fixes #41348

2 weeks agocore: address review feedback from Mike (#41354)
Mike Yuan [Thu, 26 Mar 2026 17:18:01 +0000 (18:18 +0100)] 
core: address review feedback from Mike (#41354)

This commit addresses the review feedback from @YHNdnzj (many thanks)

Closes: https://github.com/systemd/systemd/issues/41324
2 weeks agococcinelle: add checks for pointer access without NULL check
Michael Vogt [Fri, 13 Mar 2026 13:46:37 +0000 (14:46 +0100)] 
coccinelle: add checks for pointer access without NULL check

The fix in 8f1751a111 made me wonder if we could automatically detect
when pointers are accessed but when this might not be safe. Systemd
is already using a lot of `assert(dst)` and this change now forces
us to use them.

So this commit (ab)uses coccinelle to flag any pointer parameter
dereference not preceded by assert(param), ASSERT_PTR(param), or an
explicit NULL check. It adds integration into meson as a new "coccinelle"
test suite (just like clang-tidy) and is run in CI. The check is not
perfect but seems a reasonable heuristic.

For this RFC commit it is scoped to a subset, it excludes 25 dirs right
now and includes around 100. About 300 warnings left. Busywork that I am
happy to do if there is agreement that it is worth it.

With this in place we would have caught the bug from 8f1751a111 in CI:
```
FAIL: check-pointer-deref.cocci found issues in systemd/src/boot:
diff -u -p systemd/src/boot/measure.c /tmp/nothing/measure.c
--- systemd/src/boot/measure.c
+++ /tmp/nothing/measure.c
@@ -312,7 +312,6 @@ EFI_STATUS tpm_log_tagged_event(
         if (err != EFI_SUCCESS)
                 return err;

-        *ret_measured = true;
         return EFI_SUCCESS;
 }
```

This also adds a new POINTER_MAY_BE_NULL() for the cases when the
called function will do the NULL check (like `iovec_is_set()`).

2 weeks agomeson: unlock imds network by default 41359/head
Zbigniew Jędrzejewski-Szmek [Thu, 26 Mar 2026 16:32:43 +0000 (17:32 +0100)] 
meson: unlock imds network by default

Enabling locking by default would constitute a major footgun and
compatibility break on upgrades. This functionality is useful, but it
requires the rest of the system to be "ported" to use systemd-imds
first. The user or distro should opt in to "locked" mode only after
doing the integration work.

2 weeks agomeson: simplify setting of ImdsNetworkMode default
Zbigniew Jędrzejewski-Szmek [Thu, 26 Mar 2026 16:28:21 +0000 (17:28 +0100)] 
meson: simplify setting of ImdsNetworkMode default

This follows the pattern used for dnssec default mode right above.

2 weeks agolabeler: update to latest commit and limit file-based label to 5 (#41358)
Luca Boccassi [Thu, 26 Mar 2026 15:36:43 +0000 (15:36 +0000)] 
labeler: update to latest commit and limit file-based label to 5 (#41358)

When doing large refactors or large changes the bot spams
labels left and right, making the PR unreadable. Use the
new option to limit the bot to a max of 5 file-based
labels. If more than 5 would be set, all file-based labels
are skipped.

2 weeks agoimds: some minor review fixes
Lennart Poettering [Thu, 26 Mar 2026 13:48:26 +0000 (14:48 +0100)] 
imds: some minor review fixes

Addresses these issues:

https://github.com/systemd/systemd/pull/40980#pullrequestreview-4013313066

2 weeks agooptionally run a software TPM at boot as fallback for TPM less machines (#41016)
Lennart Poettering [Thu, 26 Mar 2026 15:12:46 +0000 (16:12 +0100)] 
optionally run a software TPM at boot as fallback for TPM less machines (#41016)

In various scenarios it's useful to be able to run a software TPM as
fallback on a machine if it doesn't natively have a hardware for it, in
order to provide somewhat systematic interfacing for legacy machines.
This adds the infrastructure for it.

Relevant parts:

1. On EFI systems sd-stub will now generate a random secret on first
boot and store it in a persistent NV variable, which is marked
inaccessible to the OS. It then derives a per-OS secret from that which
is passed to the OS via the initrd logic. This is generally useful, but
in particular is intended to secure the software TPM at least a bit: it
provides better security than nothing (i.e. the only protection in place
is that the firmwrae protections work, but this is also what shim relies
on, hence maybe not too bad), and allows swtpm to encrypt its storage
with something.

2. systemd-tpm2-generator is extended to optionally start an swtpm if no
tpm hw is detected. Because this is of course a major downgrade in
security, this has to be requested explicitly at boot via a kernel
cmdline switch.

3. This optionally mounts the ESP from the initrd. This is general
infrastructure, and has been requested before, but is particularly
interesting in the context of software TPMs: the state needs to be
stored somewhere, and that before the rootfs can be unlocked.

4. This introduces a special new separator measurement for PCRs 0-7 that
isolates all measurements from pre-os/uefi world from those done by the
OS. I added this for three reasons:
- in the swtpm case we'll not have any pre-os/uefi measurements, and we
need to be able to determine cleanly that this is the case. this hence
is supposed to play a similar role as the usual firmware separator
measurement, that however cleanly fixates to the PCRs even the case
where the firmware measurements don't exist at all
   - this is a very comprehensive fix for #40567
- not all firmwares generate the firmware separator at all, but it is
essential to seal off firmware variables from OS generated ones. This
can fill the void to some degree.
6. This introduces a new kernel cmdline switch
systemd.tpm2-measured-os=1, which allows force enabling all our
measurement logic, even if UKI TPM measurements are not done. This is
supposed to be used for the swtpm case so that one gets all the
measurements even without having the early boot verified boot chain in
place.

Benefits of all this: systems that care about TPMs have a (lower
security) compat glue in place that allows supporting legacy hw the same
way as modern hw in many ways, so that remote attestation and other uses
can reasonably work with the same codepaths.

Also see: https://github.com/lxc/incus-os/pull/667 regarding prior
similar work.

Fixes: #40567
2 weeks agoupdate TODO 41016/head
Lennart Poettering [Tue, 10 Mar 2026 16:12:23 +0000 (17:12 +0100)] 
update TODO

2 weeks agounits: make use of nvpcrs only after the NV anchor completion measurement is done
Lennart Poettering [Thu, 26 Mar 2026 10:16:10 +0000 (11:16 +0100)] 
units: make use of nvpcrs only after the NV anchor completion measurement is done

This makes sure we don't use the "hardware" or "verity" nvpcrs before
the NV anchor measurement is done.

This is mostly to avoid confusing output, and to indirectly ensure the
nvpcr allocation in tpm2-setup is the load bearing one, but it should
not be load bearing for security afaics.

2 weeks agopcrextend: measure another separator at boot
Lennart Poettering [Tue, 10 Mar 2026 07:09:52 +0000 (08:09 +0100)] 
pcrextend: measure another separator at boot

This has been requested previously for PCR 7 (#40567), but let's do that
for all firmware owned PCRs, since some firmwares forget to measure
their own separator. Let's hence measure our own guranteed one.

Fixes: #40567
2 weeks agocreds-util: only lock against public key PCR stuff if we are booted with UEFI support...
Lennart Poettering [Tue, 10 Mar 2026 17:17:04 +0000 (18:17 +0100)] 
creds-util: only lock against public key PCR stuff if we are booted with UEFI supporting TPMs

The UKI public key PCR stuff only works if we get PCR measurements from
the pre-boot environment, hence automatically disable the logic by
default if we don't have that.

2 weeks agopcrlock: deal with firmwares which understand TPM but where no TPM is available
Lennart Poettering [Tue, 10 Mar 2026 07:07:25 +0000 (08:07 +0100)] 
pcrlock: deal with firmwares which understand TPM but where no TPM is available

This is a potentially common case in VMs: firmwares might know the
concept of TPMs, but the hardware is not enabled in the specific VM.
Let's handle this case nicely.

2 weeks agopcrlock: don't fail if firmware measurements aren't available
Lennart Poettering [Tue, 10 Mar 2026 07:04:52 +0000 (08:04 +0100)] 
pcrlock: don't fail if firmware measurements aren't available

With swtpm in place we now commonly have systems where TPM is available
during runtime, but not in the firmware. Handle that nicely.

2 weeks agocore: introduce ConditionSecurity=measured-os
Lennart Poettering [Mon, 9 Mar 2026 17:53:09 +0000 (18:53 +0100)] 
core: introduce ConditionSecurity=measured-os

So far we always conditioned our TPM magic on the UKI having detected
TPM support in the firmware. This is a bit limiting when we want to
support a software TPM that is not visible to the firmware. Hence let's
split this up, and add a separate control that can be set via the kernel
command line.  However, as before, let's by default inherit the firmare
TPM discovery state into it, to retain the current behaviour unless
overriden.

With this in place, boot with "systemd.tpm2_measured_os=1
systemd.tpm2_software_fallback=1" on the kernel cmdline to get the swtpm
fallback and then a measured OS based on it.

2 weeks agotree-wide: relax TPM available checks for many cases
Lennart Poettering [Mon, 9 Mar 2026 17:51:49 +0000 (18:51 +0100)] 
tree-wide: relax TPM available checks for many cases

In many cases it's essential to know if the firmware supports a TPM, but
in others we should accept it if the firmware doesn't have TPM support,
in particular if we want to run the OS with a software TPM.

Hence, add tpm2_is_mostly_supported() as function similar to
tpm2_is_fully_supported(), with the only difference that the former
doesn't insist on a firmware supported TPM. Then, change a number of
users over to this (but not all).

2 weeks agotpm2-generator: if requested run things with an swtpm
Lennart Poettering [Mon, 9 Mar 2026 12:08:28 +0000 (13:08 +0100)] 
tpm2-generator: if requested run things with an swtpm

We want to start the software TPM fallback only if no real hw is
evailable and if the user opts-in to this behaviour. Add a generator
that drives all this, based on kernel command line configuration.

2 weeks agotpm2: add "systemd-tpm2-swtpm" wrapper for "swtpm"
Lennart Poettering [Mon, 9 Mar 2026 12:06:58 +0000 (13:06 +0100)] 
tpm2: add "systemd-tpm2-swtpm" wrapper for "swtpm"

For TPM-less systems it's sometimes valuable to have a fill-in software
TPM running from early boot on, so that TPM-based functionality can
"just work" and rely on TPM semantics, even if it's at a substantially
weaker security level.

This adds a wrapper around swtpm. It's a binary that chainloads swtpm
but does a few preparatory steps and integrates into systemd's logic
otherwise.

All this is then exposed as systemd-tpm2-swtpm.service.

The service is not hooked into much yet, that is added in later commits.

2 weeks agolabeler: limit file-based label to 5 41358/head
Luca Boccassi [Thu, 26 Mar 2026 15:07:56 +0000 (15:07 +0000)] 
labeler: limit file-based label to 5

When doing large refactors or large changes the bot spams
labels left and right, making the PR unreadable. Use the
new option to limit the bot to a max of 5 file-based
labels. If more than 5 would be set, all file-based labels
are skipped.

2 weeks agolabeler: update to latest commit
Luca Boccassi [Thu, 26 Mar 2026 15:06:16 +0000 (15:06 +0000)] 
labeler: update to latest commit

Adds 'changed-files-labels-limit' and 'max-files-changed' configs

2 weeks agocreds: minor tweak for fputc() error handling 41329/head
Mike Yuan [Wed, 25 Mar 2026 15:03:07 +0000 (16:03 +0100)] 
creds: minor tweak for fputc() error handling

Let's do not assume errno is set for return values other than
EOF, following what we do in fileio.c.

2 weeks agocreds: if newline is explicitly requested, skip tty check
Mike Yuan [Wed, 25 Mar 2026 15:00:14 +0000 (16:00 +0100)] 
creds: if newline is explicitly requested, skip tty check

Before this commit, the > 0 state of arg_newline tristate is
simply ignored.

Yes, this is a minor compat break, but I'd argue the previous
behavior was not useful as "yes" is treated the same as "auto".
An issue also reported that it was quite surprising.

Fixes #41348

2 weeks agocreds: use parse_tristate_argument_with_auto() where appropriate
Mike Yuan [Wed, 25 Mar 2026 14:39:26 +0000 (15:39 +0100)] 
creds: use parse_tristate_argument_with_auto() where appropriate

2 weeks agocleanup-util: include assert-fundamental.h instead of -util
Mike Yuan [Wed, 25 Mar 2026 15:45:27 +0000 (16:45 +0100)] 
cleanup-util: include assert-fundamental.h instead of -util

The split was initially done to reduce transitive includes,
and for assert() only the former is needed.

2 weeks agocore: always call manager_log_caller() even without pidref 41354/head
Michael Vogt [Thu, 26 Mar 2026 11:51:23 +0000 (12:51 +0100)] 
core: always call manager_log_caller() even without pidref

Its fine if `manager_log_caller()` with an empty pidref,
it will log an unknown caller.

Thanks to @YHNdnzj for suggesting this.

2 weeks agocore: drop incorrect comment about SD_BUS_VTABLE_CAPABILITY(CAP_SYS_BOOT)
Michael Vogt [Thu, 26 Mar 2026 12:25:02 +0000 (13:25 +0100)] 
core: drop incorrect comment about SD_BUS_VTABLE_CAPABILITY(CAP_SYS_BOOT)

The comment about `SD_BUS_VTABLE_CAPABILITY(CAP_SYS_BOOT)` is
incorrect. To quote @YHNdnzj:
```
nah, the capability-based permission model is a legacy from kdbus. We cannot do it race-freely without it. Please simply drop the comment.
```

Thanks to @YHNdnzj for suggesting this.

2 weeks agocore: add assert(selinux_permission) to manager_do_set_objective
Michael Vogt [Thu, 26 Mar 2026 11:55:54 +0000 (12:55 +0100)] 
core: add assert(selinux_permission) to manager_do_set_objective

Thanks to @YHNdnzj for suggesting this.

2 weeks agocore: simplify manager_do_set_objective `root` path handling
Michael Vogt [Thu, 26 Mar 2026 12:16:57 +0000 (13:16 +0100)] 
core: simplify manager_do_set_objective `root` path handling

The manager_do_set_objective() was doing a bunch of work to
check the `root` path that can already be done via
`json_dispatch_path` so instead of duplicating use the helper.

Thanks to @YHNdnzj for suggesting this.

2 weeks agocore: drop `_manager()` from new vl_method to shutdown
Michael Vogt [Thu, 26 Mar 2026 11:46:56 +0000 (12:46 +0100)] 
core: drop `_manager()` from new vl_method to shutdown

Drop the _manager suffix for vl_method_{poweroff,{soft,}reboot,
halt,kexec}_manager.

They're unambiguous enough and the power mgmt operations are
not manager-wide but system-wide.

Thanks to @YHNdnzj for suggesting this.

2 weeks agogpt-auto-generator: generate an initrd ESP mount if it makes sense
Lennart Poettering [Mon, 9 Mar 2026 17:52:20 +0000 (18:52 +0100)] 
gpt-auto-generator: generate an initrd ESP mount if it makes sense

We need to store state persistently for the software TPM (i.e. the root
key). But given that TPMs are generally used to unlock the rootfs, this
storage cannot be on the rootfs. Hence let's use the ESP instead, as the
next best thing, that is guaranteed to exist during early boot, given we
just were booted from it.

This defines automatic logic for this, but does not cause the ESP mount
job to be enqueued (since typically we don't actually want that
mounted), this is left for the actual services that needs to be done.

Note that the mount here is set up quite differently from the one from
the host: since initrds are short-lived anyway, it seemed pointless to
use autofs. Moreover this uses a fixed place to mount the ESP, inspired
by the /sysroot/ + /sysusr/ mount naming. All that to simplify things a
bit for the consumers (which is mostly swtpm)

2 weeks agofileio: add WRITE_DATA_FILE_MODE_0400 mode
Lennart Poettering [Mon, 9 Mar 2026 12:06:42 +0000 (13:06 +0100)] 
fileio: add WRITE_DATA_FILE_MODE_0400 mode

2 weeks agokernel-install(uki): filter comments from cmdline
Cynthia [Tue, 17 Mar 2026 22:30:31 +0000 (23:30 +0100)] 
kernel-install(uki): filter comments from cmdline

This change aligns the behaviour of UKI generation with the behaviour
of BLS. The latter filters out lines starting with a #, allowing users
to add comments and/or temporarily remove some flags from the kernel
command line.

The kernel-install test have been adjusted to use a multiline cmdline
with a comment in it. Without this patch, the test fails.

2 weeks agoBasic IMDS support (#40980)
Zbigniew Jędrzejewski-Szmek [Thu, 26 Mar 2026 13:12:31 +0000 (14:12 +0100)] 
Basic IMDS support (#40980)

This adds a new cloud IMDS client, that can cover AWS, Azure, GCP,
Hetzner imds to varying degrees. Each cloud has this and it's very basic
functionality, hence I think it makes sense to add this to systemd.

Since the clouds are all different this tries hard to do the abstract
common logic in code, but encode the endpoint details, and well-known
keys in hwdb, attached to the DMI id device.

Why all this?

* Efficiency: we can schedule this in the initrd, at the earliest points
possible, without unnecessary delays
* Robustness: imds is typically slow and/or heavily rate-limited:
systemd-imdsd as single entrypoint can deal with that, and provide a
reliable, cached interface
* Security: the idea is that systemd-imdsd is the only service behing
able to access the IMDS HTTP, and the host carries a blackhole route for
it otherwise. That way sensitive info can be kept away from clients, and
requires polkit auth for access
* Simplicity: extraction of systemd's system credentials from IMDS
userdata happens with systemd's own infra, and for many usecases that
should already be enough.
* Measurements: before accepting the IDMS userdata, it can be measured
into a PCR, as any other configuration input for the system

Fixes: #40763
2 weeks agoci: Support multi-line review comments in claude-review
Daan De Meyer [Thu, 26 Mar 2026 12:33:38 +0000 (12:33 +0000)] 
ci: Support multi-line review comments in claude-review

Pass side, start_line, and start_side through to createReviewComment()
when present, enabling multi-line review comments. Update the prompt to
document all positioning fields using JSON Schema and make line required.

2 weeks agoRevert "ci: Add subject_type to createReviewComment()"
Daan De Meyer [Thu, 26 Mar 2026 12:19:15 +0000 (13:19 +0100)] 
Revert "ci: Add subject_type to createReviewComment()"

This reverts commit 211cd6e9a34d957dfa3b7616f0e618b6d17a51c2.

They document it here:
https://octokit.github.io/rest.js/v22/#pulls-create-review-comment
but apparently that's out of date and this doesn't work anymore.

2 weeks agoboot: add checks for invalid splash images in UKI
Luca Boccassi [Fri, 13 Mar 2026 01:52:12 +0000 (01:52 +0000)] 
boot: add checks for invalid splash images in UKI

A malformed bmp with 8bits depth but smaller color
map would cause out of bounds reads. This is not a real
problem as the image is signed, but better to be safe.

Reported on yeswehack.com as:
YWH-PGM9780-135

Follow-up for 0fa2cac4f0cdefaf1addd7f1fe0fd8113db9360b

2 weeks agoboot: fix typo in function name
Luca Boccassi [Fri, 13 Mar 2026 01:51:21 +0000 (01:51 +0000)] 
boot: fix typo in function name

Follow-up for dde03dd2a843b05d65885ce1242e43c8cabb9924

2 weeks agomkosi: Install clang-tidy package instead of clang-tools
Daan De Meyer [Thu, 26 Mar 2026 08:25:02 +0000 (09:25 +0100)] 
mkosi: Install clang-tidy package instead of clang-tools

clang-tools surprisingly enough doesn't provide clang-tidy

2 weeks agoupdate TODO 40980/head
Lennart Poettering [Thu, 5 Mar 2026 10:36:03 +0000 (11:36 +0100)] 
update TODO

2 weeks agotest: add simple integration test for systemd-imdsd
Lennart Poettering [Fri, 6 Mar 2026 16:31:10 +0000 (17:31 +0100)] 
test: add simple integration test for systemd-imdsd

2 weeks agoimds: add generator that hooks in IMDS logic on cloud guests
Lennart Poettering [Wed, 4 Mar 2026 14:16:14 +0000 (15:16 +0100)] 
imds: add generator that hooks in IMDS logic on cloud guests

The infrastructure added in the previous commits added support for IMDS
client functionality, but didn't really to enable the logic by default
on suitable hosts.

This commit adds a generator that automatically hooks the IMDS
functionality into the boot process if it detects that the system is
running on a compliant cloud system. it enables both the imds daemon and
the client.

2 weeks agoimds: add TPM measurements to imds tool
Lennart Poettering [Tue, 24 Mar 2026 08:41:03 +0000 (09:41 +0100)] 
imds: add TPM measurements to imds tool

This automatically measures the IMDS 'userdata' into PCR 12, i.e. where
we measure the other owner-supplied configuration, such as confexts and
credentials and similar.

(Why 12? It's really about who owns the data and what it is for.
PCRs/NvPCRs are scarce hence there's a strong incentive to not go
overboard with new allocations, and IMDS userdata in purpose and owner
is very very similar to confexts and credentials, hence let's reuse the
PCR for this purpose.)

2 weeks agoimds: add "systemd-imds" tool that is a simple client to "systemd-imdsd"
Lennart Poettering [Wed, 4 Mar 2026 14:13:25 +0000 (15:13 +0100)] 
imds: add "systemd-imds" tool that is a simple client to "systemd-imdsd"

This is a client tool to the systemd-imdsd@.service added in the
previous commit. It's mostly just a 1:1 IPC client via Varlink. It can
be used to query any IMDS key, but it's primary usecase is to acquire
the "userdata" from IMDS. Moreover, if invoked with the --import switch
it will check if the userdata contains a list of system credentials. If
so, it will import them into the local credstore. If the userdata does
not look like a list of system credentials no operation is executed,
under the assumption the data is intended for cloud-init instead.

It also imports a couple of other fields, if available and recogniuzed,
such as SSH keys and the hostname.

2 weeks agoimds: add new systemd-imdsd.service that makes IMDS data accessible locally
Lennart Poettering [Wed, 4 Mar 2026 14:10:37 +0000 (15:10 +0100)] 
imds: add new systemd-imdsd.service that makes IMDS data accessible locally

This service's job is to talk to a VM associated IMDS service provided
by the local Cloud. It tries to abstract the protocol differences
various IMDS implementations implement, but does *not* really try to
abstract more than a few basic fields of the actual IMDS metadata.

IMDS access is wrapped in a Varlink API that local clients can talk to.

If possible this makes use of the IMDS endpoint information that has
been added to hwdb in the preceeding commit. However, endpoint info can
also be provided via kernel command line and credentials. For debugging
purposes we also accept them via environment variables and command line
arguments.

This adds a concept of early-boot networking, just enough to be able to
talk to the IMDS service. It is minimally configurable via a kernel
cmdline option (and a build-time option): the user may choose between
"locked" and "unlocked" mode. In the former mode direct access to IMDS via
HTTPS is blocked via a prohibit route (and thus all IMDS communication
has to be done via systemd-imdsd@.service). In the latter case no such
lockdown takes place, and IMDS may be acquired both via this new service
and directly. The latter is typically a good idea for compatibility with
current systems, the former is preferable for secure installations.

Access to IMDS fields is controlled via PK.

2 weeks agohwdb: add database for basic IMDS properties
Lennart Poettering [Wed, 4 Mar 2026 14:07:09 +0000 (15:07 +0100)] 
hwdb: add database for basic IMDS properties

This adds a hardware database that contains information about IDMS
functionality of various clouds, keyed off the SMBIOS identification of
each. Currently this contains information about 6 major clouds, but the
idea is that this grows to include more and more major clouds.

Nothing uses this data yet, that's added in a later commit.

2 weeks agoshared/table-format: generalize table_sync_column_width to more columns
Zbigniew Jędrzejewski-Szmek [Wed, 25 Mar 2026 13:49:55 +0000 (14:49 +0100)] 
shared/table-format: generalize table_sync_column_width to more columns

The column index is moved to the first position. I think we're unlikely
to want to synchronize widths of *different* columns, and having just
one column argument makes the callers simpler. Also, the type is changed
to size_t to match other functions, and this avoids the need to cast
to size_t in the callers.