]> git.ipfire.org Git - thirdparty/systemd.git/log
thirdparty/systemd.git
53 min agocore: implement Kill/Automount/Mount Context/Runtime for io.systemd.Unit.List (#39391) main
Lennart Poettering [Mon, 20 Apr 2026 20:57:21 +0000 (22:57 +0200)] 
core: implement Kill/Automount/Mount Context/Runtime for io.systemd.Unit.List (#39391)

The PR implements the following objects + tests for
`io.systemd.Unit.List`:
- `KillContext`
- `AutomountContext`
- `AutomountRuntime`
- `MountContext`
- `MountRuntime`

It's a continuation of the following PRs:
* https://github.com/systemd/systemd/pull/37432
* https://github.com/systemd/systemd/pull/37646
* https://github.com/systemd/systemd/pull/38032
* https://github.com/systemd/systemd/pull/38212

89 min agobootctl: add --print-efi-architecture switch
Lennart Poettering [Mon, 20 Apr 2026 15:49:31 +0000 (17:49 +0200)] 
bootctl: add --print-efi-architecture switch

This is extremely useful for our own test cases, since acquiring the
right EFI architecture string is otherwise a bit nasty.

2 hours agoshared/curl-util: load libcurl via dlopen
Daan De Meyer [Fri, 17 Apr 2026 14:06:23 +0000 (16:06 +0200)] 
shared/curl-util: load libcurl via dlopen

Convert curl-util to the dlopen pattern used by other optional shared
libraries in libshared (libarchive, pcre2, idn, ...). Declare the curl
API entry points with DLSYM_PROTOTYPE, resolve them in a dlopen_curl()
helper, and call the sym_* wrappers from callers. curl_glue_new() now
loads the library on first use, so consumers going through CurlGlue
pick this up automatically; journal-upload and report-upload call
dlopen_curl() directly since they use curl without the glue layer.

With this in place curl-util can live in libshared itself, linked only
against libcurl's headers (via libcurl_cflags). The libcurlutil_static
convenience library and the libcurl link dependency on systemd-imdsd,
systemd-pull, systemd-journal-upload and systemd-report go away.

Also move the easy_setopt() helper macro next to the DLSYM declarations
so all consumers use a single sym-prefixed definition, and add a
dlopen_curl() check to test-dlopen-so.

3 hours agotest: convert sd-journal tests to the new test macros
Frantisek Sumsal [Mon, 20 Apr 2026 15:10:57 +0000 (17:10 +0200)] 
test: convert sd-journal tests to the new test macros

So we can, hopefully, debug issues like #40551 more easily.

3 hours agojson-stream: hide JsonStreamQueueItem as an implementation detail
Daan De Meyer [Mon, 13 Apr 2026 08:18:04 +0000 (08:18 +0000)] 
json-stream: hide JsonStreamQueueItem as an implementation detail

The json-stream API previously exposed JsonStreamQueueItem and several
functions operating on it (json_stream_make_queue_item(),
json_stream_enqueue_item(), json_stream_queue_item_free(),
json_stream_queue_item_get_data()). These existed solely to support
sd-varlink's "defer-and-modify" pattern for streaming replies, where a
reply is held back so its "continues" field can be set before
transmission. This is a varlink protocol concern that should not leak
into the generic transport layer.

Similarly, the fd pushing API (json_stream_push_fd(),
json_stream_reset_pushed_fds()) and the pushed_fds state lived inside
JsonStream, even though fd-to-message association is a protocol-level
concern managed entirely by sd-varlink.

Rework the API so that:

- JsonStreamQueueItem and all its functions become static to
  json-stream.c. The only output API is now json_stream_enqueue_full()
  (accepting explicit fds) and the inline json_stream_enqueue() wrapper
  for the common no-fds case.

- The pushed_fds state moves from JsonStream into sd_varlink, where
  sd_varlink_push_fd() and sd_varlink_reset_fds() manage it directly.

- The deferred reply in sd-varlink changes from a JsonStreamQueueItem*
  to a plain sd_json_variant* plus a separate previous_fds/n_previous_fds
  pair, keeping the protocol-specific bookkeeping in sd-varlink where it
  belongs.

- A new varlink_enqueue() helper wraps json_stream_enqueue_full() with
  the varlink connection's pushed fds, transferring fd ownership to the
  queue item on success.

qmp-client.c is fixed to use the new API as well.

4 hours agofind-esp: rework ESP/XBOOTLDR discovery logic around returning an O_PATH fd (#41658)
Lennart Poettering [Mon, 20 Apr 2026 16:59:52 +0000 (18:59 +0200)] 
find-esp: rework ESP/XBOOTLDR discovery logic around returning an O_PATH fd (#41658)

Let O_PATH reign, let's make ESP/XBOOTLDR discovery return them
directly.

Split out of #41543 but makes a ton of sense anyway and on its own.

6 hours agofind-esp: return pinned fd to ESP/XBOOTLDR 41658/head
Lennart Poettering [Mon, 13 Apr 2026 16:04:29 +0000 (18:04 +0200)] 
find-esp: return pinned fd to ESP/XBOOTLDR

The reworks the ESP/XBOOTLDR logic to pin the ESP/XBOOTLDR via an fd,
and return that as optional return parameter.

So far we only pinned the parent dir of the ESP/XBOOTLDR, which was
useful when verifying that ESP/XBOOTLDR is actually a mount point by
comparing mount ids. This however became obsolete with
a98a6eb95cc980edab4b0f9c59e6573edc7ffe0c. Hence, let's clean this up,
and pin the inode we really care about and return it.

6 hours agochase: tighten flags checks in chase_and_unlinkat()
Lennart Poettering [Thu, 16 Apr 2026 03:44:44 +0000 (05:44 +0200)] 
chase: tighten flags checks in chase_and_unlinkat()

Some flags don't reasonably apply to chase_and_unlinkat() (because we
open the parent inode of an inode to delete, which is always a dir),
hence let's catch these flags when misused.

(I ran into this, and it was very confusing to debug, hence let's make
it easier)

6 hours agobtrfs-util: make sure btrfs_get_block_device_at() works when called without path
Lennart Poettering [Tue, 14 Apr 2026 07:32:32 +0000 (09:32 +0200)] 
btrfs-util: make sure btrfs_get_block_device_at() works when called without path

7 hours agosd-path: expose XDG 'projects' user dir
Lennart Poettering [Mon, 20 Apr 2026 09:41:53 +0000 (11:41 +0200)] 
sd-path: expose XDG 'projects' user dir

As per:

https://blog.tenstral.net/2026/04/hello-projects-directory.html

8 hours agotest: re-enable sync in TEST-25-IMPORT
Frantisek Sumsal [Mon, 20 Apr 2026 10:14:41 +0000 (12:14 +0200)] 
test: re-enable sync in TEST-25-IMPORT

Newer tar started using openat2() via open_subdir() to address
CVE-2025-45582 [0]. Now, gnulib, that tar uses, provides the openat2()
syscall in two ways [1]:

1) If glibc doesn't provide openat2(), it provides its own version in
   openat2.c, that tries to call openat2() syscall first, and if it
   returns ENOSYS, it emulates the function in userspace.

2) If glibc provides openat2(), it uses that directly, without providing
   any fallback on ENOSYS.

Quite recently our test suite started calling nspawn with
--suppress-sync=yes. This means that we call seccomp_suppress_sync(),
which eventually calls block_open_flag(), that blocks the openat2()
syscall completely and refuses it with ENOSYS as this syscall can't be
sensibly filtered (see the openat2()-relevant comments in
block_open_flag() and seccomp_restrict_sxid()). And when glibc provides
openat2(), there's no fallback, so the ENOSYS bubbles up to the user as:

TEST-25-IMPORT.sh[163]: + tar xzf /var/tmp/scratch.tar.gz
TEST-25-IMPORT.sh[163]: tar: ./adirectory/athirdfile: Cannot open: Function not implemented
TEST-25-IMPORT.sh[163]: tar: Exiting with failure status due to previous errors

Let's mitigate this by re-enabling sync for TEST-25-IMPORT, at least for
now.

[0] https://cgit.git.savannah.gnu.org/cgit/tar.git/commit/?id=75b03fdff48916bd0654677ed21379bdb0db016d
[1] https://cgit.git.savannah.gnu.org/cgit/gnulib.git/commit/?id=0b97ffdf32bdab909d02449043447237273df75e

11 hours agoupdate TODO
Lennart Poettering [Mon, 20 Apr 2026 10:35:12 +0000 (12:35 +0200)] 
update TODO

11 hours agoparse-util: rework safe_atou64() as wrapper around safe_atou64_full()
Lennart Poettering [Mon, 20 Apr 2026 07:59:56 +0000 (09:59 +0200)] 
parse-util: rework safe_atou64() as wrapper around safe_atou64_full()

Follow-up for: 023f88a6ab76b9784e9b6c6396227f1490c1a8c2

Claude complained...

11 hours agoJson underscorify even more (#41636)
Lennart Poettering [Mon, 20 Apr 2026 10:02:30 +0000 (12:02 +0200)] 
Json underscorify even more (#41636)

14 hours agoman/fstab-generator: fix option list and make formatting consistent
Felix Pehla [Wed, 15 Apr 2026 12:35:58 +0000 (14:35 +0200)] 
man/fstab-generator: fix option list and make formatting consistent

Add "overlay", which is already mentioned further down below, to the
list of possible options.

Consistently use <literal> for possible values of systemd.volatile=,
rather than <param> or no special formatting.

Use yes/no rather than true/false as boolean since that is what's used
everywhere else and I'm already touching the lines anyway.

14 hours agonspawn,shared/nsresource: fix copy-paste errno logging args
mukunda katta [Mon, 20 Apr 2026 04:29:54 +0000 (21:29 -0700)] 
nspawn,shared/nsresource: fix copy-paste errno logging args

In nspawn.c's run_container() the child_netns_fd = receive_one_fd(...)
failure path logged 'r' instead of the negative errno returned in
child_netns_fd, so the actual error from receive_one_fd was being
overwritten by whatever 'r' happened to hold. The other receive_one_fd
call sites in the same function use the returned fd variable directly
(mntns_fd, etc.), so align this one.

In shared/nsresource.c's nsresource_add_cgroup() the cgroup_fd_idx =
sd_varlink_push_dup_fd(...) failure path logged userns_fd_idx, which
is the previous successful push's index, not the negative errno we
just got from pushing cgroup_fd. Log cgroup_fd_idx instead.

Both were flagged by static analysis (#41709) and match the immediately
preceding userns_fd-path pattern that was presumably copy-pasted.

Refs #41709.

14 hours agocompress: simplify the condition a bit
Frantisek Sumsal [Sun, 19 Apr 2026 15:26:30 +0000 (17:26 +0200)] 
compress: simplify the condition a bit

Simply mirror the format we've already established in
decompress_blob_zstd().

14 hours agocompress: gracefully handle a truncated ZSTD frame
Frantisek Sumsal [Sun, 19 Apr 2026 13:47:11 +0000 (15:47 +0200)] 
compress: gracefully handle a truncated ZSTD frame

If a journal file contains a truncated ZSTD frame (i.e. a frame with
Frame_Content_Size > 0, but with not enough data in Data_Block),
ZSTD_decompressStream() would return a non-zero, non-error value. This
would then skip the error path in the ZSTD_isError() branch and we'd hit
the following assert:

$ build-local/journalctl -o cat --file zstd-truncated.journal
Assertion 'output.pos >= prefix_len + 1' failed at src/basic/compress.c:1236, function decompress_startswith_zstd(). Aborting.
Aborted                    (core dumped) build-local/journalctl -o cat --file zstd-truncated.journal

Let's handle this situation gracefully and return EBADMSG instead.

Also, add another journalctl invocation to the corrupted-journals test
that goes through the sd_journal_get_data() -> decompress_startswith_zstd()
code path which, among other things, covers the issue when run on the
provided journal file.

14 hours agotest: append .journal to unpacked corrupted journals
Frantisek Sumsal [Sun, 19 Apr 2026 14:24:55 +0000 (16:24 +0200)] 
test: append .journal to unpacked corrupted journals

Otherwise `journalctl --directory=` skips over them in the second part of
the test.

14 hours agoresolved: let's generate enum fields properly too 41636/head
Lennart Poettering [Tue, 14 Apr 2026 13:18:04 +0000 (15:18 +0200)] 
resolved: let's generate enum fields properly too

AFAICS none of the enums here uses dashes, hence this should not
actually have any effect except for being more correct.

14 hours agonetworkd: gnerate proper underscored enums in varlink interface
Lennart Poettering [Tue, 14 Apr 2026 13:16:47 +0000 (15:16 +0200)] 
networkd: gnerate proper underscored enums in varlink interface

AFAICS none of the states actually user dashes/underscores, but let's
prepare for the future and be fully correct here.

14 hours agomountfsd: generate properly underscored designator json strings
Lennart Poettering [Tue, 14 Apr 2026 13:15:05 +0000 (15:15 +0200)] 
mountfsd: generate properly underscored designator json strings

Let's make sure we generate data that will actually pass the IDL checks,
and use underscores for designator names.

(This is a bugfix)

14 hours agosd-json: add JSON_BUILD_PAIR_STRING_NON_EMPTY_UNDERSCORIFY() helper
Lennart Poettering [Tue, 14 Apr 2026 12:05:56 +0000 (14:05 +0200)] 
sd-json: add JSON_BUILD_PAIR_STRING_NON_EMPTY_UNDERSCORIFY() helper

it's the combination of JSON_BUILD_PAIR_STRING_NON_EMPTY
and JSON_BUILD_PAIR_STRING_UNDERSCORIFY

14 hours agosd-json: make sure SD_JSON_BUILD_STRING_UNDERSCORIFY() can deal with NULL strings
Lennart Poettering [Mon, 20 Apr 2026 07:35:33 +0000 (09:35 +0200)] 
sd-json: make sure SD_JSON_BUILD_STRING_UNDERSCORIFY() can deal with NULL strings

SD_JSON_BUILD_STRING() and everything else can deal with it, make sure
SD_JSON_BUILD_STRING_UNDERSCORIFY() can too.

15 hours agonspawn: avoid passing NULL to log_syntax() (#41712)
Christian Brauner [Mon, 20 Apr 2026 06:48:17 +0000 (08:48 +0200)] 
nspawn: avoid passing NULL to log_syntax()  (#41712)

And a couple of other cosmetic tweaks.

33 hours agoimport: fix an always-true assert() 41712/head
Frantisek Sumsal [Sat, 18 Apr 2026 17:22:40 +0000 (19:22 +0200)] 
import: fix an always-true assert()

33 hours agostrxcpyx: add a paranoia check for vsnprintf()'s return value
Frantisek Sumsal [Fri, 17 Apr 2026 17:52:53 +0000 (19:52 +0200)] 
strxcpyx: add a paranoia check for vsnprintf()'s return value

vsnprintf() can, under some circumstances, return negative value, namely
during encoding errors when converting wchars to multi-byte characters.
This would then wreak havoc in the arithmetics we do following the
vsnprintf() call. However, since we never do any wchar shenanigans in
our code it should never happen.

Let's encode this assumption into the code as an assert(), similarly how
we already do this in other places (like strextendf_with_separator()).

47 hours agoiovec-wrapper: fix memleak, rename functions for consistency, and introduce several...
Yu Watanabe [Sat, 18 Apr 2026 22:29:03 +0000 (07:29 +0900)] 
iovec-wrapper: fix memleak, rename functions for consistency, and introduce several helper functions (#41689)

2 days agoiovec-wrapper: introduce several more helper functions 41689/head
Yu Watanabe [Fri, 17 Apr 2026 14:06:28 +0000 (23:06 +0900)] 
iovec-wrapper: introduce several more helper functions

2 days agoiovec-wrapper: rename iovw_append() to iovw_extend()
Yu Watanabe [Fri, 17 Apr 2026 14:03:11 +0000 (23:03 +0900)] 
iovec-wrapper: rename iovw_append() to iovw_extend()

The naming is consistent with strv_extend().

This also
- introduces tiny iovw_extend_iov() wrapper,
- refuse when the source and target points to the same object,
- check the final count before extending in iovw_extend_iovw().

2 days agoiovec-wrapper: introduce iovw_concat()
Yu Watanabe [Fri, 17 Apr 2026 13:54:54 +0000 (22:54 +0900)] 
iovec-wrapper: introduce iovw_concat()

This is similar to iovw_to_cstring(), but allows embedded NUL, as this
just concat multiple iovec, the result may not be a string.

Now, iovw_to_cstring() internally uses iovw_concat().

2 days agoiovec-wrapper: introduce iovw_compare() and iovw_equal()
Yu Watanabe [Fri, 17 Apr 2026 13:53:56 +0000 (22:53 +0900)] 
iovec-wrapper: introduce iovw_compare() and iovw_equal()

2 days agoiovec-wrapper: fix memleak in iovw_consume() when len == 0
Yu Watanabe [Fri, 17 Apr 2026 13:52:18 +0000 (22:52 +0900)] 
iovec-wrapper: fix memleak in iovw_consume() when len == 0

This makes even when len == 0, the input buffer is freed.
The behavior is consistent with strv_consume() and friends.

2 days agoiovec-util: introduce IOVEC_SHIFT() macro and friends
Yu Watanabe [Mon, 23 Mar 2026 14:04:05 +0000 (23:04 +0900)] 
iovec-util: introduce IOVEC_SHIFT() macro and friends

2 days agosd-dhcp-client: fix memleak of sd_dhcp_client.timeout_ipv6_only_mode
Yu Watanabe [Fri, 10 Apr 2026 04:05:48 +0000 (13:05 +0900)] 
sd-dhcp-client: fix memleak of sd_dhcp_client.timeout_ipv6_only_mode

This also drops unnecessary zero assignments.

2 days agomailmap: name change
Sebastian Bernardt [Sat, 18 Apr 2026 11:19:08 +0000 (21:19 +1000)] 
mailmap: name change

2 days agorepart: add EncryptKDF= option for LUKS2 partitions
Nandakumar Raghavan [Mon, 6 Apr 2026 10:42:51 +0000 (10:42 +0000)] 
repart: add EncryptKDF= option for LUKS2 partitions

systemd-repart currently creates LUKS2 encrypted partitions using
libcryptsetup's default KDF (Argon2id), which requires ~1GB of memory
during key derivation. This is too much for memory-constrained
environments such as kdump with limited crashkernel memory, where
luksOpen fails due to insufficient memory.

Add an EncryptKDF= option to repart.d partition definitions that allows
selecting the KDF type. Supported values are:

- "argon2id" — Argon2id with libcryptsetup-benchmarked parameters
- "pbkdf2"  — PBKDF2 with libcryptsetup-benchmarked parameters
- "minimal" — PBKDF2 with SHA-512, 1000 iterations, no benchmarking,
  matching the existing cryptsetup_set_minimal_pbkdf() behaviour used
  for TPM2-sealed keys

When not specified, the libcryptsetup default (argon2id) is used,
preserving existing behaviour.

The KDF type is applied via sym_crypt_set_pbkdf_type() after
sym_crypt_format() and before any keyslots are added.

2 days agobootspec: two smaller tweaks to bootspec.c (#41690)
Luca Boccassi [Sat, 18 Apr 2026 10:02:35 +0000 (11:02 +0100)] 
bootspec: two smaller tweaks to bootspec.c (#41690)

The first commit is prep work for #41543 but I think it makes a ton of
sense on its own as it cleans up logging a bit.

2 days agorandom-util: introduce random_bytes_allocate_iovec() helper function
Yu Watanabe [Wed, 18 Mar 2026 10:10:01 +0000 (19:10 +0900)] 
random-util: introduce random_bytes_allocate_iovec() helper function

It is similar to crypto_random_bytes_allocate_iovec(), but possibly
insecure.

2 days agobootspec: improve documentation around id/file BootEntry fields 41690/head
Lennart Poettering [Wed, 15 Apr 2026 14:19:43 +0000 (16:19 +0200)] 
bootspec: improve documentation around id/file BootEntry fields

2 days agobootspec: make boot_filename_extract_tries() ready for use outside of bootspec.c
Lennart Poettering [Wed, 15 Apr 2026 14:18:53 +0000 (16:18 +0200)] 
bootspec: make boot_filename_extract_tries() ready for use outside of bootspec.c

2 days agoVarious useful helpers (#41684)
Lennart Poettering [Sat, 18 Apr 2026 07:50:19 +0000 (09:50 +0200)] 
Various useful helpers (#41684)

Split out of #41543.

These don't make too much sense on their own, but they also don't really
hurt. They are preparation for #41543, but in order to make things
either to review I split these four commits out, since they are not
directly part of what the PR shall achieve

2 days agoboot: minor clean-ups in initrd_unregister()
Lennart Poettering [Tue, 7 Apr 2026 20:25:24 +0000 (22:25 +0200)] 
boot: minor clean-ups in initrd_unregister()

2 days agobootctl: minor tweaks (#41695)
Lennart Poettering [Sat, 18 Apr 2026 06:41:46 +0000 (08:41 +0200)] 
bootctl: minor tweaks (#41695)

This is split out of #41543, but makes sense on its own.

2 days agoboot: switch initrd_register() to use _cleanup_free_ and other tweaks
Lennart Poettering [Fri, 20 Mar 2026 21:07:51 +0000 (22:07 +0100)] 
boot: switch initrd_register() to use _cleanup_free_ and other tweaks

3 days agoman: Fix NOTES formatting
Tobias Stoeckmann [Fri, 17 Apr 2026 19:48:53 +0000 (21:48 +0200)] 
man: Fix NOTES formatting

The NOTES section in os-release(5) contains an unusual formatting.
Switch function and ulink tags and remove a newline within ulink text to
keep the entry formatting in sync with others. Also, this preserves the
formatting within the text itself.

Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org>
3 days agonetwork/json: two trivial cleanups (#41693)
Zbigniew Jędrzejewski-Szmek [Fri, 17 Apr 2026 17:25:17 +0000 (19:25 +0200)] 
network/json: two trivial cleanups (#41693)

3 days agostring-util: make make_cstring() take void* rather than char*
Yu Watanabe [Thu, 16 Apr 2026 23:41:50 +0000 (08:41 +0900)] 
string-util: make make_cstring() take void* rather than char*

It is typically used for making C string embedded in a binary data.
Hence, the input pointer may not be char*.

3 days agomountpoint-util: initialize mnt_id for name_to_handle_at(AT_HANDLE_MNT_ID_UNIQUE)
Yu Watanabe [Fri, 17 Apr 2026 06:43:38 +0000 (15:43 +0900)] 
mountpoint-util: initialize mnt_id for name_to_handle_at(AT_HANDLE_MNT_ID_UNIQUE)

Suppress the following message:
```
$ sudo valgrind --leak-check=full build/networkctl dhcp-lease wlp59s0
==175708== Memcheck, a memory error detector
==175708== Copyright (C) 2002-2024, and GNU GPL'd, by Julian Seward et al.
==175708== Using Valgrind-3.26.0 and LibVEX; rerun with -h for copyright info
==175708== Command: build/networkctl status wlp59s0
==175708==
==175708== Conditional jump or move depends on uninitialised value(s)
==175708==    at 0x4BC33D1: inode_same_at (stat-util.c:610)
==175708==    by 0x4BF1972: inode_same (stat-util.h:86)
==175708==    by 0x4BF48FE: running_in_chroot (virt.c:817)
==175708==    by 0x4B16643: running_in_chroot_or_offline (verbs.c:37)
==175708==    by 0x4B175CE: _dispatch_verb_with_args (verbs.c:136)
==175708==    by 0x4B17868: dispatch_verb (verbs.c:160)
==175708==    by 0x407CBB: networkctl_main (networkctl.c:249)
==175708==    by 0x407D06: run (networkctl.c:263)
==175708==    by 0x407D39: main (networkctl.c:266)
==175708==
```
Not sure if it is an issue in valgrind or glibc, but at least there is
nothing we can do except for working around it.

3 days agoA small batch of conversions to the new option+verbs macros (#41671)
Zbigniew Jędrzejewski-Szmek [Fri, 17 Apr 2026 17:04:04 +0000 (19:04 +0200)] 
A small batch of conversions to the new option+verbs macros (#41671)

Those are all relatively straightforward.

3 days agosleep: convert to "verbs", using the new option+verb macros
Zbigniew Jędrzejewski-Szmek [Fri, 17 Apr 2026 06:00:54 +0000 (08:00 +0200)] 
sleep: convert to "verbs", using the new option+verb macros

We had verb-like dispatch, but done in a manual way. We have a fairly
heavy preperation steps that wraps all operations in the same way, so we
don't want to call the operation implementation functions directly. But
let's use the generic verb machinery and pass the state directly using
the userdata pointer and the recently added verb data pointer.

--help output is substantially the same, but options are now in a new
section below the verbs.

3 days agoRework ssh-issue to be verb-based and convert to the new verb+option parsing (#41668)
Zbigniew Jędrzejewski-Szmek [Fri, 17 Apr 2026 17:01:01 +0000 (19:01 +0200)] 
Rework ssh-issue to be verb-based and convert to the new verb+option parsing (#41668)

This is a bit involved because the old interface was documented, so
compat glue needed to be added.
But I think it's an improvement overall.

3 days agobootctl: make bootspec-util.c independent of bootctl.c 41695/head
Lennart Poettering [Fri, 17 Apr 2026 14:34:34 +0000 (16:34 +0200)] 
bootctl: make bootspec-util.c independent of bootctl.c

This changes boot_config_load_and_select() to also take the root path as
input, just like the ESP and XBOOTLDR path.

This has the benefit of making the whole file independent of bootctl.c,
which means we can link it into a separate test, and is preparatory work
for a follow-up commit.

3 days agobootctl: drop redundant log message
Lennart Poettering [Mon, 13 Apr 2026 20:50:26 +0000 (22:50 +0200)] 
bootctl: drop redundant log message

If unprivileged_mode is false then verify_esp() will treat access errors
like any other and log about them. Here we set it to false, hence
there's no point to log a 2nd time.

3 days agonetwork/json: drop unnecessary return value assignment 41693/head
Yu Watanabe [Thu, 9 Apr 2026 23:02:41 +0000 (08:02 +0900)] 
network/json: drop unnecessary return value assignment

3 days agonetwork/json: fix error handling
Yu Watanabe [Thu, 9 Apr 2026 23:02:14 +0000 (08:02 +0900)] 
network/json: fix error handling

3 days agostat-util: add vfs_free_bytes() 41684/head
Lennart Poettering [Mon, 13 Apr 2026 15:57:10 +0000 (17:57 +0200)] 
stat-util: add vfs_free_bytes()

The casts and the right fields to multiply aren't entirely trivial,
let's add a helper for it.

3 days agostring-util: add minor optimization to strrstr()
Lennart Poettering [Wed, 15 Apr 2026 14:06:04 +0000 (16:06 +0200)] 
string-util: add minor optimization to strrstr()

3 days agostring-util: add new strrstr_no_case() call
Lennart Poettering [Wed, 15 Apr 2026 14:05:37 +0000 (16:05 +0200)] 
string-util: add new strrstr_no_case() call

3 days agoparse-util: add safe_atou64_full()
Lennart Poettering [Fri, 17 Apr 2026 12:56:15 +0000 (14:56 +0200)] 
parse-util: add safe_atou64_full()

3 days agoboot: gracefully handle LoadFile() implementations that return EFI_SUCCESS with a...
Lennart Poettering [Fri, 17 Apr 2026 12:58:46 +0000 (14:58 +0200)] 
boot: gracefully handle LoadFile() implementations that return EFI_SUCCESS with a NULL buffer

LoadFile() with a NULL buffer is supposed to return the file size
without acquiring the data and return EFI_BUFFER_TOO_SMALL.

However it appears some firmware returns EFI_SUCCESS in case the file is
empty, i.e. the file size returned is zero. And I guess that's even
fine.

Let's handle this gracefully hence.

3 days agoboot: never auto-boot a menu entry with the non-default profile
Lennart Poettering [Fri, 17 Apr 2026 10:19:58 +0000 (12:19 +0200)] 
boot: never auto-boot a menu entry with the non-default profile

When figuring out which menu entry to pick by default, let's not
consider any with a profile number > 0. This reflects that fact that
additional profiles are generally used for
debug/recovery/factory-reset/storage target mode boots, and those should
never be auto-selected. Hence do a simple check: if profile != 0, simply
do not consider the entry as a default.

We might eventually want to beef this up, and add a property one can set
in the profile metadata that controls this behaviour, but for now let's
just do a this simple fix.

3 days agoman: drop redundant word from varlinkctl man page
Lennart Poettering [Fri, 17 Apr 2026 13:12:05 +0000 (15:12 +0200)] 
man: drop redundant word from varlinkctl man page

3 days agonamespace: don't log misleading error in the r > 0 path
Frantisek Sumsal [Fri, 17 Apr 2026 13:51:40 +0000 (15:51 +0200)] 
namespace: don't log misleading error in the r > 0 path

fd_is_fs_type() returns < 0 for errors, 0 for false, and > 0 for true, so
in the r > branch we'd most likely report EPERM together with the error
message which is misleading.

3 days agoRevert "ci: Switch PR review workflow to Opus 4.7 via Mantle endpoint"
Luca Boccassi [Fri, 17 Apr 2026 13:16:21 +0000 (14:16 +0100)] 
Revert "ci: Switch PR review workflow to Opus 4.7 via Mantle endpoint"

This reverts commit 011233858520fe607eeff29cfc92d40cf71a6002.

3 days agosystemctl: add --kernel-cmdline= argument
Luca Boccassi [Thu, 16 Apr 2026 22:50:07 +0000 (23:50 +0100)] 
systemctl: add --kernel-cmdline= argument

Allows appending kernel command line arguments, like
kexec-tool does. This is especially needed for the integration
tests, as mkosi adds a bunch of options that are needed for the
test suite to work, and it breaks without them.

3 days agoFollowups for recent changes to basic/iovec-wrapper (#41676)
Luca Boccassi [Fri, 17 Apr 2026 12:55:51 +0000 (13:55 +0100)] 
Followups for recent changes to basic/iovec-wrapper (#41676)

3 days agonspawn: avoid passing NULL to log_syntax()
Frantisek Sumsal [Fri, 17 Apr 2026 12:55:29 +0000 (14:55 +0200)] 
nspawn: avoid passing NULL to log_syntax()

If range is NULL (i.e. when PrivateUsers= doesn't contain ':'),
both later error paths will then pass NULL to log_syntax():

~# cat foo.nspawn
[Exec]
PrivateUsers=9999999999999999999

~# SYSTEMD_LOG_LEVEL=debug systemd-nspawn -D foo |& grep foo.nspawn
Found settings file: /root/foo.nspawn
/root/foo.nspawn:2: UID/GID shift invalid, ignoring: (null)

or

~# cat foo.nspawn
[Exec]
PrivateUsers=4294967294

~ # SYSTEMD_LOG_LEVEL=debug systemd-nspawn -D foo |& grep foo.nspawn
Found settings file: /root/foo.nspawn
/root/foo.nspawn:2: UID/GID shift and range combination invalid, ignoring: (null)

Let's just use rvalue in both of these cases instead.

3 days agobasic/iovec-wrapper: use iovw_append in one more place 41676/head
Zbigniew Jędrzejewski-Szmek [Fri, 17 Apr 2026 10:25:58 +0000 (12:25 +0200)] 
basic/iovec-wrapper: use iovw_append in one more place

3 days agobasic/iovec-wrapper: fix potential memleak on error
Zbigniew Jędrzejewski-Szmek [Fri, 17 Apr 2026 10:19:40 +0000 (12:19 +0200)] 
basic/iovec-wrapper: fix potential memleak on error

Also reorder the functions in the call stack order.

3 days agossh-issue: replace verb options by normal verbs 41668/head
Zbigniew Jędrzejewski-Szmek [Fri, 17 Apr 2026 07:07:31 +0000 (09:07 +0200)] 
ssh-issue: replace verb options by normal verbs

The interface of this program was rather strange. It took an option that
specified what to do, but that option behaved exactly like a verb. Let's
change the interface to the more modern style with verbs. Since the
inteface was documented in the man page, provide a compat shim to handle
the old options.

(In practice, I doubt anybody will notice the change. But since it was
documented, it's easier to provide the compat then to think too much
whether it is actually needed. I think we can drop it an year or so.)

3 days agosocket-proxyd: convert to the new option parser 41671/head
Zbigniew Jędrzejewski-Szmek [Fri, 17 Apr 2026 06:00:58 +0000 (08:00 +0200)] 
socket-proxyd: convert to the new option parser

--help output is identical in content. --help/--version as now
first in the list, as is usual.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
3 days agorandom-seed: convert to "verbs", use the new option+verb code
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 21:42:48 +0000 (23:42 +0200)] 
random-seed: convert to "verbs", use the new option+verb code

--help output is the same except for indentation.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
3 days agossh-issue: convert to the new option parser
Zbigniew Jędrzejewski-Szmek [Fri, 17 Apr 2026 06:41:30 +0000 (08:41 +0200)] 
ssh-issue: convert to the new option parser

--make-vsock and --rm-vsock are now described in --help, not only
shown in synopsis.

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
4 days agostring-util: check for overflow in strrep() (#41661)
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 20:36:22 +0000 (22:36 +0200)] 
string-util: check for overflow in strrep() (#41661)

This simply mirrors the same overflow check we already have in
strrepa(), in case someone passed us a sufficiently long string.

strrep() is currently used only in tests, so this is just hardening.

4 days agoreport: add ability to upload reports over http (#41440)
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 20:35:05 +0000 (22:35 +0200)] 
report: add ability to upload reports over http (#41440)

4 days agoSupport for "positional options" and another batch of conversions (#41651)
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 20:33:06 +0000 (22:33 +0200)] 
Support for "positional options" and another batch of conversions (#41651)

To make review more sensible, I split out the reordering into separate
commits when there was a lot of reordering.

4 days agoreport: limit server answer to 1 MiB 41440/head
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 15:54:03 +0000 (17:54 +0200)] 
report: limit server answer to 1 MiB

As suggested in review.

4 days agotest: add HTTPS upload test for systemd-report
Zbigniew Jędrzejewski-Szmek [Tue, 7 Apr 2026 12:34:53 +0000 (14:34 +0200)] 
test: add HTTPS upload test for systemd-report

Extend fake-report-server.py with optional --cert, --key, --port
arguments for TLS support. Add a test case that generates a
self-signed certificate and tests HTTPS upload of metrics and facts.

Also exercise the --header param.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
4 days agotest: add HTTP upload test for systemd-report
Zbigniew Jędrzejewski-Szmek [Tue, 7 Apr 2026 12:09:25 +0000 (14:09 +0200)] 
test: add HTTP upload test for systemd-report

Add a fake HTTP server (fake-report-server.py) that accepts JSON POST
requests and validates the report structure, and test cases in
TEST-74-AUX-UTILS.report.sh that exercise plain HTTP upload of both
metrics and facts.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
4 days agoreport: add option to inject additional HTTP headers
Zbigniew Jędrzejewski-Szmek [Wed, 1 Apr 2026 05:32:46 +0000 (07:32 +0200)] 
report: add option to inject additional HTTP headers

This is useful when debugging things. The option is named and implements
the same logic as imdsd.

4 days agoshared/webutil: reorder .c to match .h, mark one more function as _pure_
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 15:31:59 +0000 (17:31 +0200)] 
shared/webutil: reorder .c to match .h, mark one more function as _pure_

4 days agoreport: add basic upload functionality
Zbigniew Jędrzejewski-Szmek [Fri, 6 Mar 2026 10:36:13 +0000 (11:36 +0100)] 
report: add basic upload functionality

4 days agoshared/curl-util: add curl_append_to_header
Zbigniew Jędrzejewski-Szmek [Mon, 13 Apr 2026 19:46:44 +0000 (21:46 +0200)] 
shared/curl-util: add curl_append_to_header

4 days agotest-string-util: test empty_to_null on a char array
Zbigniew Jędrzejewski-Szmek [Mon, 13 Apr 2026 19:46:12 +0000 (21:46 +0200)] 
test-string-util: test empty_to_null on a char array

Unfortunately empty_to_null(t) where t is char[] fails. But it
works with &t[0].

4 days agotest: add test-iovec-wrapper
Zbigniew Jędrzejewski-Szmek [Tue, 14 Apr 2026 22:48:31 +0000 (00:48 +0200)] 
test: add test-iovec-wrapper

Tests the old code in iovec-wrapper and the two new functions.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
4 days agobasic/iovec-wrapper: add iovw_append and iovw_to_cstring
Zbigniew Jędrzejewski-Szmek [Mon, 13 Apr 2026 19:41:32 +0000 (21:41 +0200)] 
basic/iovec-wrapper: add iovw_append and iovw_to_cstring

Existing iovw_append is renamed to iovw_append_iovw.
iovw_consume is made noninline.

4 days agotimesync: verify the actual size of the received data
Frantisek Sumsal [Thu, 16 Apr 2026 09:13:27 +0000 (11:13 +0200)] 
timesync: verify the actual size of the received data

iov.iov_len doesn't change after calling recvmsg() so it remains set to
sizeof(ntpmsg), which makes the check for a short packet always false.
Let's fix that by checking the actual size of the received data instead.

4 days agoci: Switch PR review workflow to Opus 4.7 via Mantle endpoint
Daan De Meyer [Thu, 16 Apr 2026 17:04:43 +0000 (19:04 +0200)] 
ci: Switch PR review workflow to Opus 4.7 via Mantle endpoint

Opus 4.7 is in research preview on Bedrock and the Invoke API rejects
the beta headers Claude Code sends ("invalid beta flag"). Enable the
Mantle endpoint, which serves Claude via the native Anthropic API shape
and accepts those headers, and switch the model ID to the Mantle form
(no region prefix or version suffix).

4 days agopcrextend: convert to the new option parser
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 16:47:33 +0000 (18:47 +0200)] 
pcrextend: convert to the new option parser

--help is identical except for indentation and common option strings.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
4 days agopath-tool: convert to the new option parser
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 16:34:53 +0000 (18:34 +0200)] 
path-tool: convert to the new option parser

--help output is identical except for indentation and common option
strings.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
4 days agooomd: convert to the new option parser
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 16:33:32 +0000 (18:33 +0200)] 
oomd: convert to the new option parser

--help output is idential except for indentation.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
4 days agooomctl: convert to the new option and verb parsers
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 16:32:13 +0000 (18:32 +0200)] 
oomctl: convert to the new option and verb parsers

--help is the same, except for whitespace and common option
descriptions.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
4 days agostring-util: check for overflow in strrep() 41661/head
Frantisek Sumsal [Thu, 16 Apr 2026 09:59:36 +0000 (11:59 +0200)] 
string-util: check for overflow in strrep()

This simply mirrors the same overflow check we already have in
strrepa(), in case someone passed us a sufficiently long string.

strrep() is currently used only in tests, so this is just hardening.

4 days agobasic/iovec-wrapper: drop unused code
Zbigniew Jędrzejewski-Szmek [Tue, 14 Apr 2026 06:28:28 +0000 (08:28 +0200)] 
basic/iovec-wrapper: drop unused code

All non-test users iovec_wrapper define the struct as a field in a
bigger structure, so we never free it individually. Let's simplify the
code and assume it is never null.

4 days agoshared/facts: use SD_JSON_BUILD_PAIR_VARIANT in one more place
Zbigniew Jędrzejewski-Szmek [Tue, 7 Apr 2026 11:32:33 +0000 (13:32 +0200)] 
shared/facts: use SD_JSON_BUILD_PAIR_VARIANT in one more place

Suggested in review by Claude.

4 days agojournal-upload: require TLS 1.2 as the minimum version
Zbigniew Jędrzejewski-Szmek [Tue, 7 Apr 2026 11:25:08 +0000 (13:25 +0200)] 
journal-upload: require TLS 1.2 as the minimum version

RFC 8996 says:
> This document formally deprecates Transport Layer Security (TLS)
> versions 1.0 (RFC 2246) and 1.1 (RFC 4346). Accordingly, those
> documents have been moved to Historic status. These versions lack
> support for current and recommended cryptographic algorithms and
> mechanisms, and various government and industry profiles of
> applications using TLS now mandate avoiding these old TLS versions.
> TLS version 1.2 became the recommended version for IETF protocols in
> 2008 (subsequently being obsoleted by TLS version 1.3 in 2018),
> providing sufficient time to transition away from older versions.
> Removing support for older versions from implementations reduces the
> attack surface, reduces opportunity for misconfiguration, and
> streamlines library and product maintenance.

This code probably only talks to our own receiver which uses
libmicrohttpd. That in turn delegates to GnuTLS, which supports
1.2, 1.3, 3.0, etc.

4 days agomeson: use a convenience lib for curl-util.c
Zbigniew Jędrzejewski-Szmek [Tue, 31 Mar 2026 11:08:03 +0000 (13:08 +0200)] 
meson: use a convenience lib for curl-util.c

Previously we compiled curl-util.c at least two times, and then also
shared it using the extract+object. Let's build a static "convenience lib"
for it.

(Using extract+object everywhere is not possible because the different
places where it is used are conditionalized independently so we don't
have a single "source" that is always available.)

4 days agofirstboot: use parse_boolean_argument in one more place 41651/head
Zbigniew Jędrzejewski-Szmek [Thu, 16 Apr 2026 07:20:31 +0000 (09:20 +0200)] 
firstboot: use parse_boolean_argument in one more place

This was pointed out in review.

4 days agofirstboot: use free_and_strdup_warn in parse_argv
Zbigniew Jędrzejewski-Szmek [Tue, 14 Apr 2026 14:31:15 +0000 (16:31 +0200)] 
firstboot: use free_and_strdup_warn in parse_argv

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>