Commit Graph
90486 Commits
Author SHA1 Message Date
Lennart Poettering f45e7b6f8a hostnamed: move error logging into context_write_data_{static_hostname|machine_info}()
This is preparation for adding Varlink calls for these operations, as it
makes sense to unify log msg generation in one place (i.e. the callee)
rather than in two (the two callers, i.e. the D-Bus and the Varlink
interfaces).
2026-06-01 10:56:16 +02:00
Lennart Poettering 8b9d503471 strv: add strv_remove_strv()
This is to strv_remove() what strv_extend_strv() is to strv_extend()
2026-06-01 10:56:15 +02:00
Luca Boccassi 8ff7a5cd09 journalctl: don't assert on MESSAGE field without "MESSAGE=" prefix
sd_journal_get_data() can return a MESSAGE data object whose payload does
not start with "MESSAGE=", e.g. when the journal file is corrupted. Instead
of aborting the whole process, log and skip over such an entry like we do for
other bad/missing fields.

[   87.287390] post.sh[1619]: + journalctl -q -o short-monotonic --grep 'didn'\''t pass validation'
[   87.287844] post.sh[1620]: + grep -v test-varlink-idl
[   87.325676] post.sh[1619]: Assertion 'message = startswith(message, "MESSAGE=")' failed at src/journal/journalctl-show.c:261, function show(). Aborting.

 #0  0x00007fb47b49a29c n/a (libc.so.6 + 0x9a29c)
 #1  0x00007fb47b43e7d0 raise (libc.so.6 + 0x3e7d0)
 #2  0x00007fb47b425681 abort (libc.so.6 + 0x25681)
 #3  0x00007fb47b8a1ace log_assert_failed (libsystemd-shared-261~rc2.so + 0xa1ace)
 #4  0x000055f8e1ef9ddb show (journalctl + 0xcddb)
 #5  0x000055f8e1efa6ee action_show (journalctl + 0xd6ee)
 #6  0x000055f8e1ef3c20 run (journalctl + 0x6c20)
 #7  0x00007fb47b427741 n/a (libc.so.6 + 0x27741)
 #8  0x00007fb47b427879 __libc_start_main (libc.so.6 + 0x27879)
 #9  0x000055f8e1ef4915 _start (journalctl + 0x7915)

Co-developed-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 23:02:25 +01:00
Luca Boccassi 7bd3a80122 Translations update from Fedora Weblate (#42403)
Translations update from [Fedora
Weblate](https://translate.fedoraproject.org) for
[systemd/main](https://translate.fedoraproject.org/projects/systemd/main/).



Current translation status:

![Weblate translation
status](https://translate.fedoraproject.org/widget/systemd/main/horizontal-auto.svg)
2026-05-31 11:55:15 +01:00
Fco. Javier F. Serrador 341bf1cceb po: Translated using Weblate (Spanish)
Currently translated at 100.0% (285 of 285 strings)

Co-authored-by: Fco. Javier F. Serrador <fserrador@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/es/
Translation: systemd/main
2026-05-31 10:02:00 +00:00
joo es d4b27821fa po: Translated using Weblate (Arabic)
Currently translated at 100.0% (285 of 285 strings)

Co-authored-by: joo es <jonnyse@users.noreply.translate.fedoraproject.org>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/ar/
Translation: systemd/main
2026-05-31 10:01:59 +00:00
Rafael Fontenelle 11f9189982 po: Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (285 of 285 strings)

Co-authored-by: Rafael Fontenelle <rafaelff@gnome.org>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/pt_BR/
Translation: systemd/main
2026-05-31 10:01:58 +00:00
Anders Jonsson d5fb757a8b po: Translated using Weblate (Swedish)
Currently translated at 100.0% (285 of 285 strings)

Co-authored-by: Anders Jonsson <anders.jonsson@norsjovallen.se>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/sv/
Translation: systemd/main
2026-05-31 10:01:57 +00:00
Luna Jernberg 73a22deca1 po: Translated using Weblate (Swedish)
Currently translated at 100.0% (285 of 285 strings)

Co-authored-by: Luna Jernberg <droidbittin@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/sv/
Translation: systemd/main
2026-05-31 10:01:56 +00:00
Ettore Atalan b112b72cab po: Translated using Weblate (German)
Currently translated at 99.2% (283 of 285 strings)

Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/de/
Translation: systemd/main
2026-05-31 10:01:55 +00:00
Marek Adamski f08a4d354c po: Translated using Weblate (Polish)
Currently translated at 100.0% (285 of 285 strings)

Co-authored-by: Marek Adamski <maradam@users.noreply.translate.fedoraproject.org>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/pl/
Translation: systemd/main
2026-05-31 10:01:55 +00:00
김인수 8196a11fd4 po: Translated using Weblate (Korean)
Currently translated at 100.0% (285 of 285 strings)

Co-authored-by: 김인수 <simmon@nplob.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/ko/
Translation: systemd/main
2026-05-31 10:01:54 +00:00
Yuri Chornoivan 07ad7c58a6 po: Translated using Weblate (Ukrainian)
Currently translated at 97.1% (277 of 285 strings)

Co-authored-by: Yuri Chornoivan <yurchor@ukr.net>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/uk/
Translation: systemd/main
2026-05-31 10:01:53 +00:00
Américo Monteiro c4d5d1f89a po: Translated using Weblate (Portuguese)
Currently translated at 100.0% (285 of 285 strings)

Co-authored-by: Américo Monteiro <a_monteiro@gmx.com>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/pt/
Translation: systemd/main
2026-05-31 10:01:52 +00:00
Zbigniew Jędrzejewski-Szmek 06eeb83d3e tmpfiles: exclude x11 lock files from time-based cleanup
We need a removal rule for systems where /tmp is not on tmpfs,
so that if they crash, stale sockets will be removed during boot.
OTOH, at runtime, those lock files must never be removed.
But since the 'r!' rule uses '!', it only applies during boot. With
the rule inactive, the usual time-based cleanup for /tmp/ was also
applied to those files, causing them to be removed after 10 days.

Fixes #35182.
2026-05-31 11:44:38 +02:00
Zbigniew Jędrzejewski-SzmekandJarl Gullberg 5474cadc8d tmpfiles: remove boot-only restriction from x11 directory rules
4a1f92c704 added '!' through confusion:
the goal was probably to exclude those directories from cleanup at
runtime. But as discussed below, that exclusion is not needed. In fact,
we want the rule to be active during runtime, so that if the directory
were removed or wasn't created earlier for whatever reason, it'd be
created during one of those later runs too. This just makes the system
more robust.

Those directories are used for sockets, and tmpfiles will not remove
live sockets. So it is fine to run the cleanup on those directories,
it doesn't have any effect in normal circumstances. The only case where
the cleanup would matter would be if the service was running, crashed
without removing the socket, and the system would remain up for more
than 10 days after that. This is not a particularly likely scenario, but
OTOH, we can imaging that somebody tried to run Xorg, it didn't work,
and they switched to Wayland. Or their DE crashes every once in a while,
leaving some state behind. Keeping the cleanup in place seems OK, it
makes the system slightly more robust in fringe scenarios.

In fact, this cleanup will work better if we reduce the delay from
10 days to something small. systemd-tmpfiles-clean.timer runs once
per day, so the cleanup will not be very fast anyway. So use '1h' as
an arbitrary small value. (I think '0' would be risky, because it's
possible for the socket to be set up through a script where it's
created first and the service is connected to it, so it is momentarily
"not live". I think people used to do this. Not sure if that happens
anymore, but let's be safe.)

Co-authored-by: Jarl Gullberg <jarl.gullberg@visar-systems.com>
2026-05-31 11:44:21 +02:00
sykikxo 4dfae2dc0f hwdb: add Infinix Y3 Max YL-613 keys
Map the Power Boost key (top-right corner, scancode 0x64) to KEY_PROG1.
Map the Touchpad Toggle key (Fn+F8, scancode 0x76) to KEY_F21.

Verified working via evtest:

Event: type 4 (EV_MSC), code 4 (MSC_SCAN), value 64
Event: type 1 (EV_KEY), code 148 (KEY_PROG1), value 1

Event: type 4 (EV_MSC), code 4 (MSC_SCAN), value 76
Event: type 1 (EV_KEY), code 206 (KEY_F21), value 1

DMI: svnInfinix:*pnY3Max:*
AT keyboard scancodes: 0x64, 0x76 (set 2)
2026-05-31 10:16:53 +01:00
sykikxo 3bc3b418c8 hwdb: add Infinix Y3 Max YL-613 touchpad properties 2026-05-31 10:15:26 +01:00
Hosted Weblate e1a22b4f15 po: Update translation files
Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://translate.fedoraproject.org/projects/systemd/main/
Translation: systemd/main
2026-05-30 12:34:04 +01:00
Luca Boccassi 6b0492096e libfido2: enable translations for Plymouth strings (#42389)
- This synchronize the state for existing stuff.
- Enable translations for Plymouth interaction strings.
- Translate them in French as an example.

Fixes #42384.
2026-05-30 10:38:46 +01:00
Raito Bezarius 62badf869b po/fr: translate FIDO2-related strings for Plymouth
Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
2026-05-30 00:20:00 +02:00
Raito Bezarius 41a7be06ca po: regenerate PO files
Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
2026-05-30 00:20:00 +02:00
Raito Bezarius 8c46cefa02 po: regenerate POT files
Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
2026-05-30 00:20:00 +02:00
Raito Bezarius 45164c57f8 shared/libfido2: translate Plymouth interaction strings
Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
2026-05-30 00:20:00 +02:00
Raito Bezarius d5876c1e35 po: regenerate translations
This changes some lines and add translations related to resolved
policies and sysupdate policies.

Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
2026-05-29 23:54:20 +02:00
Luca Boccassi 31540f3235 ci: add build/unit-test coverage for armv7
arm64 hosts support running armv7 (armhf) binaries, so we can
cross compile and run the unit tests without performance issues.

armv7 (armhf) is a primary architecture on Ubuntu, so build
regressions block new version updates, and adding coverage
helps to avoid introducing regressions.
2026-05-29 18:15:14 +01:00
Luca Boccassi 595d3d593c test: skip test-execute and ukify addon test when cross-compiling
These tests run native tools on foreign ELF files, so they fail,
just skip them when cross-compiling
2026-05-29 17:48:52 +01:00
Luca Boccassi 0fd7b5ea5f test: avoid false maybe-uninitialized warning
2026-05-29T16:05:02.6627742Z In file included from ../src/basic/../fundamental/assert-util.h:8,
2026-05-29T16:05:02.6628349Z                  from ../src/basic/assert-util.h:4,
2026-05-29T16:05:02.6628722Z                  from ../src/basic/basic-forward.h:17,
2026-05-29T16:05:02.6629044Z                  from ../src/libsystemd/sd-common/sd-forward.h:6,
2026-05-29T16:05:02.6629361Z                  from ../src/shared/shared-forward.h:6,
2026-05-29T16:05:02.6629648Z                  from ../src/shared/crypto-util.h:4,
2026-05-29T16:05:02.6631153Z                  from ../src/test/test-crypto-util.c:3:
2026-05-29T16:05:02.6634148Z ../src/test/test-crypto-util.c: In function ‘test_digest_size’:
2026-05-29T16:05:02.6634986Z ../src/basic/../fundamental/macro.h:95:41: error: ‘size’ is used uninitialized [-Werror=uninitialized]
2026-05-29T16:05:02.6635470Z    95 | #define _unlikely_(x) (__builtin_expect(!!(x), 0))
2026-05-29T16:05:02.6635764Z       |                                         ^~~~~
2026-05-29T16:05:02.6636287Z ../src/basic/../fundamental/assert-util.h:59:21: note: in expansion of macro ‘_unlikely_’
2026-05-29T16:05:02.6636963Z    59 |                 if (_unlikely_(!(expr)))                                \
2026-05-29T16:05:02.6637344Z       |                     ^~~~~~~~~~
2026-05-29T16:05:02.6637864Z ../src/basic/../fundamental/assert-util.h:65:25: note: in expansion of macro ‘assert_message_se’
2026-05-29T16:05:02.6638339Z    65 | #define assert_se(expr) assert_message_se(expr, #expr)
2026-05-29T16:05:02.6638642Z       |                         ^~~~~~~~~~~~~~~~~
2026-05-29T16:05:02.6639066Z ../src/test/test-crypto-util.c:136:17: note: in expansion of macro ‘assert_se’
2026-05-29T16:05:02.6639450Z   136 |                 assert_se(size == t->size);
2026-05-29T16:05:02.6639704Z       |                 ^~~~~~~~~
2026-05-29T16:05:02.6640063Z ../src/test/test-crypto-util.c:132:16: note: ‘size’ declared here
2026-05-29T16:05:02.6640590Z   132 |         size_t size;
2026-05-29T16:05:02.6640794Z       |                ^~~~
2026-05-29 17:48:50 +01:00
Luca Boccassi b3f50b9515 core: fix maybe-uninitialized warning
2026-05-29T13:14:20.8990848Z arm-linux-gnueabihf-gcc -Isrc/core/libsystemd-core-261.a.p -Isrc/core -I../src/core -Isrc/shared -I../src/shared -Isrc/bpf -I../src/bpf -I../src/libsystemd/sd-bus -I../src/libsystemd/sd-common -I../src/libsystemd/sd-device -I../src/libsystemd/sd-event -I../src/libsystemd/sd-future -I../src/libsystemd/sd-hwdb -I../src/libsystemd/sd-id128 -Isrc/libsystemd/sd-journal -I../src/libsystemd/sd-journal -I../src/libsystemd/sd-json -I../src/libsystemd/sd-netlink -I../src/libsystemd/sd-network -I../src/libsystemd/sd-path -I../src/libsystemd/sd-resolve -I../src/libsystemd/sd-varlink -Isrc/basic -I../src/basic -Isrc/fundamental -I../src/fundamental -Isrc/systemd -I../src/systemd -Isrc/version -I../src/version -I/usr/include/uuid -I/usr/include/json-c -I/usr/include/blkid -I/usr/include/libmount -fdiagnostics-color=always -DNDEBUG -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -Werror -std=gnu17 -O0 -Wno-missing-field-initializers -Wno-unused-parameter -Wno-nonnull-compare -Warray-bounds -Warray-bounds=2 -Wdate-time -Wendif-labels -Werror=bool-compare -Werror=discarded-qualifiers -Werror=format=2 -Werror=format-signedness -Werror=implicit-function-declaration -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Werror=missing-declarations -Werror=missing-prototypes -Werror=overflow -Werror=override-init -Werror=pointer-sign -Werror=return-type -Werror=sequence-point -Werror=shift-count-overflow -Werror=shift-overflow=2 -Werror=strict-flex-arrays -Werror=undef -Wfloat-equal -Wimplicit-fallthrough=5 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wmissing-noreturn -Wnested-externs -Wold-style-definition -Wpointer-arith -Wredundant-decls -Wshadow -Wstrict-aliasing=2 -Wstrict-prototypes -Wsuggest-attribute=noreturn -Wunused-function -Wwrite-strings -Wzero-length-bounds -fdiagnostics-show-option -fexcess-precision=standard -fno-common -fstack-protector -fstack-protector-strong -fstrict-flex-arrays=3 -fno-math-errno --param=ssp-buffer-size=4 -Wno-unused-result -Werror=shadow -O2 -pipe -g -feliminate-unused-debug-types -fPIC -fno-strict-aliasing -fstrict-flex-arrays=1 -fvisibility=hidden -fno-omit-frame-pointer -include config.h -isystem../src/include/glibc -isystem../src/include/override -isystemsrc/include/override -isystem../src/include/uapi -fvisibility=default -MD -MQ src/core/libsystemd-core-261.a.p/unit.c.o -MF src/core/libsystemd-core-261.a.p/unit.c.o.d -o src/core/libsystemd-core-261.a.p/unit.c.o -c ../src/core/unit.c
2026-05-29T13:14:20.9001764Z ../src/core/unit.c: In function ‘unit_start_on_termination_deps’:
2026-05-29T13:14:20.9002500Z ../src/core/unit.c:2367:21: error: ‘job_mode’ may be used uninitialized [-Werror=maybe-uninitialized]
2026-05-29T13:14:20.9004088Z  2367 |                 r = manager_add_job(u->manager, JOB_START, other, job_mode, &error, /* ret= */ NULL);
2026-05-29T13:14:20.9004619Z       |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2026-05-29T13:14:20.9005147Z ../src/core/unit.c:2341:17: note: ‘job_mode’ was declared here
2026-05-29T13:14:20.9005458Z  2341 |         JobMode job_mode;
2026-05-29T13:14:20.9005673Z       |                 ^~~~~~~~
2026-05-29T13:14:20.9005898Z cc1: all warnings being treated as errors

Follow-up for 9faeb2d024
2026-05-29 17:48:37 +01:00
Luca Boccassi 7195c668ce sysupdate: fix bogus return code
2026-05-29T13:44:48.7158429Z In file included from ../src/basic/../fundamental/assert-util.h:8,
2026-05-29T13:44:48.7159224Z                  from ../src/basic/assert-util.h:4,
2026-05-29T13:44:48.7159990Z                  from ../src/basic/basic-forward.h:17,
2026-05-29T13:44:48.7160337Z                  from ../src/basic/alloc-util.h:6,
2026-05-29T13:44:48.7161366Z                  from ../src/sysupdate/sysupdate-transfer.c:9:
2026-05-29T13:44:48.7169020Z ../src/sysupdate/sysupdate-transfer.c: In function ‘transfer_acquire_instance’:
2026-05-29T13:44:48.7169957Z ../src/basic/../fundamental/macro.h:190:37: error: ‘r’ may be used uninitialized [-Werror=maybe-uninitialized]
2026-05-29T13:44:48.7170483Z   190 |                 default:            __builtin_llabs((long long) (a)))
2026-05-29T13:44:48.7171001Z       |                                     ^~~~~~~~~~~~~~~
2026-05-29T13:44:48.7171435Z ../src/basic/log.h:32:46: note: in expansion of macro ‘ABS’
2026-05-29T13:44:48.7171800Z    32 | #define ERRNO_VALUE(val)                    (ABS(val) & ~(1 << 30))
2026-05-29T13:44:48.7172134Z       |                                              ^~~
2026-05-29T13:44:48.7172528Z ../src/basic/log.h:188:28: note: in expansion of macro ‘ERRNO_VALUE’
2026-05-29T13:44:48.7173003Z   188 |                         : -ERRNO_VALUE(_e);                             \
2026-05-29T13:44:48.7173317Z       |                            ^~~~~~~~~~~
2026-05-29T13:44:48.7173779Z ../src/basic/log.h:208:17: note: in expansion of macro ‘log_full_errno_zerook’
2026-05-29T13:44:48.7174204Z   208 |                 log_full_errno_zerook(level, (int)_error, __VA_ARGS__); \
2026-05-29T13:44:48.7174528Z       |                 ^~~~~~~~~~~~~~~~~~~~~
2026-05-29T13:44:48.7174917Z ../src/basic/log.h:233:41: note: in expansion of macro ‘log_full_errno’
2026-05-29T13:44:48.7175401Z   233 | #define log_error_errno(error, ...)     log_full_errno(LOG_ERR,     error, __VA_ARGS__)
2026-05-29T13:44:48.7175799Z       |                                         ^~~~~~~~~~~~~~
2026-05-29T13:44:48.7176318Z ../src/sysupdate/sysupdate-transfer.c:1346:32: note: in expansion of macro ‘log_error_errno’
2026-05-29T13:44:48.7176931Z  1346 |                         return log_error_errno(r, "SHA256 checksum not known for download '%s', refusing.", i->path);
2026-05-29T13:44:48.7177514Z       |                                ^~~~~~~~~~~~~~~
2026-05-29T13:44:48.7178157Z ../src/sysupdate/sysupdate-transfer.c:1270:13: note: ‘r’ was declared here
2026-05-29T13:44:48.7178501Z  1270 |         int r;

Follow-up for 43cc7a3ef4
2026-05-29 17:48:37 +01:00
Luca Boccassi 3db89cbf0e hwdb: reject overlong fnmatch key instead of passing NULL to fnmatch()
When the accumulated trie key exceeds the fixed-size line buffer,
linebuf_get() returns NULL. trie_fnmatch_f() passed that NULL straight
into fnmatch() as the pattern, causing a SIGSEGV on a crafted hwdb.bin
(reachable now that recursion is capped rather than overflowing the
stack first). Treat the NULL like the other corruption checks and
return -EBADMSG.

Follow-up for 73fea38cf1

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

Co-developed-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-29 17:21:31 +01:00
Daan De Meyer 6ec161c5b9 ssh-proxy: Default to root user
When ssh-ing into a VM, you generally do not want to log
in as your user from the host. Let's default to the root
user unless a user is explicitly specified.
2026-05-29 16:13:29 +02:00
Daan De Meyer 0a63318420 ssh-generator: Make sure sshd can always read the authorized keys file
sshd reads AuthorizedKeysFile after dropping to the authenticating user's UID, so the
0400 credential file under %d/ is unreadable for non-root users. Materialize a 0444
copy in a RuntimeDirectory so the ephemeral key works for any user. */
2026-05-29 16:12:45 +02:00
Luca Boccassi 67411a3f09 oom: use cgroup.kill if available
The log message is informational only, same as the count of killed
processes, so we can safely use cgroup.kill when available instead
of manually recursing through the cgroup tree.
2026-05-29 12:02:29 +01:00
Luca Boccassi 92a5bf2c02 cgroup: optionally check number of tasks before cgroup.kill
This of course cannot be atomic, but for informational purposes it
should be good enough
2026-05-28 20:55:01 +01:00
Luca Boccassi 39bec38eb1 cgtop: use cg helper to parse pids.current 2026-05-28 20:55:01 +01:00
Yu Watanabe 20572a8938 units: drop Before=sockets.target from networkd resolve hook
Otherwise, it introduces cyclic dependencies:
```
systemd[1]: sockets.target: Found ordering cycle:
    systemd-networkd-resolve-hook.socket/start after network-pre.target/start after
    iptables.service/start after basic.target/start after sockets.target/start -
    after systemd-networkd-resolve-hook.socket
systemd[1]: sockets.target: Job systemd-networkd-resolve-hook.socket/start deleted
    to break ordering cycle starting with sockets.target/start
```

Follow-up for 37adb410a2.
Fixes #42353.
2026-05-29 04:34:30 +09:00
Yu Watanabe f8fbee74ba network: mention interface name in polkit details
Closes #42274.
2026-05-29 04:34:18 +09:00
jeffhuang 0c5cba6420 pe-binary: bound section data against file size, cap UKI zero-padding hash, validate optional header size
A hostile but structurally valid 382-byte PE32+ "EFI application" with a
single section whose VirtualSize is ~4 GiB and SizeOfRawData is 0 drives
uki_hash() into ~4.17 M iterations of SHA-256 over 1024 bytes of zeros
— wedging the parser for >10 s. Nine more slow-units share the same
shape. A separate MSAN finding from the new fuzzer (CIFuzz, memory
sanitizer) shows pe_load_headers() reading uninitialised heap memory
when SizeOfOptionalHeader is too small to actually contain
NumberOfRvaAndSizes.

Three tightenings in src/shared/pe-binary.c:

  1. In pe_load_sections, reject sections whose PointerToRawData +
     SizeOfRawData exceeds the actual file size. Raw section data must
     fit inside the file; this is the parser-wide invariant
     pe_hash / uki_hash / pe_read_section_data rely on.

  2. In uki_hash, cap the (VirtualSize - SizeOfRawData) zero-padding
     hash loop at 64 MiB. Real UKIs do not pad sections with tens of
     MiB of zero-equivalent data; anything above this cap is a
     malformed PE.

  3. In pe_load_headers, reject a PE whose SizeOfOptionalHeader is too
     small to cover up to NumberOfRvaAndSizes. Without this guard the
     subsequent size-mismatch check reads uninitialised optional-header
     bytes, caught by MSAN under CIFuzz.

Add the 382 B canonical reproducer (plus two structural siblings) and
the MSAN reproducer to test/fuzz/fuzz-pe-binary/. Also add a libFuzzer
harness in src/fuzz/fuzz-pe-binary.c and unit tests in
src/test/test-pe-binary.c that exercise each fix branch in isolation.
The 64 MiB hash boundary test is gated behind SYSTEMD_SLOW_TESTS so it
doesn't slow down emulated-arch CI.

This is a robustness fix, not a security fix: PE binaries consumed by
bootctl / systemd-stub / pcrlock / kernel-install / systemd-measure are
already trusted and signed at the consumer side, so the worst pre-fix
behaviour is wasted CPU on a UKI install / measure / inspect call.

Closes #42344.

Reported-by: AI-assisted libFuzzer campaign
Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 04:30:48 +09:00
Zbigniew Jędrzejewski-Szmek 97a0ec135b Downgrade warning about missing libseccomp
We currently log at warning level:
/usr/lib/systemd/system/systemd-udevd.service:56: System call bpf cannot be
  resolved as libseccomp is not available, ignoring: Operation not supported

In the initrd, or in minimal installations, not installing libseccomp is
reasonable, depending on various other choices. We shouldn't make fuss
about this.

C.f. https://bugzilla.redhat.com/show_bug.cgi?id=2463540.
2026-05-29 01:09:19 +09:00
Zbigniew Jędrzejewski-Szmek 5991f0b861 profile.d: add instructions how to deactivate 80-systemd-osc-context.sh
This was requested in https://github.com/systemd/systemd/issues/42333.
Indeed, this integration is using three levels of systemd magick, so
doing this correctly is not obvious. Let's include specific instructions
to help people for whom this integration is causing problems.
2026-05-29 01:08:07 +09:00
Lennart Poettering eb3799a373 fd-util: add wildcard_fd_is_valid() helper and use it tree-wide
Many *at()-style helpers accept a directory fd that may be either a
regular, valid fd (>= 0) or one of the special AT_FDCWD/XAT_FDROOT
wildcard values, and open-code that check in their assertions. Add a
wildcard_fd_is_valid() helper for it and use it tree-wide.
2026-05-28 13:33:08 +01:00
Zbigniew Jędrzejewski-Szmek bf4388ab31 repart: constify Context* params 2026-05-28 12:06:12 +02:00
Zbigniew Jędrzejewski-Szmek fa2a6b6d88 shared/mkfs-util: split out mkfs_find_or_warn() 2026-05-28 12:06:10 +02:00
Malformed C d35fa257eb nspawn: join network namespace before cloning user namespace
When both --private-users and --network-namespace-path are
specified, systemd-nspawn fails to start with "Operation not
permitted" during the setns() call.

This occurs because of the following execution sequence:
1. The outer child calls raw_clone() with CLONE_NEWUSER to create
   the new user namespace.
2. The inner child is spawned inside this new user namespace.
3. The inner child then attempts to call setns() to join the
   external network namespace.

Because the inner child is already running inside
the restricted user namespace, the kernel rejects
the setns() call to join a network namespace owned by
a different (host/more privileged) user namespace.

Fix this by moving the setns() call to the outer child, executing it
just before the raw_clone() call. This ensures the network namespace
is joined while the process still has the necessary privileges, which
also aligns with the inner child's expectation that the network
namespace is already set up upon entry.
2026-05-28 16:53:23 +09:00
Yu Watanabe 68af89e619 meson: move simple test entries 2026-05-28 16:44:29 +09:00
Yu Watanabe 96c2f88ce5 fuzz-hwdb: shorten name of reproducers
The file name of the reproducer is used for test name, and the test name
is messed when the file name is too long.
Also, the mentioned issues are not regressions, but long standing bugs.

Follow-up for 73fea38cf1.
2026-05-28 16:44:16 +09:00
Daan De Meyer d4aa9dcda5 test: stop using PATH_TEST()/QMP_TEST() macro to make not confuse gcc/gcov/lcov (#42338) 2026-05-28 09:33:22 +02:00
jeffhuang 73fea38cf1 hwdb: bounds-check trie offsets against the mmap before dereferencing
Fixes a family of OOB reads in the trie walker where attacker-controlled
offsets are loaded from a (possibly hostile) hwdb.bin and added to
hwdb->map without first checking that the resulting pointer stays inside
the mapping. Crash sites:

  - trie_fnmatch_f               sd-hwdb.c:187   (#42340)
  - trie_search_f                sd-hwdb.c:233   (#42341)
  - trie_children_cmp_f /bsearch sd-hwdb.c:94    (#42342)
  - hwdb_add_property            sd-hwdb.c:121   (#42343)
  - trie_node_from_off (UBSAN)   sd-hwdb.c:83
  - trie_fnmatch_f stack overflow on cyclic children (CIFuzz finding)

Commit b45a897edc ("hwdb: reject out-of-bounds fnmatch prefixes")
plugged the first site only at the prefix_off-content level, but the
crash on the read of node->prefix_off itself still happens when node is
already OOB. This is the structural fix: a single hwdb_at() helper
validates that [off, off + size) lies inside the mapping, and
trie_node_from_off() / trie_string() return NULL on OOB; every caller
treats the result as nullable and surfaces -EBADMSG.

trie_fnmatch_f() additionally caps its recursion depth at 2048; without
the cap a corrupt trie whose child offsets form a cycle (or just a deep
linear chain) drives the parser into stack-overflow rather than
returning -EBADMSG (caught by CIFuzz address sanitizer on this branch).

Additions:

  - A fuzz-hwdb libFuzzer harness that drives sd_hwdb_new_from_path,
    sd_hwdb_get, sd_hwdb_seek, and sd_hwdb_enumerate on attacker bytes.
  - Five hand-crafted unit tests in test-sd-hwdb.c (one per crash
    bucket, plus the cyclic-trie recursion case) that build a malformed
    in-memory hwdb.bin and assert -EBADMSG rather than SIGSEGV /
    stack-overflow.
  - Regression corpus files under test/fuzz/fuzz-hwdb/ pinning each
    fixed bucket, including the CIFuzz stack-overflow reproducer.

Closes #42340.
Closes #42341.
Closes #42342.
Closes #42343.

Reported-by: AI-assisted libFuzzer campaign
Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 15:05:24 +09:00
Luca Boccassi 6f31db9b07 test-oomd: drop racy last_had_mem_reclaim assertion
test_oomd_cgroup_context_acquire_and_insert sets c1->pgscan = UINT64_MAX
and c1->last_had_mem_reclaim = 888 before re-inserting via
oomd_insert_cgroup_context(h1, h2, cgroup), then asserts that c2 carries
over last_had_mem_reclaim == 888.

The assumption was that, because c1->pgscan (which becomes c2->last_pgscan)
is UINT64_MAX and is therefore strictly greater than the freshly-acquired
c2->pgscan, oomd_pgscan_rate() in oomd_insert_cgroup_context() would
return 0 and leave last_had_mem_reclaim untouched. But the function
treats last_pgscan > pgscan as "cgroup was recreated", resets last_pgscan
to 0, and returns pgscan - 0 == pgscan. So when the kernel records any
non-zero pgscan on the live cgroup of the test unit, the rate is > 0 and
last_had_mem_reclaim is overwritten with now(CLOCK_MONOTONIC).

From src/oom/oomd-util.c:

    uint64_t oomd_pgscan_rate(const OomdCGroupContext *c) {
            [...]
            last_pgscan = c->last_pgscan;
            if (c->last_pgscan > c->pgscan) {
                    log_debug("Last pgscan %"PRIu64" greater than current pgscan %"PRIu64" for %s. Using last pgscan of zero.",
                                    c->last_pgscan, c->pgscan, c->path);
                    last_pgscan = 0;
            }
            return c->pgscan - last_pgscan;
    }

    int oomd_insert_cgroup_context(Hashmap *old_h, Hashmap *new_h, const char *path) {
            [...]
            if (oomd_pgscan_rate(curr_ctx) > 0)
                    curr_ctx->last_had_mem_reclaim = now(CLOCK_MONOTONIC);

Under sanitizers the test can be slow enough that the kernel scans the
test service cgroup at least once between the two acquisitions, which
triggers the failure:

    [ 1898.159455] test-oomd-util[2606]: /* test_oomd_cgroup_context_acquire_and_insert */
    [ 1898.161247] test-oomd-util[2606]: Last pgscan 18446744073709551615 greater than current pgscan 2 for /system.slice/test-oomd-util.service. Using last pgscan of zero.
    [ 1898.161330] test-oomd-util[2606]: src/oom/test-oomd-util.c:322: Assertion failed: Expected "c2->last_had_mem_reclaim == 888u", but 1898161250 != 888

(1898161250 matches the monotonic timestamp of the log line, confirming
that last_had_mem_reclaim was overwritten with now(CLOCK_MONOTONIC).)

The propagation of last_had_mem_reclaim is already covered
deterministically by TEST(oomd_update_cgroup_contexts_between_hashmaps),
which builds OomdCGroupContext structs directly with matching pgscan
values so that oomd_pgscan_rate() returns exactly 0. So just drop the
racy setup and assertion here.

Follow-up for df637ede7b

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

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 15:01:43 +09:00