Commit Graph
100 Commits
Author SHA1 Message Date
Yu Watanabe 6a5809b2a8 pidfd: introduce pidfd_info_mask_is_supported() (#43298)
The helper is currently unused. But should be useful for checking the
kernel features. It will be used in systemd-coredump.
2026-08-15 03:32:20 +09:00
Yu Watanabe e3a224a46d sd-varlink: several fixlets (#43369) 2026-08-15 01:38:18 +09:00
Yu Watanabe f807a32125 coredump: do not leak TID in the host to container (#43349)
PID, UID, and GID are converted by sending struct ucred, however, TID
was not converted. Let's convert TID if corresponding pidfd exists, and
discards TID otherwise.

Fixes 4c7af7d9d1.
2026-08-15 01:38:04 +09:00
Yu Watanabe 7ae2bc9199 pidfd-util: introduce pidfd_info_mask_is_supported() helper function
Since kernel v6.19, ioctl(PIDFD_GET_INFO) can return the set of
supported flags when PIDFD_INFO_SUPPORTED_MASK is specified.

This allows checking whether, e.g., PIDFD_INFO_COREDUMP_SIGNAL is
supported by the running kernel.
2026-08-15 01:35:23 +09:00
Yu Watanabe 73e67f5fb1 test: split out test-pidfd-util from test-process-util
The tested function pidfd_get_inode_id_self_cached() is provided by
pidfd-util.c. Let's introduce a new unit test for the file.
2026-08-15 01:35:23 +09:00
Yu Watanabe 534a73fd3f coredump: do not leak TID in the host to container
PID, UID, and GID are converted by sending struct ucred, however,
TID was not converted. Let's convert TID if corresponding pidfd exists,
and discards TID otherwise.

Fixes 4c7af7d9d1.
2026-08-15 00:11:59 +09:00
Yu Watanabe 63da977f64 sd-varlink: do not call disconnect callback for incomplete connection
The connect callback is called after sd_varlink_server_add_connection()
succeeds. Do not call the disconnect callback for connections that have
not been established yet.
2026-08-14 23:56:19 +09:00
Yu Watanabe 0bd40fdc07 json-stream: do not take ownership of passed fds on failure
This makes json_stream_attach_fds() and json_stream_connect_fd_pair()
leave the passed file descriptors with the caller on failure. Callers
should call TAKE_FD() only after a successful call.

Also make qmp_client_connect_fd() always take ownership of the passed
file descriptor, including on failure. Previously, ownership of the
passed file descriptor on failure was unclear and depended on where
the function failed.
2026-08-14 23:55:51 +09:00
Yu Watanabe dc5de3fc03 json-stream: refuse to attach already attached fds
json_stream_attach_fds() closes already attached fds.
Hence, the new fds must be different from the already attached ones.
2026-08-14 00:54:52 +09:00
Yu Watanabe 3e96a99bab sd-varlink: fix memleak on failure path 2026-08-14 00:54:52 +09:00
Yu Watanabe 8f4cd7de43 resolvectl: fix query option handling and resolvconf input errors (#43370) 2026-08-14 00:35:58 +09:00
Yu Watanabe df9265b5a3 resolved: fix domain replacement and delegate DNS parsing (#43365) 2026-08-14 00:29:26 +09:00
Yu Watanabe cad2c455ec fstab-filter: fix preserve fstab option escaping (#43274)
Fixes #42787.
2026-08-14 00:23:47 +09:00
Yu Watanabe 3ae53ab8f6 analyze: allow --json= for the chid, blame and identify-tpm2 verbs (#43366)
verb_chid(), verb_blame() and verb_identify_tpm2() all render their
output via table_print_with_pager() with arg_json_format_flags, so JSON
output has been implemented for them since each verb was introduced.
None of them was ever added to the verb allowlist
that gates --json=, so e.g. systemd-analyze chid --json=pretty failed
with:

Option --json= is only supported for security, inspect-elf,
dlopen-metadata, ...

This adds them to the allowlist and the error message. After a sweep of
src/analyze/ for arg_json_format_flags, these are the only remaining
verbs that render through it but were not allowlisted.

has-tpm2 is deliberately not included: verb_has_tpm2() defers to
verb_has_tpm2_generic(), which writes plain text via printf() and has no
JSON support, so accepting --json= there would silently ignore it. The
table_print_with_pager() call in analyze-has-tpm2.c
belongs to verb_identify_tpm2(), which is what got allowlisted instead.

The chid gap went unnoticed because its TEST-65-ANALYZE coverage is
guarded behind a check for SMBIOS board_vendor and a non-container
environment, so it only runs on bare-metal/VM runners.
2026-08-13 00:06:07 +09:00
Yu Watanabe 4443d0ec16 Fix error paths for pcrextend_pcr_now and pkcs7_extract_signers (#43357)
- pcrextend: Fix use-after-free/double-free error in pcrextend_pcr_now

  With SignInitrdPCRs=disabled in mkosi the TPM/PCR services are broken
which triggers the error path in the varlink call which means that we
get parameters set in the response. The wrong ownership assumption when
looking at the reply with _cleanup_ set caused a memory corruption that
surfaced in systemd-sysext with an ABRT.
This is a common mistake done with the API, fix it by not setting
_cleanup_(sd_json_variant_unrefp).

- pkcs7: Correct error handling for pkcs7_extract_signers

  The lack of error handling for sym_i2d_X509_NAME/sym_i2d_ASN1_INTEGER
means that we get a NULL iovec that will cause an assertion failure
later. The use of regular free for OpenSSL is probably okay but since
the allocator can differ, one should use OPENSSL_free.
Add error handling and do an explicit copy instead of ownership transfer
between possibly different allocators.
2026-08-12 02:48:51 +09:00
Yu Watanabe 918f1462d7 pidref: introduce pidref_set_pid_full() and friends
By passing the PIDFD_THREAD flag, we can get pidfd of a worker thread.
The flag is supported since kernel v6.9.
2026-08-11 00:27:15 +09:00
Yu Watanabe 0ce8c68f02 include: use linux/pidfd.h rather than sys/pidfd.h
Since glibc-2.43, sys/pidfd.h defines struct pidfd_info, but its
definition is slightly older compared with linux v6.19. See
https://sourceware.org/git/?p=glibc.git;a=commit;h=c0c9524a11c56889ec5b1de2e0b78112f2ebc0b7
https://lore.kernel.org/all/20251028-work-coredump-signal-v1-0-ca449b7b7aa0@kernel.org/

This imports linux/pidfd.h (and linux/ioctl.h) from the kernel 7.2-rc6,
and make our header that overrides sys/pidfd.h includes linux/pidfd.h.
Then, we can always use uptodate definition of struct pidfd_info.

Note, linux/pidfd.h includes linux/fcntl.h, but it conflicts glibc's
fcntl.h. So, this also replaces linux/fcntl.h with glibc's fcntl.h.
2026-08-11 00:27:15 +09:00
Yu Watanabe b9a41ba539 hwdb: fix syncing from uefi.org and update (#43348)
Syncing acpi/pnp data from uefi.org has been broken for a while due to
changes to the server trying to block scrapers. Set custom user agent
string to be allowed to connect.
2026-08-10 23:00:56 +09:00
Yu Watanabe 7427ac3a63 kernel-install: configurable entry name format (#43290)
For some of us building image based operating systems with
`systemd-sysupdate` it's useful to have UKI filenames that encode
`IMAGE_VERSION` (and architecture). For example
`SimonOS_45.20260805.0_x86-64.efi`.

Currently to do this I have to manually post-process around the `.efi`
produced by `60-ukify` because it is named
`$ENTRY_TOKEN-$KERNEL_VERSION.efi`. It'd be very useful if I could skip
that step and instead have the image built directly without this
post-processing step; then extract the UKI and /usr partitions and plop
them onto my update server. It makes the build much more "install RPMs
into a tree and you're done" (barring other things `60-ukify` currently
can't do but I have follow-ups for those in mind).

This PR adds a knob to `install.conf` to let users specify a custom
format for the output filename for both UKI's and BLS entries produced
by `kernel-install`.

It accepts the following specifiers:

- `%e`: entry token
- `%v`: kernel version being installed
- Several common specifiers
    
The default is %e-%v, which is the current behavior. With
`entry_name_format=%M_%A_%a`, an OS with `IMAGE_ID=SimonOS` and
`IMAGE_VERSION=1.0` would get moved to `SimonOS_1.0_x86-64.efi`.
    
The resolved name is exported as `$KERNEL_INSTALL_ENTRY_NAME` for shell
plugins. Both `90-uki-copy.install` and `90-loaderentry.install` are
updated to use it, with a fallback to `$ENTRY_TOKEN-$KERNEL_VERSION` for
compatibility with older kernel-install versions.
2026-08-08 04:09:10 +09:00
Yu Watanabe 8c3af1bc82 TEST-92-TPM2-SWTPM: set a higher priority
TEST-92-TPM2-SWTPM requires about 15 minutes on GitHub,
if it starts at the very end, the total CI run simply waits for
the test finished, and wastes the last 15 minutes.
Starting earlier should slightly improve the performance.
2026-08-07 11:56:44 +02:00
Yu Watanabe f8f2860750 core/service: Prevent accidental service termination during reload (#39692)
We currently blindly send the configured reload signal (e.g. SIGHUP or
SIGUSR1) to the main service PID for Type=notify-reload units, even if
the service hasn't installed a userspace handler. This can lead to
invoking unintended default behavior (typically process termination) in
daemons which later deprecate and remove their reload handler.

This is a real problem we have seen in production on multiple occasions.
In one particularly egregious instance, a production distributed storage
service had a large percentage of its nodes all terminate at once when
sent a reload signal. In this case a signal handler had been removed,
but another place still sending the signal was missed.

To mitigate this, introduce two new checks for Type=notify-reload
services:

1. On READY=1: When the service first sends READY=1 during initial
startup, we check for the handler. If it's missing, the service startup
is failed with SERVICE_FAILURE_PROTOCOL. This enforces the contract that
services *must* install their handler before signalling readiness.

2. On reload: Immediately before sending the reload signal, we check
again. If the handler is now missing, we log a warning but still send
the signal. This preserves the requested operator action while making
the missing handler visible.

The startup check catches definite static misconfiguration before the
service is accepted as ready. The reload check is advisory because the
service has already started successfully, but warns if its handler later
disappears. Together these provide a best-effort safety net while
preserving the agreed reload semantics.
2026-08-07 01:23:03 +09:00
Yu Watanabe 1a15ce95ac sysupdate: fix transfer config parsing and cleanup regressions (#43287) 2026-08-06 20:20:29 +09:00
Yu Watanabe 0e410a6b9d sd-journal: prefer exact cursor match after seek (#43297)
Fixes #31516.
2026-08-06 05:48:05 +09:00
Yu Watanabe 5f53643138 sysctl: add --verify option to verify written values (#43258) 2026-08-06 05:46:11 +09:00
Yu Watanabe 0f8c9182f3 pcrlock: error out if requested PCR was dropped (#43260)
- --strict=/--full moved to the OPTION_LONG() parser framework that
replaced getopt in the meantime
- the is-supported commit is dropped, main grew that verb independently.
That also gets rid of the early tpm2_support() gate that broke CI back
then, and TEST-70-TPM2 runs with a software TPM these days anyway
- special_glyph() → glyph() renames
- the log table PCR filter needs an EVENT_LOG_RECORD_IS_PCR() guard now
that the event log has NV-index records
2026-08-05 13:17:21 +09:00
Yu Watanabe 3273e223ad man: mention userdb.transient.* credentials in userdbctl(1)
These were only explained in systemd.system-credentials(7).
Let's also list them in userdbctl(1).

Follow-up for cc43510a13.
2026-08-05 11:38:46 +09:00
Yu Watanabe 7b2906af9f test: split out inline python script
Then, we can apply ruff to the script.
2026-08-05 11:37:29 +09:00
Yu Watanabe 7314e1cf76 options: use strv_join()
strv_join() is an alias of strv_join_full() with NULL for prefix and
false for escape_separator. Let's use the shorter form.
2026-08-04 19:17:56 +09:00
Yu Watanabe 2bb1f6a651 env-file: cleanups for write_env_file_label()
Explicitly call label_ops_post() where necessary with specific
arguments. Previously, regardless if fopen_tmpfile_linkable_at()
success, label_ops_post() was called but its argument was heavily
conditionalized. Let's call it both on failure and success cases
with specific arguments. This should be easy to read.

This also
- moves variable declarations where used,
- drops unnecessary boolean flag call_label_ops_post.

No functional change. Just reafactoring.

Hopefully silence CID#1664328, though it is false-positive.
2026-08-04 14:37:52 +09:00
Yu Watanabe f4cb4596a3 core/bpf: avoid redundant BPF program loading (#43234)
Replaces #43211 and #43213.
2026-08-04 08:10:00 +09:00
Yu Watanabe 0b9ac2e675 sysctl: add --verify option to verify sysctl values after write
This may be useful, e.g. when writing coredump pattern.
2026-08-03 14:25:49 +09:00
Yu Watanabe 23fbf7cf1d sysctl-util: introduce sysctl_write_verify()
This is useful when writing coredump pattern. But the logic itself is
quite generic. Let's add the helper in our basic library.
Preparation for later change.
2026-08-03 14:25:49 +09:00
Yu Watanabe 6ff355e88e sysctl: setup logging earlier
As parse_argv() may log something.
2026-08-03 14:25:49 +09:00
Yu Watanabe e4fb7ba188 man: systemd-sysctl --strict does not take any arguments
This also drops unused ids.
2026-08-03 14:25:49 +09:00
Yu Watanabe ac33190d1f include: update kernel headers from v7.2-rc5
It seems there is no notable changes to us.
2026-08-02 22:06:40 +09:00
Yu Watanabe 8bbbd71023 core/bpf-restrict-fsaccess: coding style fix 2026-08-01 03:23:40 +09:00
Yu WatanabeandEric Curtin 13d89ece2d core/bpf-restrict-fsaccess: merge bpf_restrict_fsaccess_supported() into bpf_restrict_fsaccess_setup()
Previously, bpf_restrict_fsaccess_prepare() is called twice in
bpf_restrict_fsaccess_setup(). One by through
bpf_restrict_fsaccess_supported() and one by itself directly.

In PID1, bpf_restrict_fsaccess_prepare() was only called by
bpf_restrict_fsaccess_setup(), hence it is not necessary to exist as a
separated function.

bpf_restrict_fsaccess_prepare() loads BPF program(s), hence it is
slightly slow operation.

Let's avoid redundant loading of BPF programs by merging
bpf_restrict_fsaccess_supported() into bpf_restrict_fsaccess_setup().

Co-authored-by: Eric Curtin <eric.curtin@docker.com>
2026-08-01 03:23:40 +09:00
Yu Watanabe 8292dfdca3 core/bpf-restrict-fs: use DEFINE_TRIVIAL_CLEANUP_FUNC_FULL_RENAME macro 2026-08-01 03:23:40 +09:00
Yu Watanabe dd7e148ed8 core/bpf-restrict-fs: merge three functions
This merges prepare_restrict_fs_bpf() and bpf_restrict_fs_supported()
into bpf_restrict_fs_setup().

Previously, bpf_restrict_fs_supported() was only called in
manager_new() and bpf_restrict_fs_cleanup(). However, it is not
necessary to call it in bpf_restrict_fs_cleanup(), as if the feature is
not supporetd, manager->restrict_fs is always NULL. In manager_new()
the function was always called with bpf_restrict_fs_setup(). Hence,
it is not necessary to keep bpf_restrict_fs_supported() and
bpf_restrict_fs_setup() as separated functions.

This also drops unnecessary '#if HAVE_LIBBPF' condition in
manager_new(), as bpf_restrict_fs_setup() is well defined also when
libbpf support is disabled.

Follow-up for c99678eeda.
2026-08-01 03:23:21 +09:00
Yu Watanabe dda5008019 tmpfiles: fix log message about BSD lock 2026-08-01 03:17:00 +09:00
Yu Watanabe 994289a030 test: stage volatile deb packages for upgrade test, and retry failed units (#43209) 2026-08-01 01:48:48 +09:00
Yu Watanabe d2685c303b tmpfiles: reject extra argument fields and make 'r'/'R' support age field (#43195)
This updates systemd-tmpfiles in two small areas:

- Reject non-empty argument fields for tmpfiles.d line types that do not
consume the argument field, instead of warning and silently ignoring
them.
- Let `r` and `R` tmpfiles.d entries honor the `Age` field when
`systemd-tmpfiles --clean` is used. The existing `--remove` behavior
remains unconditional.

The completed TODO entries are removed, and NEWS/man page documentation
is updated for the visible behavior changes.
2026-08-01 01:34:08 +09:00
Yu Watanabe 63e35ca3f9 selinux: relax error handling in permissive mode (#36929)
Error returned from security_compute_create_raw() means that kernel
couldn't compute target context. Very likely because file context is not
known to the policy, i.e. security.selinux xattr contains some garbage
value and we are running in permissive mode, otherwise returned context
would be "unlabeled_t" instead of getting an error.

mac_selinux_get_create_label_from_exe() is used to figure out create
label for socket units and we fail to start the socket if we can't
figure out that label.

However, it may be necessary to start some sockets in order to get to
the point when we launch the service that relabels (in permissive mode)
the entire filesystem and reboots.
2026-07-31 12:49:14 +09:00
Yu Watanabe 3abe380d04 core/service: append the original error cause in the debugging logs 2026-07-31 11:30:32 +09:00
Yu Watanabe 71a2af43f9 core: quote each exec directory entry when serializing
Quote each serialized exec directory entry, and use extract flags
compatible with config_parse_exec_directories() when deserializing.
This allows paths containing spaces and escaped characters to round-trip
correctly.

Fixes #41853.
Replaces #42686.
2026-07-31 10:46:50 +09:00
Yu Watanabe 08ca33fdde core: postpone dbus queue dispatch while API bus setup is pending (#43200)
Since 1166f4472d the API bus setup
and the subscriber coldplug happen only once the asynchronous GetId
reply is processed by the event loop. After a daemon-reexec,
manager_dispatch_dbus_queue() runs before subscribers were registered
and consumed send_reloading_done, so the one-shot Reloading(false)
signal was never sent.

Clients that wait for this signal to detect that a reexec finished time out.

Track the pending setup and hold the flag until the reply handler has
re-added the subscriptions.

Also affects v261.2 via backport 26f3717e27f6f08347adf851c605d5fe1f52ac57.
2026-07-29 20:38:21 +09:00
Yu Watanabe 4f32e0e853 sysupdate: Change feature/component enablement and disablement (#43191)
- sysupdate: In the auto-enable service, don't enable all features
    
    The auto-enable service should activate suggested components and
features but enabled all features which includes the default components
    unsuggested features and any unsuggested features of the suggested
components. This is unexpected behavior and we rather want this service
    to be limited to suggested features.
Switch the service flag to suggested and make the wording more explicit
    in the man page. Also fix the wrong statement that it operates on
    enabled components, it operates on all components, also explicitly
    disabled ones.

- sysupdate: Change disabling with
--component-suggested/--feature-suggested
    
    The disabling of features or components with the flag
--component-suggested/--feature-suggested didn't disable the suggested
ones but instead disabled all other ones. This is rather unintuitive due
    to how the flags are named and also not really needed because the
intended reconciliation outcome can instead be done by first disabling
everything and then enabling the suggested ones again which is easier to
    reason about. For components the tricky part is that they default to
enabled and thus it's better to have the disable/enable commands with
--component-suggested operate only on suggested ones instead of touching
others like "legacy" components that don't explicity say whether they
    are enabled and suggested or not.
    
    Make running disablement of components/features with
    --component-suggested/--feature-suggested undo a previous enablement
with the same flags. Document how one can align the system to only use
suggested components/features and not anything else by doing it in two
steps, first disabling everything and then enabling suggested ones. This
also makes it clearer now that all components that are not explicitly
    enabled nor suggested will be disabled then.
2026-07-28 21:24:45 +09:00
Yu Watanabe f2718dee52 locale: update Context only on success
Do not clear Context.vc, Context.x11_from_vc, and Context.x11_from_xorg
on errors like ENOMEM or so.

This does not change behavior on success.
2026-07-28 20:19:30 +09:00
Yu Watanabe 686ee16166 ci/mkosi: bump fedora release version to 44 2026-07-26 20:46:16 +09:00
Yu Watanabe 1acd30aa1f mkosi/sanitizers: also wrap mkfs.erofs
Fixes the following failure on Fedora 44:
```
TEST-58-REPART.sh[932]: Executing mkfs command: /usr/bin/mkfs.erofs -U 45745a56-aa2f-4619-8ca7-9cb63667c2ae -zlz4hc,level=3 /dev/loop0 /var/tmp/.#reparteb739e8b8cae7b70
TEST-58-REPART.sh[932]: Successfully forked off '(mkfs)' as PID 933.
TEST-58-REPART.sh[933]: ==933==ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD.
TEST-58-REPART.sh[932]: '(mkfs)' failed with exit status 1.
```
2026-07-26 20:46:12 +09:00
Yu Watanabe facb0c20af mkosi: drop references to EOL fedora releases 2026-07-26 20:45:43 +09:00
Yu Watanabe ba3b1eff0b github: update placeholders in template 2026-07-26 20:42:28 +09:00
Yu Watanabe a1e42f3438 sysupdate: fix root cleanup and default feature selection (#43154) 2026-07-26 20:28:33 +09:00
Yu Watanabe a8e93919c3 Minor follow-ups for recent PRs (#43148) 2026-07-25 21:08:37 +09:00
Yu Watanabe b556e151b9 po: update Japanese translation
The commit 843bba839a dropped space after
colon, but Weblate dislikes that. Let's readd space.
2026-07-25 20:41:47 +09:00
Yu Watanabe d20313d086 homed/fscrypt: default new homes to v2 policies (#18280) (#42397)
## Summary

Closes #18280.

`systemd-homed` currently writes fscrypt v1 policies, which bind the
master key to the calling process's keyring. This means files in a
homed-managed directory aren't readable when accessed through a
container bind mount, a different mount namespace, or by any process
other than the one that first unlocked the home. Reading the file from a
context that has the key first warms the page cache, but the underlying
problem remains.

v2 policies (Linux 5.4+) route the master key through the filesystem
keyring, via `FS_IOC_ADD_ENCRYPTION_KEY` /
`FS_IOC_REMOVE_ENCRYPTION_KEY`, so the key is visible to every process
accessing the filesystem.

This PR switches `systemd-homed` to v2 by default and keeps existing v1
homes working.

## Changes

**`shared/crypto-util`**: Add `kdf_hkdf_derive` (HKDF, RFC 5869) wrapper
around OpenSSL's `EVP_KDF` "HKDF", alongside the existing SSKDF/KBKDF
helpers.

**`homed/fscrypt`**:
- Read the existing policy via `FS_IOC_GET_ENCRYPTION_POLICY_EX`,
falling back to the legacy ioctl on pre-5.4 kernels.
- `HomeSetup` now carries a full `struct fscrypt_key_specifier` instead
of a bare 8-byte descriptor. Slot decryption derives either the v1
descriptor (double SHA-512) or the v2 identifier (HKDF-SHA512 with the
kernel's info string) from the unwrapped volume key and compares against
the policy.
- Install the master key the right way per version: `add_key("logon",
...)` to thread+user keyrings for v1, `FS_IOC_ADD_ENCRYPTION_KEY` for
v2.
- `home_flush_keyring_fscrypt` opens the image directory, reads the
policy version, and either calls `FS_IOC_REMOVE_ENCRYPTION_KEY` (v2) or
walks the user keyring (v1).
- New homes default to v2; fall back to v1 only when the kernel rejects
v2.

The on-disk slot xattr format is unchanged - the volume key is the same,
only how it binds to the directory changes. There is no v1 -> v2
migration; existing v1 homes continue to unlock, rekey, and deactivate
as before.
2026-07-25 19:36:35 +09:00
Yu Watanabe 7cc277fb97 cryptsetup: avoid state leaks from ignored options (#43135) 2026-07-24 21:35:34 +09:00
Yu Watanabe e6cc9d0298 tmpfiles: fix root handling and target resolution (#43031) 2026-07-24 21:15:11 +09:00
Yu Watanabe bbd8386999 Allow arbitrary standalone progs to be installed and really stop building all standalone for tests (#43130) 2026-07-24 14:22:07 +09:00
Yu Watanabe b8b7c04672 network: make VLAN= and friends take multiple names
Previously, specifying multiple stacked netdevs of the same type required
repeating the corresponding setting, e.g.:
```
[Network]
VLAN=vlan_10
VLAN=vlan_20
VLAN=vlan_30
```

With this change, the same configuration can be written as:
```
[Network]
VLAN=vlan_10 vlan_20 vlan_30
```

Specifying an empty string now also clears all previously assigned stacked
netdevs.

Closes #43103.
2026-07-24 13:44:04 +09:00
Yu Watanabe c023311fe4 network: invalidate cached driver when an interface is renamed
During early boot, interfaces may be renamed frequently, which can lead to
caching the driver name of a different interface. Invalidate the cached
driver whenever an interface rename is detected so it can be re-read using
the new name.

Follow-up for #42545.
Fixes #43099.
2026-07-23 19:23:47 +09:00
Yu Watanabe b27e324272 fixups for systemd-osc-context (#43091)
I noticed that the use of sed in the `80-systemd-osc-context.sh` was
unnecessary, and upon writing a replacement in pure bash and testing it,
actually buggy. While in there, I also spotted some other minor things
that might be worth doing.

Getting rid of fork+exec for doing sed is probably the biggest win, but
there are still quite a few subshell invocations (that only do fork, not
exec). I haven't measured the overhead of those, but it seems that we
could get rid of those as well if we want.

Another thing I wonder about is whether we should emit an end= marker on
shell exit. There's no guaranteed way of doing it. Just as everything
else, we could get killed before getting a chance to do it. But also,
unlike PROMPT_COMMANDS, there's no "at_exit" array to hook into. Still,
we could ask if there is a 'trap exit' hook installed, and if not,
install one ourselves; if the user's bashrc subsequently overrides that,
so be it (though .bash_logout would be more appropriate).
2026-07-23 16:01:41 +09:00
Yu Watanabe 5c0d4b5061 utf8: split out unichar_console_width() from utf8_char_console_width()
It will be used later.
2026-07-23 14:40:37 +09:00
Yu Watanabe cc594a83f4 home: insert a space before '=' 2026-07-21 23:38:40 +09:00
Yu Watanabe ab373b2cec Assorted cleanups for #42978 (#43051)
https://github.com/systemd/systemd/pull/42978
2026-07-21 14:03:49 +09:00
Yu Watanabe bda98358d2 tools: reject invalid inputs and align machine-readable output (#43040) 2026-07-21 12:23:00 +09:00
Yu Watanabe 8eede7122f sd-device: allow non-safe characters in uevent files
This partially reverts 13ce62caba.

Sometimes, the kernel passes non-safe characters in uevent files,
such as the UNIQ= property for USB serial devices.

Instead of rejecting the entire uevent file, let's only ignore the
specific key-value pairs that contain non-safe characters.

Fixes #43008.
2026-07-21 12:19:32 +09:00
Yu Watanabe 97653d10ff hwdb: strip the root from filenames when generating hwdb.bin (#43062)
The modern hwdb.bin format contains the filenames of the input data that
makes up the database. This is useful but in offline builds where --root
is used, the filenames are the full build paths including the specified
root. This introduces build paths and thus information leakage and
non-reproducible data.

Solve this by stripping the root prefix off the original path when
passing to import_file.
2026-07-21 12:19:00 +09:00
Yu Watanabe 843bba839a po: update Japanese translation 2026-07-20 12:40:02 +01:00
Yu Watanabe e11f211326 man/network: fix default value for RequiredFamilyForOnline=
It was unexpectedly changed by c89efaf9e5.

Fixes #43074.
2026-07-20 12:39:18 +01:00
Yu Watanabe 38116b79ba sysinstall: fix typo
Follow-up for c17d0c7e85.
2026-07-20 16:23:04 +09:00
Yu Watanabe 38f9b660c3 tpm2-util: fix typo
Follow-up for 2348941b5d.
2026-07-20 16:23:04 +09:00
Yu Watanabe 9bbd947083 tpm2-util: fix typo
Follow-ups for 5a80137aa4.
2026-07-20 16:23:04 +09:00
Yu Watanabe 50f58d0e15 network: fix typo
Follow-up for d094067547.
2026-07-20 16:23:04 +09:00
Yu Watanabe 3fb89fc69e string-util: fix typo
Follow-up for 093cac3fe8.
2026-07-20 16:23:04 +09:00
Yu Watanabe 3fcd5cec3b report: fix typo
Follow-up for 3c2f7c6002.
2026-07-20 16:23:04 +09:00
Yu Watanabe 4476d35081 sysupdate: fix typo
Follow-up for d82e256bb9.
2026-07-20 16:22:40 +09:00
Yu Watanabe e10e1c4c5e TODO: fix typo
Follow-ups for f61e1e5cf4 and
3d0309ac0f.
2026-07-20 15:03:37 +09:00
Yu Watanabe 8e54afe8da mkosi/opensuse: do not try to package non-existent symlink to systemd-udevd-control.socket 2026-07-18 05:29:59 +09:00
Yu Watanabe 20ef89f646 NEWS: mention the removeal of legacy udev control socket 2026-07-18 05:29:59 +09:00
Yu Watanabe 17e911ffc8 udev: drop home-grown udev-ctrl socket
Nowadays, varlink is used to control systemd-udevd. Let's drop the
legacy socket.

Note, the existence of /run/udev/control socket is widely used in both
our code and external projects. Also, the dependency to
systemd-udevd-control.socket is widely used in many projects.
Hence, we need to create a symlink to the socket file and .socket unit
file.
2026-07-18 05:29:59 +09:00
Yu Watanabe 14f934df35 nspawn: do not try to connect udevd
nspawn itself does not require to control udevd process.

Only necessary points are
- udevd is available, and
- we are in the main network namespace.

Let's check them explicitly.

This also makes the check is skipped when we are talking to mountfsd, as
the check is pointless in that case.
2026-07-18 05:29:59 +09:00
Yu Watanabe 7f1ca24bb9 sd-device: use network_namespace_is_init() 2026-07-18 05:29:59 +09:00
Yu Watanabe dfe19f1350 namespace-util: introduce network_namespace_is_init() 2026-07-18 05:29:59 +09:00
Yu Watanabe 796580518e dlopen-note: downgrade all dlopen notes in libsystemd.so and libsystemd-shared.so
Since all executables now manage their required dlopen notes directly
within their own source code with explicit priority levels, it is no
longer necessary to declare high-priority dlopen notes in the shared
libraries themselves.
2026-07-18 04:57:00 +09:00
Yu Watanabe 661ab8b6fd tree-wide: drop DLOPEN_FOO() macros
Since 4c0d8d9673, most dlopen notes are
set at the beginning of the executables. Let's manage all dlopen notes
there, rather than setting them where dlopen is called.

Note that the only exceptions are the LIBBPF_NOTE for networkd and
nsresource. Since dlopen_bpf() is wrapped in an `#if` guard, the notes
are instead set within the corresponding functionality.

As a result, the DLOPEN_FOO() wrapper macros are no longer needed and
can be dropped completely.
2026-07-18 04:56:32 +09:00
Yu Watanabe 95648d612a udev-util: bound leading whitespace skip in udev_replace_whitespace (#42757)
udev_replace_whitespace() is documented to read at most 'len' bytes from
'str':
- the strspn() skip of leading whitespace stops at a non-space byte or
NUL, not at 'len'
- ata_id passes the space padded, non-NUL-terminated ATA IDENTIFY
model/serial/fw fields
- an all-blank field reads off the end of the 512-byte hd_driveid stack
struct
Capped the skip to 'len'; existing outputs are unchanged. Added a
regression test.
2026-07-17 01:16:07 +09:00
Yu Watanabe 4d4e9be0ea Assorted remote/shared/resolved hardening fixes flagged by kres (#42978) 2026-07-17 01:12:32 +09:00
Yu Watanabe ac007dd0f1 Cleanup argument and return values for copy_bytes_full helpers (#43034)
Follow-up for #43004.
2026-07-16 01:32:04 +09:00
Yu Watanabe 5d6f9cc669 dlopen-note: drop unnecessary header
It unexpectedly snuck in there.

Follow-up for a74b3e1778.
2026-07-15 08:38:56 +09:00
Yu Watanabe 01e1303f9c Rename basic-forward.h, sd-forward.h, and shared-forward.h to forward.h
Follow-up for 74d392ed1b.
2026-07-15 02:18:05 +09:00
Yu Watanabe 944e1d3d81 meson: speed up building standalone binaries
Previously, files listed in 'sources' were built twice:
once when building the main binary, and again when building the
statically linked one.

This change ensures that all object files from the main binary are
reused when building the static binary. Hence, the only step now
necessary for the static binary is linking the object files.

Follow-up for 39d00e1d20.
2026-07-14 13:51:03 +02:00
Yu Watanabe 900c10467a man: drop '\r' from systemd-clonesetup.xml
Follow-up for 104970a8bd.
2026-07-10 14:22:17 +01:00
Yu Watanabe 71bc8f4fe5 udev: fix several reproducible command handling issues (#42958)
This PR fixes several independent udev command and rule handling issues.
Each commit contains the corresponding reproducer and fix details.
2026-07-10 20:04:51 +09:00
Yu Watanabe 5403bd48fc Optimize dlopen ELF notes via anchoring and explicitly embed them into executables (#42908)
This PR optimizes the handling of `dlopen` ELF notes and reduces binary
footprints across the tree.

By enabling compiler section-splitting
(`-ffunction-sections`/`-fdata-sections`), the linker can now accurately
garbage-collect unused code and data. To align with this,
`SD_ELF_NOTE_DLOPEN_ANCHORED()` macro is introduced, which ties `dlopen`
notes to their calling functions so that unused notes are automatically
removed by `--gc-sections`.

Additionally, this explicitly embeds required `dlopen` notes into
individual executables to fix a visibility issue where package managers
missed runtime dependencies invoked indirectly through
`libsystemd-shared.so`.
2026-07-10 17:37:39 +09:00
Yu Watanabe 337f1a3195 condition: split condition_test_list() to minimize dlopen dependencies
Even though systemd-networkd and systemd-udevd do not support
ConditionSecurity= in .network, .netdev, and .link files, the unified
condition_test() function maintained a function pointer table that
unconditionally referenced condition_test_security(). Consequently,
linker garbage collection (--gc-sections) could not drop the security
test code, inadvertently pulling in dlopen dependencies and ELF notes
for apparmor, audit, and tpm2 libraries into these binaries.

To resolve this, introduce condition_test_net() and condition_test_list_net(),
which utilize a trimmed-down function pointer table that excludes
security-related condition evaluators.

By migrating networkd and udevd to these new network-specific variants,
the reference to condition_test_security() is completely severed in
their dependency chains. This allows the compiler and linker to
successfully garbage-collect the unused security logic and safely drops
the unnecessary dlopen notes from those binaries.
2026-07-10 16:35:19 +09:00
Yu Watanabe 05bdf4bfa9 compress: split compress_blob() and friends to minimize dlopen dependencies
Previously, even though sd-journal does not support bzip2 and gzip
compression, the dlopen ELF notes for those libraries were still being
attached to libsystemd.so and various journal-handling executables.
This occurred because the unified compression/decompression interfaces
handled all formats unconditionally, causing the compiler and linker to
pull in all associated dlopen notes across the board.

To resolve this, split these functions into generic and journal-specific
variants (e.g., introducing compress_blob_journal() and decompress_blob_journal()).
The journal-specific variants only handle formats actually supported by
the journal (LZ4, XZ, and ZSTD).

By updating sd-journal, journald, journalctl, and related utilities to
use these new `_journal` interfaces and switching them to the narrower
COMPRESS_JOURNAL_NOTE macro, we ensure that unnecessary dlopen notes
(for bzip2 and gzip) are no longer embedded into these binaries.
2026-07-10 16:35:19 +09:00
Yu Watanabe 1a08378534 ci/unit-tests: enable dlopen note verification tests
Enable the `dlopen` unit test suite in GitHub Actions, except for the
following configurations where linker garbage collection (`--gc-sections`)
or dead-code elimination fails to drop unused dlopen symbols:

- ppc64le (both GCC and Clang)
- s390x (GCC only)
- Sanitizer-enabled setups
2026-07-10 16:35:19 +09:00
Yu Watanabe 5b05fbe53e test: add dlopen note checker
This introduces a test utility to validate the presence and correctness
of dlopen ELF notes.

The test extracts and compares dlopen ELF notes between the dynamic and
static versions of target binaries to catch missing entries. Furthermore,
it scans the code for dlopen_foo() invocations to ensure that no stale or
unused notes remain in the final binary, thereby verifying the linker's
garbage-collection integration.
2026-07-10 16:35:19 +09:00
Yu Watanabe 01e02cb94f sd-dlopen: introduce _dlopen_loader_ macro to prevent inlining and cloning
When compiler optimization or LTO (Link Time Optimization) is enabled,
dlopen helper functions (such as dlopen_libfoo()) can be aggressively
inlined into their callers or cloned for specific call sites.

While this is beneficial for production builds, it alters or completely
removes the original function symbols from the final executable.
Consequently, this breaks the test (to be added in this series) that
checks whether the dlopen_libfoo() function corresponding to a dlopen
ELF note is actually called.

To resolve this, introduce the `_dlopen_loader_` macro. Under developer
builds, it applies the `_noclone_` and `_noinline_` attributes to guarantee
that helper symbols remain intact and discoverable by the test suite. In
production builds, the macro evaluates to nothing, allowing full compiler
optimization to proceed unimpeded.
2026-07-10 16:35:19 +09:00