]> git.ipfire.org Git - thirdparty/systemd.git/log
thirdparty/systemd.git
3 days agoproperties: Skip value building for nominal case 43146/head
Chris Down [Fri, 24 Jul 2026 23:18:27 +0000 (16:18 -0700)] 
properties: Skip value building for nominal case

bus_message_print_all_properties() builds a PROP= string for every
property in the reply so that -p PROP=value filters can be matched
against it, but most queries never need this.

Take the normal `systemctl show` or `systemctl show UNIT` case. In that
case there is no filter. Even with `-p PROP` there is no value filter
since there is no value.

Avoid constructing the string entirely by comparing property names
directly against filter entries.

In my tests with a `systemctl show` over 160 units this brings the
instructions retired from 992.6M down to 960.5M, a reduction of 3.2%.

The same goes for property filters with units. When running:

    systemctl show -p UnitFileState -p ActiveState UNIT

...the instructions retired drops from 9.52M to 9.22M, a reduction of
3.2%. The output in each case is unchanged.

3 days agoproperties: Skip found set building for nominal case
Chris Down [Fri, 24 Jul 2026 23:08:16 +0000 (16:08 -0700)] 
properties: Skip found set building for nominal case

bus_message_print_all_properties() inserts every name it walks into the
found-properties set, but the set is only used to report missing requested
properties at debug level.

Request the set from systemctl only when properties were specified and debug
logging is enabled, avoiding the unnecessary work in normal operation.

In my tests with `systemctl show` over 160 units this brings the
instructions retired from 1167.8M down to 992.6M, a reduction of 15.0%.
The output is unchanged.

11 days agoman: fix typo
Hilal Rahmatullah [Fri, 24 Jul 2026 16:55:33 +0000 (23:55 +0700)] 
man: fix typo

11 days agocryptsetup: avoid state leaks from ignored options (#43135)
Yu Watanabe [Fri, 24 Jul 2026 12:35:34 +0000 (21:35 +0900)] 
cryptsetup: avoid state leaks from ignored options (#43135)

11 days agotmpfiles: fix root handling and target resolution (#43031)
Yu Watanabe [Fri, 24 Jul 2026 12:15:11 +0000 (21:15 +0900)] 
tmpfiles: fix root handling and target resolution (#43031)

11 days agocryptsetup: ignore invalid password-cache= fully 43135/head
dongshengyuan [Fri, 24 Jul 2026 08:38:19 +0000 (16:38 +0800)] 
cryptsetup: ignore invalid password-cache= fully

password-cache= tracks both the cache mode and whether the option was
configured explicitly. The parser set arg_password_cache_set before
validating the value, so an invalid value was logged as ignored but
still blocked the PKCS#11 default no-cache policy.

Only mark password-cache= as configured after accepting read-only or a
valid boolean.

Repro:
build/systemd-cryptsetup attach sdscan /dev/null - \
    pkcs11-uri=auto,password-cache=bogus

Before: warned ignored, then failed with the PKCS#11 cache error.
After: warned ignored, then continued to the device check.

Follow-up for: fd8ed7f26b5e365c27599bb6b223caaaa20dd2ca

11 days agocryptsetup: don't keep invalid size= values
dongshengyuan [Fri, 24 Jul 2026 08:38:19 +0000 (16:38 +0800)] 
cryptsetup: don't keep invalid size= values

size= is specified in bits, but arg_key_size stores bytes after
parsing. The parser used arg_key_size as temporary storage before
validation. When the value was not divisible by 8, the warning said
the option was ignored, but the invalid bit count remained.

Parse into a local variable and update arg_key_size only after
validation.

Repro:
build/systemd-cryptsetup attach sdscan /tmp/plain.img /tmp/key \
    plain,size=7

Before: warned ignored, then used key size 56 bits.
After: warned ignored, then kept the default key size 256 bits.

Follow-up for: 6131a78b4d247618715e042e14ad682f678d3b32

11 days agotmpfiles: inherit age-by for X entries 43031/head
dongshengyuan [Wed, 15 Jul 2026 05:35:57 +0000 (13:35 +0800)] 
tmpfiles: inherit age-by for X entries

X entries inherit the cleanup age from the closest parent directory rule.
Inherit the age-by fields too, so parent rules such as m:1d keep their
full cleanup policy.

Reproducer:
  mkdir -p /tmp/tmpfiles-ageby/parent/{child,other}
  printf old >/tmp/tmpfiles-ageby/parent/child/file
  printf old >/tmp/tmpfiles-ageby/parent/other/file
  touch -d '3 days ago' /tmp/tmpfiles-ageby/parent/{child,other}/file
  systemd-tmpfiles --clean - <<'EOT'
  d /tmp/tmpfiles-ageby/parent - - - m:1d
  X /tmp/tmpfiles-ageby/parent/child - - - -
  EOT

Before:
  child/file remained because X used the default age-by set.
  other/file was removed by the parent m: rule.

Follow-up for 7f7a50dd157b3bfb4282c3cc3a56671121eabe24.

11 days agoAllow arbitrary standalone progs to be installed and really stop building all standal...
Yu Watanabe [Fri, 24 Jul 2026 05:22:07 +0000 (14:22 +0900)] 
Allow arbitrary standalone progs to be installed and really stop building all standalone for tests (#43130)

11 days agoRevert "test: re-enable sync in TEST-25-IMPORT"
Frantisek Sumsal [Wed, 22 Jul 2026 13:27:56 +0000 (15:27 +0200)] 
Revert "test: re-enable sync in TEST-25-IMPORT"

This shouldn't be necessary anymore, as we don't block openat2() when
running nspawn with --suppress-sync=yes.

This reverts commit c955e24916f8d6bce09589979dc62833ccd88853.

11 days agoseccomp-util: allow openat2() with --suppress-sync=yes
Frantisek Sumsal [Wed, 22 Jul 2026 12:34:05 +0000 (14:34 +0200)] 
seccomp-util: allow openat2() with --suppress-sync=yes

When --suppress-sync=yes was introduced in
4a4654e0241fbeabecb8587fd3520b6b39264b9c it filtered out openat2()
completely, as we can't check its "flags" argument because it's hidden
in an indirect struct. This was perfectly fine at that time, as
openat2() was quite new and software shipped with a fallback to
open()/openat() if the syscall wasn't present.

However, today the situation is different and an increasing number of
software is moving to openat2() without any fallback - tar [0] being the
most common one in the recent reports and workarounds, and attr recently
fixed a CVE by switching to openat2() [1] as well, to name a few.

Given that we already block all the sync-family syscalls and calling
openat2() with O_SYNC is relatively rare, let's just blanket-enable it
in the --suppress-sync=yes mode. This means that we might issue a
synchronous write when something calls openat2() with O_SYNC, but not
breaking the apps here feels like a reasonable trade-off, at least until
a better solution pops up.

Note that the same situation is in seccomp_restrict_sxid(), but allowing
the openat2() syscall there could actually have some security-related
implications under certain circumstances.

Resolves: #41868

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

11 days agomachine-id-setup: follow symlink target on --commit
dongshengyuan [Wed, 22 Jul 2026 11:55:32 +0000 (19:55 +0800)] 
machine-id-setup: follow symlink target on --commit

Resolve /etc/machine-id before checking the mount state and before
writing back, so symlinked targets are committed correctly.

Fixes: #43104
Follow-up for: efabf4e04466c85183c969af27de1ff0ecda8e79

11 days agocore: tolerate kernels without POSIX mqueue support
gkehren [Thu, 23 Jul 2026 14:40:25 +0000 (16:40 +0200)] 
core: tolerate kernels without POSIX mqueue support

PrivateIPC= sets up a private mqueue mount for the service. When
CONFIG_POSIX_MQUEUE is disabled, mounting mqueue fails with ENODEV and
prevents the service from starting.

Treat ENODEV as an unavailable optional kernel feature while preserving
the private IPC namespace. Keep all other mount errors fatal.

Add coverage verifying that PrivateIPC= still creates a separate IPC
namespace when POSIX message queues are unavailable.

Fixes #42582

11 days agotest-ndisc-send: correct add_link_layer_address argument order
Ronan Pigott [Thu, 23 Jul 2026 23:06:57 +0000 (16:06 -0700)] 
test-ndisc-send: correct add_link_layer_address argument order

Found by inspection while working on networkd.

11 days agonetwork: make VLAN= and friends take multiple names
Yu Watanabe [Thu, 23 Jul 2026 18:27:22 +0000 (03:27 +0900)] 
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.

11 days agomeson: stop registering .standalone in executables_by_name 43130/head
Zbigniew Jędrzejewski-Szmek [Thu, 23 Jul 2026 21:19:16 +0000 (23:19 +0200)] 
meson: stop registering .standalone in executables_by_name

af4c5730e524c972994232259e5051b951142485 tried to have meson stop
building all possible .standalone binaries in for tests. But it turns out
that those binaries are still built for meson-test-prereq, because they
are listed in executables_by_name, and we interate over
executables_by_name and add all exes found there as dependencies for two
tests: test-link-abi and libshared-unused-symbols. So we'd end up still
building all the .standalone binaries. To really fix this, define the
executables() for .standalone targets, but don't add them to this array.

A secondary change is to set build_by_default to true for .standalone
binaries if have_dlopen_tests is set. This means that we'll build more
binaries in the "build" phase, instead of only building them "on demand"
for tests. I think it is nicer to build everything that'll be used in one
step, and then only run the tests in the test target. For example, tests
may be run under root or in some special environment, and building thins
there is iffy.

The overall effect of this change should be that we stop building or
testing .standalone variants for binaries that we'll not later install,
unless -Ddlopen-tests=true is specified.

Also exclude .standalone binaries from check-help test. The test fails
for some binaries when the width is exceeded because of the ".standalone"
suffix in the name. The actual binary would be called without the
suffix, so the test is not testing a realistic scenario.

11 days agomeson: rework -Dstandalone-binaries= option
Zbigniew Jędrzejewski-Szmek [Thu, 23 Jul 2026 20:00:28 +0000 (22:00 +0200)] 
meson: rework -Dstandalone-binaries= option

The option is generalized from a simple boolean switch that enables
a fixed list to a list-of-patterns.
The old value works, but is deprecated: -Dstandalone-binaries=true is translated
to -Dstandalone-binaries=repart,report,tmpfiles,sysusers,shutdown.

We could already build all normal executables as .standalone, but the
installation only supported a small fixes subset. This wasn't flexible
enough:
- packagers might want to provide additional standalone binaries then the
  small subset that was already enabled
- but at the same time, whenever new binaries were added to this subset,
  downstream packaging had to be adjusted in sync, at least in the case of
  Fedora, because otherwise we'd get a complaint about unexpected .standalone
  binaries in the temporary install root.
With the new option, downstreams can just specify the binaries that they
want to be installed in the .standalone variant.

As usual with this type of change, the build dir must be reprovisioned.

12 days agouser-record: validate JSON shell fields with valid_shell() 41780/head
logical-misha [Fri, 17 Jul 2026 23:17:02 +0000 (23:17 +0000)] 
user-record: validate JSON shell fields with valid_shell()

The user record loader currently uses a generic filename-or-path check
for shell and fallbackShell. This allows values that homectl rejects,
including relative names, control characters, colons, and trailing
slashes.

Use valid_shell() for all three record locations and cover the top-level,
matching per-machine, and status fallback fields at the loader boundary.

Fixes #43066

12 days agotimer: clamp future calendar base after clock jumps back
Ananth [Wed, 22 Jul 2026 17:49:34 +0000 (17:49 +0000)] 
timer: clamp future calendar base after clock jumps back

A calendar timer that is already waiting keeps the base timestamp it was
last armed from. When the wall clock is set backwards, that base can end
up in the future relative to the new realtime, and passing it to
calendar_spec_next_usec() schedules the next elapse relative to the old
future time instead of recalculating from now. systemctl list-timers
then keeps showing the stale pre-adjustment elapse (e.g. "3 years left"
after the clock moved back two years) and the timer never catches up.

Clamp the selected calendar base to the current realtime before asking
calendar_spec_next_usec() for the next occurrence. The clamp only kicks
in when the base is genuinely in the future, so Persistent=yes timers
whose last trigger is still in the past keep their catch-up behaviour and
we don't reintroduce the missed-run regression seen after suspend.

Fixes #6036.

12 days agomeson: disable dlopen tests by default, enable in gcc github workflow
Zbigniew Jędrzejewski-Szmek [Thu, 16 Jul 2026 15:39:26 +0000 (17:39 +0200)] 
meson: disable dlopen tests by default, enable in gcc github workflow

1f76654f942893155bd42b0373b8130d2a9e1dcf added support to build .standalone
variants of most binaries. test-dlopen-note.py is hooked in the test suite for
everything that can do .standalone, but this means that the .standalone
variants become a prerequisite for tests. This means that meson will build the
.standalone variants for all binaries before running tests, which takes quite a
bit of time in some situations. (Arguably, the dlopen test suite was excluded
by default, so maybe meson could be smart and figure out that those tests are
not enabled by default. But it doesn't seem to make this distinction.)

12 days agohwdb: add numlock mapping for PATEN/Labtec USB Numpad
Alexandre Saou [Thu, 23 Jul 2026 12:40:48 +0000 (14:40 +0200)] 
hwdb: add numlock mapping for PATEN/Labtec USB Numpad

12 days agotmpfiles: do not follow copy source symlinks
dongshengyuan [Wed, 15 Jul 2026 05:29:55 +0000 (13:29 +0800)] 
tmpfiles: do not follow copy source symlinks

C lines copy symlinks as symlinks. The post-copy type check should
inspect the source symlink itself, not follow its target.

Reproducer:
  src=/tmp/tmpfiles-src-link.$$
  dst=/tmp/tmpfiles-dst-link.$$
  conf=/tmp/tmpfiles-conf.$$
  ln -s missing-target "$src"
  printf 'C %s - - - - %s\n' "$dst" "$src" >"$conf"
  systemd-tmpfiles --create "$conf"

Before:
  Failed to stat($src): No such file or directory
  status=73
  $dst -> missing-target already existed

Follow-up for 8f6fb95cd069884f4ce0a24eb20efc821ae3bc5e.

12 days agonetwork: invalidate cached driver when an interface is renamed
Yu Watanabe [Thu, 23 Jul 2026 06:14:58 +0000 (15:14 +0900)] 
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.

12 days agoask-password: reject oversized Plymouth prompts (#43102)
Armaan Sandhu [Thu, 23 Jul 2026 10:18:13 +0000 (15:48 +0530)] 
ask-password: reject oversized Plymouth prompts (#43102)

Plymouth encodes the password prompt length in a single byte.
Reject prompts whose length cannot be represented instead of
wrapping the encoded length while sending the complete message.

12 days agostrv: refuse invalid UTF-8 in strv_rebreak_lines()
Armaan Sandhu [Thu, 23 Jul 2026 07:31:03 +0000 (13:01 +0530)] 
strv: refuse invalid UTF-8 in strv_rebreak_lines()

The scan pointer was advanced with utf8_next_char(), which blindly skips
utf8_skip_data[lead byte] bytes, so a line ending in a truncated multibyte
sequence like "foo\xF0" stepped over the NUL and the loop read past the end
of the string. Decode each character with utf8_encoded_to_unichar() and
propagate the error instead of measuring broken characters.

Fixes #43052.

12 days agoemacs: Fix warning when opening shell scripts
Sven Joachim [Thu, 23 Jul 2026 08:53:17 +0000 (10:53 +0200)] 
emacs: Fix warning when opening shell scripts

Opening a shell script, Emacs notified me in the echo area:

sh-indentation is obsolete (since 26.1); use ‘sh-basic-offset’ instead

Commit 0c40aef7ef14 ("emacs: drop obsolete emacs property") got it backwards,
keeping sh-indentation rather than sh-basic-offset.  The latter is an obsolete
alias for the former.

12 days agotmpfiles: restore timestamps after removing directories
dongshengyuan [Wed, 15 Jul 2026 05:28:57 +0000 (13:28 +0800)] 
tmpfiles: restore timestamps after removing directories

dir_cleanup() restored parent timestamps after removing files, but not
after removing child directories. Mark directory removals as changes too.

Reproducer:
  rm -rf /tmp/tf-mtime-dir
  mkdir -p /tmp/tf-mtime-dir/old-child
  touch -d '2020-01-01 00:00:00' \
        /tmp/tf-mtime-dir/old-child /tmp/tf-mtime-dir
  before=$(stat -c %Y /tmp/tf-mtime-dir)
  systemd-tmpfiles --clean - <<'EOT'
  d /tmp/tf-mtime-dir - - - M:1s
  EOT

Before:
  equal=no
  gone=yes

Follow-up for 3b63d2d31d0850bd7a81ab9b468218d2c4c461e8.

12 days agotmpfiles: propagate copy errors after opening target
dongshengyuan [Wed, 15 Jul 2026 05:25:55 +0000 (13:25 +0800)] 
tmpfiles: propagate copy errors after opening target

Opening the destination only proves that it exists. If copy_tree_at()
failed for any reason other than an existing destination, report that
copy error.

Reproducer:
  name=tmpfiles-copy-bug.$$
  src=/tmp/$name.src; dst=/tmp/$name.dst; conf=/tmp/$name.conf
  mkdir "$src" "$dst"
  printf payload >"$src/file"
  chmod 500 "$dst"
  printf 'C %s - - - - %s\n' "$dst" "$src" >"$conf"
  systemd-tmpfiles --create "$conf"

Before:
  exit=0
  copied=no

Follow-up for 8f6fb95cd069884f4ce0a24eb20efc821ae3bc5e.

12 days agotmpfiles: check relative L? targets beside the link
dongshengyuan [Wed, 15 Jul 2026 05:23:23 +0000 (13:23 +0800)] 
tmpfiles: check relative L? targets beside the link

Relative symlink targets are resolved from the directory containing the
link. Make the L? existence check use the same rule.

Reproducer:
  tmp=$(mktemp -d /tmp/tmpfiles-link.XXXXXX)
  conf=$(mktemp /tmp/tmpfiles-conf.XXXXXX)
  printf data >"$tmp/target"
  printf 'L? %s/link - - - - target\n' "$tmp" >"$conf"
  systemd-tmpfiles --create --dry-run "$conf"

Before:
  The target was checked root-relative, not beside the link.

Follow-up for b5dc805583bbb019c6bf4c73bf0814a396dc0f12.

12 days agofixups for systemd-osc-context (#43091)
Yu Watanabe [Thu, 23 Jul 2026 07:01:41 +0000 (16:01 +0900)] 
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).

12 days agotmpfiles: keep directory specifiers rootless
dongshengyuan [Wed, 15 Jul 2026 05:22:04 +0000 (13:22 +0800)] 
tmpfiles: keep directory specifiers rootless

%t and the other directory specifiers are parsed as normal paths.
They are prefixed by --root= later, so the specifier itself must stay
rootless.

Reproducer:
  tmp=$(mktemp -d /tmp/tmpfiles-root.XXXXXX)
  conf=$(mktemp /tmp/tmpfiles-conf.XXXXXX)
  printf 'd %%t/tmpfiles-repro 0755 - - -\n' >"$conf"
  systemd-tmpfiles --root="$tmp" --create --dry-run "$conf"

Before:
  Would create directory $tmp/$tmp/run/tmpfiles-repro

Follow-up for de61a04b188f81a85cdb5c64ddb4987dcd9d30d3.

12 days agoutf8: split out unichar_console_width() from utf8_char_console_width()
Yu Watanabe [Tue, 21 Jul 2026 05:35:56 +0000 (14:35 +0900)] 
utf8: split out unichar_console_width() from utf8_char_console_width()

It will be used later.

12 days agomachined: refresh resolve hook addresses per machine
dongshengyuan [Fri, 17 Jul 2026 07:55:57 +0000 (15:55 +0800)] 
machined: refresh resolve hook addresses per machine

Track which machine the cached address list belongs to and refresh it
when ResolveRecord() advances to another machine. This keeps A/AAAA
reuse for the same machine while avoiding mixed name/address records.

Reproducer: register two machines with private addresses 10.88.1.1
and 10.88.2.1, then call io.systemd.Resolve.Hook.ResolveRecord
with both A questions in one request.

Before: the answer for the second machine used its own name but
reused the first machine's address, e.g. resolve-bug-m2 returned
10.88.1.1 instead of 10.88.2.1.

Follow-up: 3cd929f837854e96cd0a856f9a96518701841782

12 days agokernel-install: keep ukify cmdline inside conf root
dongshengyuan [Tue, 21 Jul 2026 08:51:51 +0000 (16:51 +0800)] 
kernel-install: keep ukify cmdline inside conf root

KERNEL_INSTALL_CONF_ROOT overrides kernel-install config lookup. When it
was set and cmdline was absent, 60-ukify still fell back to
/proc/cmdline and embedded host boot options into the target UKI.

Return an empty base cmdline in that case, matching the adjacent
90-loaderentry behavior of not searching outside the override root.

Reproducer:
  KERNEL_INSTALL_CONF_ROOT=$(mktemp -d) python3 -c '
  import runpy
  ns = runpy.run_path("src/kernel-install/60-ukify.install.in",
                      run_name="not_main")
  print(ns["kernel_cmdline_base"]())'

Before:
  The host /proc/cmdline was returned.

Follow-up for: 40c0c9d4bcb1ff47af9935dea538e38447c09118

12 days agohostnamectl: document JSON status object output
dongshengyuan [Wed, 22 Jul 2026 09:23:16 +0000 (17:23 +0800)] 
hostnamectl: document JSON status object output

status with --static, --pretty, or --transient prints only the
selected hostname in regular output. JSON status output is built from
hostnamed's Describe data and remains a full status object.

Document this distinction so callers do not expect the name type
switches to turn JSON status into a single scalar value.

Follow-up for: ac8a4f6b78fe70680d3bc1704b1f85bbcbe7bb55

13 days agohomed: verify privileged worker changes
Luca Boccassi [Fri, 17 Jul 2026 19:22:24 +0000 (20:22 +0100)] 
homed: verify privileged worker changes

Workers may return a newer embedded identity while processing
an owner update. Accept self-modifiable changes, but require
privileged changes to carry a trusted signature.

Follow-up for 70a5db5822c8056b53d9a4a9273ad12cb5f87a92

13 days agorm-rf: downgrade root check log when directory doesn't exist
Luca Boccassi [Wed, 22 Jul 2026 11:14:15 +0000 (12:14 +0100)] 
rm-rf: downgrade root check log when directory doesn't exist

When a unit is stopped we try to destroy the credential mount point,
which might not exist. This logs at error level, which is noisy and
pointless. Downgrade to debug level on ENOENT.

systemd[1]: Failed to determine whether '/run/credentials/run-p119516-i119816.service' is the root file system: No such file or directory

Follow-up for 9dd2dab37e91ab4b000802d98aa7c4713836d53a

13 days agoman: document that ExitType=cgroup is rejected for Type=oneshot
Liu Zheng [Wed, 22 Jul 2026 07:31:24 +0000 (07:31 +0000)] 
man: document that ExitType=cgroup is rejected for Type=oneshot

The ExitType= documentation stated that ExitType=main "cannot be used
with Type=oneshot", which is incorrect: ExitType=main is the default
and works fine with Type=oneshot. The restriction actually enforced by
the code is that ExitType=cgroup is refused for Type=oneshot services
(see service_verify() in src/core/service.c).

Move the "cannot be used with Type=oneshot" note from the ExitType=main
bullet to the ExitType=cgroup bullet where it belongs.

Fixes #42327

Signed-off-by: Liu Zheng <liuzheng@uniontech.com>
2 weeks agoescape: reject UTF-16 surrogates in \u escapes in cunescape_one() (#43079)
Armaan Sandhu [Tue, 21 Jul 2026 14:40:26 +0000 (20:10 +0530)] 
escape: reject UTF-16 surrogates in \u escapes in cunescape_one() (#43079)

A `\u` escape in `cunescape_one()` was accepted for any 16-bit value
except NUL. That range `0x0000`-`0xFFFF` includes the UTF-16 surrogates
`0xD800`-`0xDFFF`, which are not valid Unicode scalar values and cannot
be encoded as valid UTF-8.

2 weeks agohome: insert a space before '='
Yu Watanabe [Tue, 21 Jul 2026 04:10:15 +0000 (13:10 +0900)] 
home: insert a space before '='

2 weeks agoman: update the sample glib/sd-event integration
Beniamino Galvani [Tue, 21 Jul 2026 11:53:24 +0000 (13:53 +0200)] 
man: update the sample glib/sd-event integration

The normal order of operations when iterating the GLib main loop is:

 - prepare()  -> sd_event_prepare()
 - poll the file descriptors
 - check()    -> sd_event_wait()
 - dispatch() -> sd_event_dispatch()

GLib does not guarantee that check() is always called between two
consecutive prepare() invocations. When another thread attaches or
removes a source with poll fds while the main thread is inside
poll(), g_main_context_check_unlocked() returns immediately without
calling any source's check() callback.

Since the sd_event GSource adapter maps prepare/check/dispatch to
sd_event_prepare/sd_event_wait/sd_event_dispatch, a skipped check()
leaves sd_event in ARMED state. The next prepare() then hits
assertion "e->state == SD_EVENT_INITIAL".

The following program reproduces the faulty scenario by creating a
thread that attaches a new fd during the poll phase:

  #include <stdio.h>
  #include <stdlib.h>
  #include <sys/socket.h>
  #include <glib.h>
  #include <systemd/sd-event.h>
  #include <unistd.h>

  /* from glib-event-glue.c */
  extern GSource *g_sd_event_create_source(sd_event *event);

  static gpointer thread_func(gpointer user_data) {
    GSource *source;
    GPollFD pollfd;
    int fd;

    g_usleep(G_USEC_PER_SEC / 10);

    fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
    if (fd < 0)
      abort();

    source = g_source_new(&(GSourceFuncs){0}, sizeof(GSource));
    pollfd.fd = fd;
    pollfd.events = G_IO_IN;
    pollfd.revents = 0;
    g_source_add_poll(source, &pollfd);
    g_source_attach(source, NULL);
    g_source_destroy(source);
    g_source_unref(source);

    close(fd);

    return NULL;
  }

  int main(int argc, char *argv[]) {
    sd_event *event = NULL;
    GSource *source;
    GThread *thread;
    int i, r;

    r = sd_event_default(&event);
    if (r < 0)
      return 1;

    source = g_sd_event_create_source(event);
    if (!source)
      return 1;

    g_source_attach(source, NULL);

    for (i = 0; i < 50; i++) {
      thread = g_thread_new("check-skip", thread_func, NULL);
      g_main_context_iteration(NULL, TRUE);
      g_thread_join(thread);
      g_main_context_iteration(NULL, FALSE);
    }

    g_source_destroy(source);
    g_source_unref(source);
    sd_event_unref(event);

    return 0;
  }

When the program uses the current glue code, it crashes with:

  Assertion 'e->state == SD_EVENT_INITIAL' failed at src/libsystemd/sd-event/sd-event.c:4560, function sd_event_prepare(). Aborting.

Fix the problem by skipping sd_event_prepare() if the event is
already ARMED: it was already prepared in a previous iteration and
it can be polled immediately.

2 weeks agoman: document unlocked as default IMDS network mode
Guillaume Kehren [Tue, 21 Jul 2026 09:14:33 +0000 (11:14 +0200)] 
man: document unlocked as default IMDS network mode

The default IMDS network mode was changed to unlocked, but the
systemd-imdsd@.service documentation still described locked as the
default.

Fixes #42687

2 weeks agoprofile/systemd-osc-context: also escape $USER and $HOSTNAME 43091/head
Rasmus Villemoes [Tue, 21 Jul 2026 08:43:22 +0000 (10:43 +0200)] 
profile/systemd-osc-context: also escape $USER and $HOSTNAME

Claude pointed out that while rather unlikely, it is possible for the USER and
HOSTNAME environment variables to contain problematic characters that require
escaping. Now that that escaping no longer involves the fork+exec overhead of
calling sed, let's ensure those fields do get put through the escape routine.

Refactor __systemd_osc_context_escape so that it not only takes the value and
prints that, but also the format specifier used for emitting the field. That
way, we avoid an extra subshell (i.e. fork+pipe and all that overhead), and
combined with the previous commit, we now only spawn one subshell instead of
two per start= sequence.

That could be reduced to zero, if the "callers" were rewritten to something
like

    printf "\033]3008;start=%.64s;type=shell" "$systemd_osc_context_shell_id"
    __systemd_osc_context_common
    printf "\033\\"

but that will mean that the sequence is not emitted with a single write()
system call [which isn't really guaranteed currently either, just very likely],
so some background process could end up writing to the middle of the sequence,
thus losing that output and mangling the OSC3008 info. This in turn could be
overcome by building the whole sequence in a shell variable using 'printf -v'
and only printing at the end, but that would be a somewhat invasive change.

2 weeks agoprofile/systemd-osc-context: fold emitting cwd= field into __systemd_osc_context_common
Rasmus Villemoes [Tue, 21 Jul 2026 08:32:27 +0000 (10:32 +0200)] 
profile/systemd-osc-context: fold emitting cwd= field into __systemd_osc_context_common

Now that the %s specifier used to embed the common fields in the output appears
immediately before the cwd= field, we can just emit that cwd= field as part of
the common fields.

2 weeks agoprofile/systemd-osc-context: emit type= field first
Rasmus Villemoes [Tue, 21 Jul 2026 08:25:56 +0000 (10:25 +0200)] 
profile/systemd-osc-context: emit type= field first

Not because it is required by the specification, but it will make the following
patches simpler. Also, the fact that the spec explicitly does call out that
type= can appear at the end or in the middle suggests that people would
normally expect it to appear at the beginning.

2 weeks agoprofile/systemd-osc-context: don't do arithmetic expansion on systemd_exitstatus
Rasmus Villemoes [Mon, 20 Jul 2026 13:37:34 +0000 (15:37 +0200)] 
profile/systemd-osc-context: don't do arithmetic expansion on systemd_exitstatus

There's really no point in having bash do arithmetic expansion on the
systemd_exitstatus variable, i.e. have it convert the string to a number, do no
actual arithmetic, then convert it back to a string to be used as the argument to
the printf, which will again convert it to a number for the %d specifier, and
finally emit it as a decimal. Also, it deviates for no obvious reason from how
it is passed to printf in the "probably died by signal" case just above.

2 weeks agoprofile/systemd-osc-context: do not zero-pad pid value
Rasmus Villemoes [Mon, 20 Jul 2026 13:04:21 +0000 (15:04 +0200)] 
profile/systemd-osc-context: do not zero-pad pid value

The %.20d specifier was introduced in 2d738a0aee ("profile/systemd-osc-context:
Enforce length limits"). But, for numeric conversions, the precision is not an
upper bound, but rather a lower bound on the output width, padding as necessary
with 0 on the left. So as-is, this does not in fact limit the output to at most
20 characters.

Of course, in practice, pids on linux are never greater than 2^22, and
certainly never larger than what would fit in a 20-digit decimal. On the other
hand, that more or less guarantees that the pid= field is always emitted with
12+ leadings zeroes, which is a bit silly. Moreover, a leading 0 can cause a
parser to treat it as octal.

Since $$ does expand to the PID in decimal, just print that as a string, with the
enforced 20 character limit.

2 weeks agoprofile/systemd-osc-context: do not use sed for escaping
Rasmus Villemoes [Mon, 20 Jul 2026 12:49:06 +0000 (14:49 +0200)] 
profile/systemd-osc-context: do not use sed for escaping

Bash is perfectly capable of performing the simple substitutions needed for
escaping according to the OSC 3008 spec, so there is no need for the fork+exec
and other overhead of calling sed.

In fact, when writing a test for ensuring that this is a drop-in replacement, I
found out that the current sed method is flawed: If $PWD contains newline
characters, they are passed through unchanged, because sed obviously is
line-oriented.

I do not know which bash version started supporting
${foo//pattern/replacement}, but I ran the below on all Debian images from docker
hub going back to Debian 6 (EOL 2016), carrying BASH_VERSION =
4.1.5(1)-release, and they all succeeded. Since the logic otherwise relies on
PROMPT_COMMAND being an array variable, which happened in 5.1, this should be
all good.

=== test.sh ===
#!/bin/bash

echo "BASH_VERSION = $BASH_VERSION"
ret=0

using_sed() {
    echo "$1" | sed -e 's/\\/\\x5c/g' -e 's/;/\\x3b/g' -e 's/[[:cntrl:]]/⍰/g'
}

pure_bash() {
    local str="$1"
    str="${str//\\/\\x5c}"
    str="${str//;/\\x3b}"
    str="${str//[[:cntrl:]]/⍰}"
    printf "%s" "${str}"
}

do_test() {
    local r0="$1"
    local r1="$(using_sed "$r0")"
    local r2="$(pure_bash "$r0")"
    local s0="$(printf '%s' "$r0" | od -A x -t x1z -w40 | head -n1)"
    local s1="$(printf '%s' "$r1" | od -A x -t x1z -w40 | head -n1)"
    local s2="$(printf '%s' "$r2" | od -A x -t x1z -w40 | head -n1)"
    if [ "$r1" != "$r2" ] || [ "$s1" != "$s2" ] ; then
        echo "Input: $s0"
        echo "sed:   $s1"
        echo "bash:  $s2"
        ret=1
    fi
}

do_test ''
do_test "one ; semicolon"
do_test "two ; semicolons ;"
do_test 'bs \ sc ; bs \ sc ;'
do_test $'\t'
do_test $'sc ; cntrl \x01 \x02 \x03 \x1f \t bs \\ bs \\ sc ; '
do_test $'sc ; tab \x09 del \x7f  bs \\ ;'

# The last cases show that the existing function doesn't actually work in
# the case of $PWD containing a newline character, because sed is
# line-oriented, so a newline character will never be replaced.
if [ "$1" = "all" ] ; then
    do_test $'embedded \n newline'
    do_test $'ending in newline\n'
fi

exit "$ret"
=== test.sh ===

2 weeks agoAssorted cleanups for #42978 (#43051)
Yu Watanabe [Tue, 21 Jul 2026 05:03:49 +0000 (14:03 +0900)] 
Assorted cleanups for #42978 (#43051)

https://github.com/systemd/systemd/pull/42978

2 weeks agotools: reject invalid inputs and align machine-readable output (#43040)
Yu Watanabe [Tue, 21 Jul 2026 03:23:00 +0000 (12:23 +0900)] 
tools: reject invalid inputs and align machine-readable output (#43040)

2 weeks agosd-device: allow non-safe characters in uevent files
Yu Watanabe [Fri, 17 Jul 2026 18:24:34 +0000 (03:24 +0900)] 
sd-device: allow non-safe characters in uevent files

This partially reverts 13ce62caba10e0dfa715dfa5c3ab551dedb02095.

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.

2 weeks agohwdb: strip the root from filenames when generating hwdb.bin (#43062)
Yu Watanabe [Tue, 21 Jul 2026 03:19:00 +0000 (12:19 +0900)] 
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.

2 weeks agohwdb: classify PlayStation controller audio as controller form-factor
Julian Bouzas [Mon, 20 Jul 2026 13:54:48 +0000 (09:54 -0400)] 
hwdb: classify PlayStation controller audio as controller form-factor

Add Sony PlayStation controller entries to 70-sound-card.hwdb so that their
ALSA sound devices are tagged with SOUND_FORM_FACTOR=controller:
 - DualSense (054c:0ce6)
 - DualSense Edge (054c:0df2)
 - DualShock 4 CUH-ZCT1x (054c:05c4)
 - DualShock 4 CUH-ZCT2x (054c:09cc)

These controllers expose USB audio but are neither headsets nor speakers.
Pinning them in the hwdb ensures they are identified correctly before any
fallback matching occurs.

2 weeks agohwdb: strip the root from filenames when generating hwdb.bin 43062/head
Ross Burton [Fri, 17 Jul 2026 16:25:31 +0000 (17:25 +0100)] 
hwdb: strip the root from filenames when generating hwdb.bin

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.

Add TEST-17-UDEV.hwdb.sh to verify that hwdb.bin files contain the
path inside the root, but not the path of the root.

2 weeks agopo: update Japanese translation
Yu Watanabe [Mon, 20 Jul 2026 06:22:56 +0000 (15:22 +0900)] 
po: update Japanese translation

2 weeks agoman/network: fix default value for RequiredFamilyForOnline=
Yu Watanabe [Mon, 20 Jul 2026 05:06:40 +0000 (14:06 +0900)] 
man/network: fix default value for RequiredFamilyForOnline=

It was unexpectedly changed by c89efaf9e5b0d8820dff51edfa7a0e576ed8b3b2.

Fixes #43074.

2 weeks agoFix typos reported by Fossies (#43084)
Luca Boccassi [Mon, 20 Jul 2026 11:38:47 +0000 (12:38 +0100)] 
Fix typos reported by Fossies (#43084)

2 weeks agoudev: drop home-grown udev-ctrl socket (#40802)
Luca Boccassi [Mon, 20 Jul 2026 11:37:27 +0000 (12:37 +0100)] 
udev: drop home-grown udev-ctrl socket (#40802)

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.

2 weeks agohwdb: add debug logging for the output filename
Ross Burton [Mon, 20 Jul 2026 09:38:43 +0000 (10:38 +0100)] 
hwdb: add debug logging for the output filename

It's useful to see exactly what file was written to when updating the
HWDB.

2 weeks agomkosi: update debian commit reference to 56402b2bde258999a8f01a8b04465fde9242d6a1 40802/head
Luca Boccassi [Mon, 20 Jul 2026 09:58:51 +0000 (10:58 +0100)] 
mkosi: update debian commit reference to 56402b2bde258999a8f01a8b04465fde9242d6a1

56402b2bde Drop symlink to systemd-udevd-control.socket
3afaaf4f89 Install new files for upstream build

2 weeks agohostname-util: strip all trailing separators in hostname_cleanup() (#43077)
Armaan Sandhu [Mon, 20 Jul 2026 07:35:12 +0000 (13:05 +0530)] 
hostname-util: strip all trailing separators in hostname_cleanup() (#43077)

Fixes #43054.

2 weeks agosysinstall: fix typo 43084/head
Yu Watanabe [Mon, 20 Jul 2026 06:02:59 +0000 (15:02 +0900)] 
sysinstall: fix typo

Follow-up for c17d0c7e8505c985dfe8581a7fba1b3edf760d7f.

2 weeks agotpm2-util: fix typo
Yu Watanabe [Mon, 20 Jul 2026 06:01:28 +0000 (15:01 +0900)] 
tpm2-util: fix typo

Follow-up for 2348941b5dab8b5851553a5271c0dbe7c7ad838a.

2 weeks agotpm2-util: fix typo
Yu Watanabe [Mon, 20 Jul 2026 06:00:49 +0000 (15:00 +0900)] 
tpm2-util: fix typo

Follow-ups for 5a80137aa449ff0870210eb87077a5ce3ab8680b.

2 weeks agonetwork: fix typo
Yu Watanabe [Mon, 20 Jul 2026 05:58:30 +0000 (14:58 +0900)] 
network: fix typo

Follow-up for d094067547fb8dd91c637981cf6b1870ee2c08de.

2 weeks agostring-util: fix typo
Yu Watanabe [Mon, 20 Jul 2026 05:56:32 +0000 (14:56 +0900)] 
string-util: fix typo

Follow-up for 093cac3fe8b4561b2a4662df9151156dac745457.

2 weeks agoreport: fix typo
Yu Watanabe [Mon, 20 Jul 2026 05:55:11 +0000 (14:55 +0900)] 
report: fix typo

Follow-up for 3c2f7c6002254fa7108e186aeedf2b2c6a86bd4f.

2 weeks agosysupdate: fix typo
Yu Watanabe [Mon, 20 Jul 2026 05:53:45 +0000 (14:53 +0900)] 
sysupdate: fix typo

Follow-up for d82e256bb9d151b185a8afec1fcacd8fbe80555c.

2 weeks agoTODO: fix typo
Yu Watanabe [Mon, 20 Jul 2026 05:51:46 +0000 (14:51 +0900)] 
TODO: fix typo

Follow-ups for f61e1e5cf4e39d0bfc1edb4edb17ea25073203ff and
3d0309ac0fe7adf35fe83e43c0261611bce300de.

2 weeks agonetworkctl,networkd: add --no-reconfigure flag to networkctl reload
Nandakumar Raghavan [Thu, 16 Jul 2026 16:08:27 +0000 (16:08 +0000)] 
networkctl,networkd: add --no-reconfigure flag to networkctl reload

Add a new --no-reconfigure flag to 'networkctl reload' that reloads
.network and .netdev files from disk without reconfiguring any network
interfaces. This may be useful to avoid reconfiguring multiple interfaces
simultaneously when multiple .network files are updated, or when an updated
.network file is applied to multiple interfaces.

On the networkd side, manager_reload() gains a reconfigure_links parameter
that gates the per-link reconfiguration loop. A new io.systemd.Network.Reload
varlink method is added that exposes this as an optional reconfigureLinks
boolean (defaults to true). Both plain 'networkctl reload' and
'--no-reconfigure' now unconditionally call this method first. If an older
networkd returns MethodNotFound, plain reload falls back to
io.systemd.service.Reload for backward compatibility; '--no-reconfigure'
fails with a clear error in that case.

2 weeks agocore/dbus: do not block the manager on GetId during bus (re-)connection
Sinity [Sat, 11 Jul 2026 14:15:31 +0000 (16:15 +0200)] 
core/dbus: do not block the manager on GetId during bus (re-)connection

bus_init_api() issued a synchronous GetId call on every API bus
(re-)connection to decide whether saved subscription state could be
coldplugged onto the new connection.

If the D-Bus socket unit is listening while the message bus daemon
behind it is gone, connect() succeeds against the socket backlog but
nothing answers the authentication handshake. The synchronous call
then blocks PID 1 for BUS_AUTH_TIMEOUT (90 seconds by default), and
queued bus operations can trigger repeated reconnection attempts.
This was observed during shutdown as roughly 15 minutes of teardown
progressing only in 90-second intervals.

Query the instance ID asynchronously on every connection. Defer API
setup until the reply is processed, so saved subscriptions are
validated and coldplugged before new subscription requests can arrive.
If the query cannot be queued or its reply is invalid, discard the
unvalidated state and expose the API without blocking the manager.

Reset the live bus ID on every connection and serialize pending bus ID
and subscription state across reload and reexec. During daemon-reload,
preserve state that was already awaiting the asynchronous reply while
discarding the duplicate state produced by the reload itself.

Also remove the now-unused synchronous bus_get_instance_id() helper.

2 weeks agoManage dlopen notes at beginning of execution, and downgrade priorities in shared...
Zbigniew Jędrzejewski-Szmek [Sun, 19 Jul 2026 19:23:47 +0000 (21:23 +0200)] 
Manage dlopen notes at beginning of execution, and downgrade priorities in shared libraries (#43060)

2 weeks agoportable: tighten image handling and command error reporting (#43033)
Zbigniew Jędrzejewski-Szmek [Sun, 19 Jul 2026 19:09:24 +0000 (21:09 +0200)] 
portable: tighten image handling and command error reporting (#43033)

Let's further improve portable image handling and command error
reporting.

2 weeks agoImprove sysinstall messages (#43050)
Zbigniew Jędrzejewski-Szmek [Sun, 19 Jul 2026 18:16:06 +0000 (20:16 +0200)] 
Improve sysinstall messages (#43050)

I was trying to use systemd-sysinstall and those are the fixes for
various ugly parts that are immediately obvious when it is used.

2 weeks agoboot: cover BCD offsets past the buffer
dongshengyuan [Fri, 17 Jul 2026 02:44:03 +0000 (10:44 +0800)] 
boot: cover BCD offsets past the buffer

Add a zero-length test for offset > max so the first bounds guard
is covered separately from the length overflow check.

Follow-up: 231857cfe8da749925ee2beb1352e74fa96f1372

2 weeks agopassword-quality-util-passwdqc: restore password-quality-util.h include
Alexey Shabalin [Sat, 18 Jul 2026 14:41:33 +0000 (17:41 +0300)] 
password-quality-util-passwdqc: restore password-quality-util.h include

suggest_passwords() references the N_SUGGESTIONS macro, which is defined in
password-quality-util.h. Commit ff33c8f87d ("Extend test-dlopen-so to also
cover cases when built without support") introduced the per-backend split
headers: for the pwquality backend it added the new
password-quality-util-pwquality.h include while keeping password-quality-util.h,
but for the passwdqc backend it replaced password-quality-util.h with
password-quality-util-passwdqc.h (which only pulls in shared-forward.h). As a
result N_SUGGESTIONS is no longer declared in the passwdqc translation unit and
the build fails when the passwdqc backend is enabled.

The passwdqc backend is not exercised by the default CI, so this went
unnoticed. Add the include back, matching the pwquality backend.

2 weeks agosystemd-imds-generator: fix import docs
Arian van Putten [Sat, 18 Jul 2026 16:02:45 +0000 (18:02 +0200)] 
systemd-imds-generator: fix import docs

We only run import in the initrd by default. Clarify this.

2 weeks agorun: split out polkit ops into separate .c file (#43047)
Lennart Poettering [Sat, 18 Jul 2026 09:03:36 +0000 (11:03 +0200)] 
run: split out polkit ops into separate .c file (#43047)

2 weeks agocreds: reject empty validity intervals 43040/head
dongshengyuan [Thu, 16 Jul 2026 06:44:08 +0000 (14:44 +0800)] 
creds: reject empty validity intervals

Reject credentials whose not-after timestamp is equal to the timestamp
at each encryption entry point.

Reproducer: systemd-creds --timestamp=TS --not-after=TS encrypt in out

Before: encryption succeeded, but decrypt refused the credential as not
in order.

Follow-up: 21bc0b6fa1de44b520353b935bf14160f9f70591

2 weeks agodissect: include image size in JSON output
dongshengyuan [Thu, 16 Jul 2026 06:39:42 +0000 (14:39 +0800)] 
dissect: include image size in JSON output

Use the image metadata size when building JSON output, matching the
value already shown by the text output.

Reproducer: systemd-dissect --json=short image.raw

Before: text output showed Size, but JSON omitted the top-level size
field.

Follow-up: be5bee2a132d2d3b45d79bb3f27b05bbc767cd0a

2 weeks agosysupdate: keep JSON check-new exit status consistent
dongshengyuan [Thu, 16 Jul 2026 06:37:01 +0000 (14:37 +0800)] 
sysupdate: keep JSON check-new exit status consistent

Return failure for --json check-new when no candidate is available.
Let sysupdated accept that exact JSON no-update result from workers.

Reproducer: systemd-sysupdate --verify=no --json=short check-new

Before: the command printed {"available":null} and exited successfully.

Follow-up: 42c0b689a800b2ec7cceb1528d3834bf9b3417f8

2 weeks agorepart: skip generated files during dry runs
dongshengyuan [Thu, 16 Jul 2026 06:32:14 +0000 (14:32 +0800)] 
repart: skip generated files during dry runs

Skip generated fstab and crypttab output when --dry-run=yes is used,
after confirming there is eligible content to generate.

Reproducer: systemd-repart --dry-run=yes --generate-fstab=/tmp/root/etc/fstab -

Before: the command exited successfully and still wrote the requested
fstab file.

Follow-up: 1a0541d44c78ced78a566051ec8f63417370aeaa

2 weeks agofirstboot: validate root shell credentials
dongshengyuan [Thu, 16 Jul 2026 06:23:35 +0000 (14:23 +0800)] 
firstboot: validate root shell credentials

Validate passwd.shell.root after reading the credential so it uses
the same target-root shell checks as --root-shell= and prompted input.

Reproducer: CREDENTIALS_DIRECTORY=... systemd-firstboot --root=...
with passwd.shell.root=/bin/nonexistentshell

Before: /etc/passwd was written with the nonexistent root shell and
the command exited successfully.

Follow-up: 416f7b3a11e00d1a43da950fb4a00bc6c2707013

2 weeks agosysusers: validate shell credentials
dongshengyuan [Thu, 16 Jul 2026 06:21:02 +0000 (14:21 +0800)] 
sysusers: validate shell credentials

Validate passwd.shell.<user> credentials with the same login-shell
rules used for sysusers.d shell fields before writing passwd entries.

Reproducer: CREDENTIALS_DIRECTORY=... systemd-sysusers --root=...
with --inline 'u creduser 999 "Cred User" / -'

Before: relative-shell was written as the login shell and the command
exited successfully.

Follow-up: 99e9f896fb491d13c6d02f6f5bbfceabae833f05

2 weeks agorun: simplify timer property handling 43047/head
Lennart Poettering [Thu, 16 Jul 2026 14:44:44 +0000 (16:44 +0200)] 
run: simplify timer property handling

Let's make timer prop handling less special, and more like path/socket
handling. Let's move the checks for at least one OnXYZ= setting to a
common place at the end of parsing, instead of explicit checks for each
property.

2 weeks agorun: split out polkit ops into separate .c file
Lennart Poettering [Mon, 13 Jul 2026 21:47:34 +0000 (23:47 +0200)] 
run: split out polkit ops into separate .c file

Let's shorten an already very long .c file, by splitting it apart a bit.

Splitting out the polkit code is relatively easy, since it does not
touch any of the arg_xyz variables.

2 weeks agomkosi/opensuse: do not try to package non-existent symlink to systemd-udevd-control...
Yu Watanabe [Thu, 4 Jun 2026 19:07:45 +0000 (04:07 +0900)] 
mkosi/opensuse: do not try to package non-existent symlink to systemd-udevd-control.socket

2 weeks agoNEWS: mention the removeal of legacy udev control socket
Yu Watanabe [Thu, 4 Jun 2026 19:18:48 +0000 (04:18 +0900)] 
NEWS: mention the removeal of legacy udev control socket

2 weeks agoudev: drop home-grown udev-ctrl socket
Yu Watanabe [Sun, 22 Feb 2026 16:01:45 +0000 (01:01 +0900)] 
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.

2 weeks agonspawn: do not try to connect udevd
Yu Watanabe [Tue, 2 Jun 2026 02:45:15 +0000 (11:45 +0900)] 
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.

2 weeks agosd-device: use network_namespace_is_init()
Yu Watanabe [Tue, 2 Jun 2026 02:37:52 +0000 (11:37 +0900)] 
sd-device: use network_namespace_is_init()

2 weeks agonamespace-util: introduce network_namespace_is_init()
Yu Watanabe [Tue, 2 Jun 2026 02:32:26 +0000 (11:32 +0900)] 
namespace-util: introduce network_namespace_is_init()

2 weeks agodocs: clarify scope of portable services
acandoo [Fri, 17 Jul 2026 19:09:07 +0000 (15:09 -0400)] 
docs: clarify scope of portable services

Removed note clarifying that portable services are only for system services and not user services, and changed comparisons to "system services" with just "services". With newer systemd versions, `systemd-portabled` can be run as a user service.

2 weeks agodlopen-note: downgrade all dlopen notes in libsystemd.so and libsystemd-shared.so 43060/head
Yu Watanabe [Fri, 10 Jul 2026 16:20:47 +0000 (01:20 +0900)] 
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.

2 weeks agotree-wide: drop DLOPEN_FOO() macros
Yu Watanabe [Fri, 10 Jul 2026 14:59:06 +0000 (23:59 +0900)] 
tree-wide: drop DLOPEN_FOO() macros

Since 4c0d8d967300fde858f83ec4b361db19e3e257c8, 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.

2 weeks agosd-dlopen: make header self-standing again
Luca Boccassi [Fri, 17 Jul 2026 11:10:01 +0000 (12:10 +0100)] 
sd-dlopen: make header self-standing again

The purpose of this header was to provide MIT-0 sources that can be copied
and pasted liberally. Including an LGPL-2.1+ header from it deafeats its
purpose. Make it self-standing again.

Follow-up for aa0db003cf537aeb051cc51a2f7e95d51a5756cd

2 weeks agoupdate TODO
Lennart Poettering [Thu, 16 Jul 2026 14:30:12 +0000 (16:30 +0200)] 
update TODO

2 weeks agonspawn: use chase() for creating dev nodes (#43037)
Luca Boccassi [Fri, 17 Jul 2026 08:02:28 +0000 (09:02 +0100)] 
nspawn: use chase() for creating dev nodes (#43037)

2 weeks agorepart: fix varlink description string 43050/head
Zbigniew Jędrzejewski-Szmek [Fri, 17 Jul 2026 07:21:59 +0000 (09:21 +0200)] 
repart: fix varlink description string

Fixup for 1c76e204d3eb2e43918ddd18c9a93eed8facedfd.

2 weeks agonetwork: silence false warning about unitialized variable
Zbigniew Jędrzejewski-Szmek [Thu, 16 Jul 2026 13:17:33 +0000 (15:17 +0200)] 
network: silence false warning about unitialized variable

[1177/3647] Compiling C object systemd-networkd.p/src_network_networkd-bridge-vlan.c.o
In function ‘bridge_vlan_append_set_info’,
    inlined from ‘bridge_vlan_set_message’ at ../src/network/networkd-bridge-vlan.c:257:21:
../src/network/networkd-bridge-vlan.c:162:28: warning: ‘untagged’ may be used uninitialized [-Wmaybe-uninitialized]
  162 |                         if (untagged == u)
      |                            ^
../src/network/networkd-bridge-vlan.c: In function ‘bridge_vlan_set_message’:
../src/network/networkd-bridge-vlan.c:111:14: note: ‘untagged’ was declared here
  111 |         bool untagged, pvid_is_untagged;
      |              ^~~~~~~~