Commit Graph
45929 Commits
Author SHA1 Message Date
Jan Janssen ec9d3fc51c test: Remove unnecessary test prefix 2023-10-15 12:10:37 +01:00
Frantisek Sumsal abcf59970d core: don't downgrade multi-state settings to boolean
Protect{Home,System,Proc,Subset}= are not booleans, so make sure we use
the intended value instead of just true/false.

See: https://github.com/systemd/systemd/pull/29552
Follow-up to: 79d956d
2023-10-15 14:04:28 +08:00
Zbigniew Jędrzejewski-Szmek 80788a0bd4 shared/pretty-print: drop unused flag
0895e87348 removed the last (only?) use of
CAT_MAIN_FILE_OPTIONAL, except for tests. All callers first check if the main
file exists on their own, so this code was effectively dead.

I want to repopulate the enum in later commits, so a dummy flag is added
to allow the code to compile.
2023-10-14 18:36:10 +02:00
Frantisek Sumsal e97f2dfde4 varlink: drop dead code
'#' is never part of either allowed_chars or allowed_delimiters when we
parse structs/enums.
2023-10-14 17:40:07 +02:00
Frantisek Sumsal a972870ea2 varlink: use int for log level 2023-10-14 17:40:07 +02:00
Frantisek Sumsal 779e7b4410 varlink: don't panic on malformed method definition 2023-10-14 17:40:07 +02:00
Frantisek Sumsal 13de7c7e66 test: add a fuzzer for the varlink IDL stuff 2023-10-14 17:40:07 +02:00
Luca Boccassi da638eb4c9 core: fix deserialization copypasta
CID#1522788
2023-10-14 11:26:57 +01:00
Mike Yuan 8d85efae91 core/exec-invoke: rename parameters of get_fixed_{user,group}
Follow-up for 1c9433559a

The user/group passed in could be either the name or the uid/gid.
2023-10-14 09:09:32 +01:00
Luca Boccassi edc85a02ec Merge pull request #29569 from YHNdnzj/foreach-array
core: use FOREACH_ARRAY more and some other minor changes
2023-10-14 09:08:40 +01:00
Luca Boccassi 0e3986bc1c Merge pull request #29525 from poettering/confext-sysext-multimodal
dissect: make sure we can dissect and inspect DDIs that are both confext *and* sysext
2023-10-14 00:28:47 +01:00
Mike Yuan 06120a1575 core: add MemoryKSM and SetLoginEnvironment to exec_context_dump 2023-10-14 06:41:02 +08:00
Mike Yuan 4520681da1 core/execute: correct alignment 2023-10-14 06:41:01 +08:00
Mike Yuan f7df8adb0c core/execute: use FOREACH_ARRAY more 2023-10-14 06:41:01 +08:00
Mike Yuan 1c2d424e45 core/execute-serialize: use FOREACH_ARRAY more 2023-10-14 06:35:23 +08:00
Lennart Poettering f2c96f0fd3 run: support --scope on old service managers that lack native PIDFD support
Before this we'd fail with a complaint that PIDFDs is not supported by
the service manager. Add some compat support by falling back to classic
numeric PIDs in that case.
2023-10-13 23:16:52 +01:00
Luca Boccassi ccba67f494 Merge pull request #27890 from bluca/executor
core: add systemd-executor binary
2023-10-13 22:01:16 +01:00
Dan Streetman 0f1cb04f9a tpm: update comment on transient handle GetCapability bug in kernel tpm resource manager
Add clarification and link to kernel bug.
2023-10-13 22:17:18 +02:00
Nick Rosbrook 411d8c72ec nspawn: set CoredumpReceive=yes on container's scope when --boot is set
When --boot is set, and --keep-unit is not, set CoredumpReceive=yes on
the scope allocated for the container. When --keep-unit is set, nspawn
does not allocate the container's unit, so the existing unit needs to
configure this setting itself.

Since systemd-nspawn@.service sets --boot and --keep-unit, add
CoredumpReceives=yes to that unit.
2023-10-13 15:28:50 -04:00
Nick Rosbrook a108c43e36 coredump: add support for forwarding coredump to containers
If a process crashes within a container, try and forward the coredump to
that container. To do this, check if the crashing process is in a
different pidns, and if so, find the PID of the namespace leader. We
only proceed with forwarding if that PID belongs to a cgroup that is
descendant of another cgroup with user.delegate=1 and
user.coredump_receive=1 (i.e. Delegate=yes and CoredumpReceive=yes).

If we proceed, attach to the namespaces of the leader, and send the
coredump to systemd-coredump.socket in the container. Before this is
done, we need to translate the PID, UID, and GID, and also re-gather
procfs metadata. Translate the PID, UID, and GID to the perspective of
the container by sending an SCM_CREDENTIALS message over a socket pair
from the original systemd-coredump process, to the process forked in the
container.

If we cannot successfully forward the coredump, fallback to the current
behavior so that there is still a record of the crash on the host.
2023-10-13 15:13:11 -04:00
Nick Rosbrook ade39d9ab8 process-util: introduce namespace_get_leader helper
For a given PID and namespace type, this helper function gives the PID
of the leader of the namespace containing the given PID. Use this in
systemd-coredump instead of using the existing get_mount_namespace_leader.

This helper will be used again in a later commit.
2023-10-13 15:13:11 -04:00
Nick Rosbrook 9764bca98e coredump: store crashing process UID and GID in Context
For convenience, store the crashing process's UID and GID in Context (as
uid_t and gid_t, respectively), as is currently done for the PID. This
means we can just parse the UID/GID once in save_context(), and use
those values in other places.

This is just re-factoring, and is a preparation commit for container
support.
2023-10-13 15:13:11 -04:00
Nick Rosbrook 6cf96ab456 core: add CoredumpReceive= setting
This setting indicates that the given unit wants to receive coredumps
for processes that crash within the cgroup of this unit. This setting
requires that Delegate= is also true, and therefore is only available
where Delegate= is available.

This will be used by systemd-coredump to support forwarding coredumps to
containers.
2023-10-13 15:13:11 -04:00
Nick Rosbrook b426b4eed8 cgroup-util: add cg_is_delegated helper
Take is_delegated from cgroup-show.c, and make it a generic helper
function. This new helper will be used again in a later commit.
2023-10-13 15:13:11 -04:00
Mike Yuan 6906c028e8 core/varlink: make sure we setup non-serialized varlink sockets
Before this PR, if m->varlink_server is not yet set up during
deserialization, we call manager_setup_varlink_server rather than
manager_varlink_init, the former of which doesn't setup varlink
addresses, but only binds to methods. This results in that
newly-added varlink addresses not getting created if deserialization
takes place.

Therefore, let's switch to manager_varlink_init, and add some
sanity checks to it in order to prevent listening on the same
address twice.

Fixes #29373

Replaces #29421
2023-10-12 23:11:56 +01:00
Luca Boccassi f8be60c6d9 Merge pull request #29551 from poettering/no-empty-structs-in-varlink
varlink: properly refuse empty structs/enums in varlink IDL
2023-10-12 23:10:20 +01:00
Lennart Poettering 76641edfa2 varlinkctl: generate slightly more useful error messages 2023-10-12 23:09:30 +01:00
Luca Boccassi 5986e3f4db Merge pull request #29502 from keszybz/sd-boot-config-tweaks
Tweaks to sd-boot UX
2023-10-12 23:08:56 +01:00
Luca Boccassi 75689fb2d4 core: move code from execute.c to exec-invoke.c
No functional changes, only moving code that is only needed in
exec_invoke, and adding new dependencies for seccomp/selinux/apparmor/pam
in meson for the sd-executor binary.
2023-10-12 15:01:51 +01:00
Luca Boccassi bb5232b6a3 core: add systemd-executor binary
Currently we spawn services by forking a child process, doing a bunch
of work, and then exec'ing the service executable.

There are some advantages to this approach:

- quick: we immediately have access to all the enourmous amount of
  state simply by virtue of sharing the memory with the parent
- easy to refactor and add features
- part of the same binary, will never be out of sync

There are however significant drawbacks:

- doing work after fork and before exec is against glibc's supported
  case for several APIs we call
- copy-on-write trap: anytime any memory is touched in either parent
  or child, a copy of that page will be triggered
- memory footprint of the child process will be memory footprint of
  PID1, but using the cgroup memory limits of the unit

The last issue is especially problematic on resource constrained
systems where hard memory caps are enforced and swap is not allowed.
As soon as PID1 is under load, with no page out due to no swap, and a
service with a low MemoryMax= tries to start, hilarity ensues.

Add a new systemd-executor binary, that is able to receive all the
required state via memfd, deserialize it, prepare the appropriate
data structures and call exec_child.

Use posix_spawn which uses CLONE_VM + CLONE_VFORK, to ensure there is
no copy-on-write (same address space will be used, and parent process
will be frozen, until exec).
The sd-executor binary is pinned by FD on startup, so that we can
guarantee there will be no incompatibilities during upgrades.
2023-10-12 15:01:51 +01:00
Luca Boccassi 56df7a461f core: add serialization/deserialization for CGroupContext 2023-10-12 14:57:38 +01:00
Luca Boccassi 73c12fac1b core: add serialization/deserialization for ExecRuntime 2023-10-12 14:57:38 +01:00
Luca Boccassi beb4ae8755 core: add serialization/deserialization for ExecParameters 2023-10-12 14:57:38 +01:00
Luca Boccassi b806a5d35e core: add serialization/deserialization for ExecCommand 2023-10-12 14:56:25 +01:00
Luca Boccassi 5699a1689b core: add serialization/deserialization for ExecContext 2023-10-12 14:56:23 +01:00
Lennart Poettering 5d2ea9b5cf test: add simple test for two common kind of errors 2023-10-12 15:28:06 +02:00
Lennart Poettering efe511e910 varlink: don't generate %m error message if we are synthesizing the error
We are outputting a more useful log message anyway, the "Bad message"
error string is just confusing.
2023-10-12 15:26:27 +02:00
Lennart Poettering 6fa09278b8 varlink: refuse empty () structs/enums
If we encounter an empty struct in the varlink IDL it could also be an
empty enum. Refuse this to avoid the ambiguity.

The spec doesn't cover this case clearly, hence let's better be on the
safe side and refuse it rather than making a decision what it means.
2023-10-12 15:25:16 +02:00
Yu Watanabe 558dc668f6 Merge pull request #29544 from yuwata/network-dhcp-bus-command
network: several fixlets for DBus methods for DHCP client and server
2023-10-12 22:06:50 +09:00
Luca Boccassi c3166b25e2 core: add cgroup_add_or_update_device_allow() 2023-10-12 13:37:22 +01:00
Luca Boccassi 665c6e46e3 serialize: add serialize_image_policy() 2023-10-12 13:37:22 +01:00
Luca Boccassi 81b913f076 serialize: add open_serialization_file() 2023-10-12 13:37:22 +01:00
Luca Boccassi 1b30ccd81b serialize: add serialize_string_set() 2023-10-12 13:37:22 +01:00
Luca Boccassi 5612426d7b serialize: add serialize_item_tristate() 2023-10-12 13:37:22 +01:00
Luca Boccassi 6dae20ec41 serialize: add serialize_item_base64mem() 2023-10-12 13:37:22 +01:00
Luca Boccassi 3f12c5ff2e serialize: add serialize_item_hexmem() 2023-10-12 13:37:22 +01:00
Luca Boccassi b646fc324a core: ensure execute/spawn functions can work without Unit object
When switching to serialization later, the Unit object will not be
serialized, move parameters around instead
2023-10-12 13:37:22 +01:00
Luca Boccassi 154eb43f38 core: ensure execute/spawn functions can work without manager object
When switching to serialization later, the Manager object will not be
serialized, move parameters around instead
2023-10-12 13:37:22 +01:00
Luca Boccassi 97f53fecd6 core: add exec_params_dump helper 2023-10-12 13:37:22 +01:00
Luca Boccassi 6ecdfe7d10 process-util: add posix_spawn helper
This provides CLONE_VM + CLONE_VFORK semantics, so it is useful to
avoid CoW traps and other issues around doing work between fork()
and exec().
2023-10-12 13:37:22 +01:00