Commit Graph

86333 Commits

Author SHA1 Message Date
Michael Vogt
7d3b821797 tree-wide: fix some double word errors like "the the"
By chance (because I had this mistake in my own commit) I noticed
that there are a bunch of duplicated works like "the the" in the
code and man-pages.

This commit fixes them and some similar issues with "and and" etc.

(cherry picked from commit c944af8459)
(cherry picked from commit 43a450377b)
(cherry picked from commit 73da3f8991)
2026-07-24 00:05:26 +01:00
dongshengyuan
7cdeadb723 core: connect to sockets in credential directories
Recursive credential directory loading intentionally
includes socket entries, but load_credential()
only enabled AF_UNIX socket handling for absolute paths.

Let the recursive directory path request socket
connections explicitly, and update the stale comment for directory-fd reads.

Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit 944b160007)
(cherry picked from commit 3b3b4692a8)
(cherry picked from commit 05eb6a7738)
2026-07-24 00:05:26 +01:00
dongshengyuan
8a39dbaf08 dissect: do not follow copy-to directory symlinks
When copying a directory into an image, open an existing destination
with O_NOFOLLOW before passing it to copy_tree_at(). This rejects a
symlink used as the final destination component without a separate
stat-before-use check.

Previously the pre-opened destination followed that symlink. That
allowed --copy-to to be redirected outside the image root when the
image was a directory tree.

If the destination does not exist yet, keep delegating creation to
copy_tree_at(). Real existing directories still use COPY_MERGE through
the opened directory fd.

Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit 4839cb914e)
(cherry picked from commit 2073a33f0d)
(cherry picked from commit 8acfd12985)
2026-07-24 00:05:26 +01:00
countgitmick
f8d0987bc0 logind: set session->started before seat_read_active_vt() call
session_start() calls seat_read_active_vt() before setting
s->started = true. seat_read_active_vt() can reach
seat_triggered_uevents_done() synchronously via:

  seat_active_vt_changed -> seat_set_active -> seat_trigger_devices
  -> seat_triggered_uevents_done

When seat_trigger_devices() produces no pending uevents,
seat_triggered_uevents_done() runs in the same call stack as
session_start() and tests session->started before the assignment
further down. The check fails, session_device_resume_all() is
skipped, and the compositor never receives DRM master.

Set started before seat_read_active_vt() so the gate sees the
correct value, and document the ordering constraint at the call
site to prevent regression.

Reproducible with greetd plus a Wayland compositor on the same VT
on kernel 6.19+.

Fixes: #41562
Signed-off-by: countgitmick <263313427+countgitmick@users.noreply.github.com>
(cherry picked from commit ce043cdfdb)
(cherry picked from commit 94d7796aef)
(cherry picked from commit 5d50717e5e)
2026-07-24 00:05:26 +01:00
dongshengyuan
7dfc8685fe efi-api: validate boot option device path lengths
efi_get_boot_option() validates the overall Boot#### variable size and
the advertised device-path byte count, but then walks each device-path
node without first checking that the node header and subtype payload fit
in the remaining buffer.

A malformed Boot#### variable could make the parser read past the end of
the current node, or past the available device-path data.

Limit parsing to the bytes that are actually present, and stop walking
the device path when a malformed node is encountered. This keeps the
previous best-effort behaviour for fields parsed before the anomaly while
avoiding out-of-bounds reads.

Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit d13b002aec)
(cherry picked from commit a955daf063)
(cherry picked from commit 6cc087b861)
2026-07-23 23:03:24 +01:00
dongshengyuan
1d410b0dc9 dns-rr: invalidate wire format after changing ttl
dns_resource_record_clamp_ttl() may patch the TTL in place when the
record has a single reference. dnssec_fix_rrset_ttl() also updates TTLs
after canonical wire-format data may have been cached.

If a record already has cached wire-format data, that cache still
contains the old TTL and dns_resource_record_to_wire_format() will keep
reusing it.

Add a small helper to clear the cached wire-format state, and use it
whenever the TTL changes. This makes subsequent serialization match the
record fields.

Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit ccae5c7a4f)
(cherry picked from commit b82a9f9f53)
(cherry picked from commit 03e94e2650)
2026-07-23 23:03:24 +01:00
Andres Beltran
ec26a4dd29 tmpfiles: add hardening in glob_item_recursively
(cherry picked from commit 001c5dfdf5)
(cherry picked from commit 872ad58935)
(cherry picked from commit 2e9cf18323)
2026-07-23 23:03:24 +01:00
Luca Boccassi
a94c15302e resolved: honour per-link DNSOverTLS=yes for certificate verification
dnstls_stream_connect_tls() reads the manager-wide dns_over_tls_mode
field directly, so when the global mode was 'no' or 'opportunistic' but
a link was configured with strict DNSOverTLS=yes, the DoT connection
was established without SSL_VERIFY_PEER or hostname/IP checks.
Use dns_server_get_dns_over_tls_mode() which honours the per-link
override.

(cherry picked from commit 052ff5fb5d)
(cherry picked from commit c4e5f003ed)
(cherry picked from commit 0c52e1c221)
2026-07-23 23:03:24 +01:00
Frantisek Sumsal
f7fe1840f1 sd-event: use CLOCK_BOOTTIME for rate limits
When a rate limit is armed, for example via StartLimitInterval=, and the
machine is suspended, the rate limit's "clock" is suspended as well,
since the elapse checks use CLOCK_MONOTONIC. This then causes unexpected
situations where a rate limit armed via StartLimitInterval=1h, followed
by a 10 hour suspend, would elapse after 11 hours total.

Let's avoid this by switching the rate limits to CLOCK_BOOTTIME, which
works the same as CLOCK_MONOTONIC, but accounts for the time spent in
suspend as well.

There's one slight concern when it comes to upgrade path - the old
"begin" value of the rate limit is stored as CLOCK_MONOTONIC, but after
upgrading systemd and serializing/deserializing the state it will be
suddenly compared against now(CLOCK_BOOTTIME), which might cause some
rate limits to elapse "prematurely". But this is just a one-time thing,
after which the rate limit timers should re-assess themselves.

Resolves: #42912
(cherry picked from commit 9ae50c78cc)
(cherry picked from commit 4cff7ce255)
(cherry picked from commit 6089849fa3)
2026-07-23 23:03:24 +01:00
Lương Việt Hoàng
051d1ff96b creds-util: log when we remove a secret from a different machine
(cherry picked from commit 0168b13fb3)
(cherry picked from commit bcabc25eb6)
(cherry picked from commit b6dd7bf087)
2026-07-23 23:03:24 +01:00
Luca Boccassi
e1aa134068 sd-device: check fd validity before using in sendmsg in test
CID#1663676

Follow-up for 7003a9bf09

(cherry picked from commit 7967b6b6d5)
(cherry picked from commit 050ff0d62b)
(cherry picked from commit f4c3c4eef3)
2026-07-23 23:03:24 +01:00
dongshengyuan
3ff82e56fa dns-rr: fix SOA JSON fields
Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit 34a2223344)
(cherry picked from commit dd01b5bd60)
(cherry picked from commit e4ed507d12)
2026-07-23 23:03:24 +01:00
dongshengyuan
49ae87b65a fsck: don't apply invalid mode or repair values
fsck_mode_from_string() and fsck_repair_from_string() return -EINVAL
on a bad value. Store the result in a local variable first, and only
update the global state on success.

Otherwise an invalid value is logged as ignored, but still leaves a
negative enum value behind. In the fsck.repair case that makes
fsck_repair_option_to_string() return NULL and truncates the fsck
command line.

Follow-up for a85428b1d3
Follow-up for 059afcadfd

Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit da9a330dfd)
(cherry picked from commit d51dd5a655)
(cherry picked from commit 015817dffa)
2026-07-23 23:03:24 +01:00
Luca Boccassi
b55eba83d5 sd-bus: voidify bus_match_remove call
It cannot fail, just returns 0 or 1 for not found/found

CID#1663675

(cherry picked from commit 6248f1b774)
(cherry picked from commit fc4658bc0a)
(cherry picked from commit a7f1075706)
2026-07-23 23:03:24 +01:00
Paul Meyer
a23e937f0a gitignore: add .envrc, .direnv
Signed-off-by: Paul Meyer <katexochen0@gmail.com>
(cherry picked from commit 626161a24c)
(cherry picked from commit ac406e3232)
(cherry picked from commit 35d81aa442)
2026-07-23 23:03:24 +01:00
Luca Boccassi
86a8510fcc portable: fix marker_matches_images() and propagate errors correctly
marker_matches_images() was declared to return bool, but several of its
paths return a negative errno (OOM, parse errors, etc.). A negative int
coerces to true, so every such failure was reported as a "match".

Return int with the tristate semantics the callers already expect.

When detaching by image name instead of the original path, path_pick() may
not resolve a concrete path (e.g. a runtime overlay). Keep comparing the
caller-provided image name, and use the picked path only as an additional
canonical match when it exists.

Follow-up for 907952bbc9

(cherry picked from commit c70f09853e)
(cherry picked from commit b8522c506f)
(cherry picked from commit 7d2ab9af48)
2026-07-23 23:03:24 +01:00
Luca Boccassi
b2bdb2a48a journald: replace existing syslog event source before reopening
manager_open_syslog_socket() may be called again with an already open
syslog fd. In that case the old syslog event source still watches the
fd, so adding a new IO source for the same fd fails with -EEXIST and
leaves the old source installed.

Disable and unref the old event source before adding the replacement.
This keeps reopening idempotent and avoids leaving a stale event source
around.

Follow-up for f9a810beda

(cherry picked from commit a77bd724d3)
(cherry picked from commit 138467290f)
(cherry picked from commit 190b21b4e9)
2026-07-23 23:03:23 +01:00
Luca Boccassi
9d2d9b9805 journald: pin the sending client's context across native message dispatch
manager_process_native_message() looks up the sender's ClientContext with
client_context_get(), which does not pin it.

A native message may carry an OBJECT_PID=, which makes
manager_dispatch_message_real() perform a nested client_context_get() for that
PID. On a cache miss this runs client_context_try_shrink_to(), whose pid-flush
branch frees every unpinned cache entry whose PID has already been reaped,
including the borrowed sender context. manager_dispatch_message_real() then keeps
using it (it reads c->uid, and the built iovecs still alias the context's
fields).

Pin the sender context with client_context_acquire() for the duration of the
dispatch and release it afterwards, mirroring what the stdout stream path
already does.

Follow-up for 22e3a02b9d

(cherry picked from commit 0b4a90765c)
(cherry picked from commit 626c57b9ba)
(cherry picked from commit 5899b81cb1)
2026-07-23 23:03:23 +01:00
dongshengyuan
a6abe0a3e4 portable: detect drop-in-only attachments
Commit edea370222 (portable: remove drop-in configs even if the main unit file does not exist)
taught detach to handle leftover .service.d directories
after the main unit symlink was removed.

portable_get_state_internal() still had the same blind
spot: it only considered regular unit entries, so portablectl
is-attached could report detached while a portable drop-in directory was still present.

Handle those drop-in-only entries like detach does, preserve
the existing unit-file based enabled checks when the
main unit file is still present, and add TEST-29 coverage.

Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit a977bf4d06)
(cherry picked from commit 60cba9ebf8)
(cherry picked from commit 05b1275c72)
2026-07-23 23:03:23 +01:00
Vsevolod Kozlov
567c60aad1 sbsign: write unaligned signature size into WIN_CERTIFICATE header
The inclusion of padding bytes in the signature size can lead to the signature
being rejected by strict PKCS7 parsers. Meanwhile, according to [1], the parser
of the WIN_CERTIFICATE structure is expected to round up the value of dwLength
to an 8-byte multiple. This also matches the behaviour of the sbsign tool from
sbsigntools.

Fixes #42884

[1] https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#the-attribute-certificate-table-image-only

Signed-off-by: Vsevolod Kozlov <zaba@mm.st>
(cherry picked from commit 93aadbf968)
(cherry picked from commit 706c4491ce)
(cherry picked from commit 0cca17026a)
2026-07-23 23:03:23 +01:00
dongshengyuan
63dd9c8814 copy: keep replaced target after publish errors
Once link_tmpfile_at() succeeds, the target path
has been published. Avoid unlinking it on later
close or parent fsync failures when COPY_REPLACE
was used, as that can remove the replaced target.

Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit 366fa466d2)
(cherry picked from commit 8201bf6977)
(cherry picked from commit 774c05cf37)
2026-07-23 23:03:23 +01:00
Luca Boccassi
447d803001 resolve: anchor the service browser from mDNS maintenance queries
mdns_maintenance_query() takes a ref on the browser's varlink link but
never installs itself as that link's userdata. dns_query_free() then
unconditionally runs sd_varlink_set_userdata(varlink_request, NULL),
so freeing any maintenance query wipes the browse query's registration
on the shared sb->link slot, disabling the abort paths in
vl_on_disconnect() and dns_service_browser_free(). The maintenance
query also never takes a reference on the DnsServiceBrowser, so a client
disconnect could free the browser while a maintenance query was still
in flight, leaving the per-service schedule_event timer and the raw
service->service_browser back-pointer dangling (use-after-free on the
next timer tick or query completion).

Take a service_browser_request reference instead, matching the browse
query path. dns_query_free() already drops it. The browser now outlives
its in-flight maintenance queries.

Follow-up for 8458b7fb91

(cherry picked from commit 46c15e88e0)
(cherry picked from commit 9e41763ec9)
(cherry picked from commit b428e7bfa1)
2026-07-23 23:03:23 +01:00
Luca Boccassi
21bb745303 udev: clear event back-pointer when freeing a worker
worker_free() did not clear worker->event->worker, leaving an event
that was still attached to a worker pointing at freed memory once the
worker was gone. manager_free() frees the workers (hashmap_free())
before it walks manager->events to process them, and event_free() then
writes event->worker->event = NULL into the already-freed worker.

Clear the back-pointer in worker_free(), mirroring event_free() which
already clears the worker's pointer. The link used to be torn down by
the event_free(worker->event) call in worker_free(), which was dropped
when events became reference counted.

The Event and Worker definitions move to udev-manager.h (next to
Manager) so the unit test can construct and free a bound worker/event
pair.

Follow-up for cb16d47f30

(cherry picked from commit 7eb7d46f97)
(cherry picked from commit 0c65971685)
(cherry picked from commit 98cddfc843)
2026-07-23 22:37:13 +01:00
Luca Boccassi
1be4fd8f66 sd-bus: drop half-registered vtable members on failure
add_object_vtable_internal() inserts BusVTableMember entries into the
global vtable_methods/vtable_properties sets as it walks the vtable, but
only sets node_vtable.node (which gates the disconnect-time cleanup)
after the loop. A failure mid-loop thus left the already-inserted
members behind, dangling once the slot's interface string and the node's
path were freed, so a later registration reading those keys hit a
use-after-free. Remove this slot's members on the fail path.

The test asserts the failed registration leaves no member behind.

Follow-up for 19befb2d5f

(cherry picked from commit b7b1303209)
(cherry picked from commit c6d35bf4cb)
(cherry picked from commit 9d53323d3a)
2026-07-23 22:37:13 +01:00
Luca Boccassi
bb09fd5c30 sd-bus: re-check match_callbacks_modified in the argNhas value loop
The CAN_HASH branch of bus_match_run() that iterates the array values of
an argNhas= match dispatches a callback per value but, unlike the leaf
and manual-iteration branches, does not re-check bus->match_callbacks_modified
afterwards. A callback that adds or removes a match (freeing the node)
would then have the next hashmap_get(node->compare.children, ...) read
freed memory. Add the same check the sibling branches already have.

Follow-up for 198b158f49

(cherry picked from commit 058b0de7bf)
(cherry picked from commit 4a895ab034)
(cherry picked from commit cce8ec6a11)
2026-07-23 22:37:13 +01:00
Luca Boccassi
f8dfbbf092 sd-netlink: disconnect the slot on async/match error paths
netlink_slot_allocate() links the slot into nl->slots and takes an nl
reference, but sd_netlink_call_async() and netlink_add_match_internal()
hold it in a _cleanup_free_, so an error after allocation frees the slot
with a bare free()

Follow-up for ee38400bba

(cherry picked from commit 25c016f472)
(cherry picked from commit c01e2dff1f)
(cherry picked from commit fa16637ce3)
2026-07-23 22:37:13 +01:00
Luca Boccassi
1165ab6215 network: initialize dot_servers before CLEANUP_ARRAY
If dns_resolvers_to_dot_addrs() fails (e.g. OOM) it returns without
assigning *ret_addrs, so the CLEANUP_ARRAY() cleanup would free an
uninitialized dot_servers pointer on the error return.

Follow-up for 3fd6708cde

(cherry picked from commit 9cae6d9c56)
(cherry picked from commit 9d9774050f)
(cherry picked from commit 0b4011e737)
2026-07-23 22:37:13 +01:00
Luca Boccassi
7ff8c920ca udev: track remaining buffer size across $links devlinks
FORMAT_SUBST_LINKS passes the same 'l' (remaining size) to strpcpy for
each devlink and discards the returned remaining value, so the cursor
advances while the bound stays at the full size, overflowing dest.
Capture the return value.

Follow-up for f6caab8995

(cherry picked from commit a8d8009b7a)
(cherry picked from commit 16b5fcfa0d)
(cherry picked from commit 2f16f12239)
2026-07-23 22:37:13 +01:00
Luca Boccassi
0c2f60810a sd-device: avoid 32-bit overflow in the monitor properties bounds check
"properties_off + 32 > n" is evaluated in 32-bit arithmetic, so a
properties_off near UINT32_MAX wraps but passes the check.

Follow-up for efbd4b3ca8

(cherry picked from commit 7003a9bf09)
(cherry picked from commit 10bc41033c)
(cherry picked from commit 5a7c47293b)
2026-07-23 22:37:13 +01:00
Luca Boccassi
1732130f78 hashmap: honor the value destructor in set_ensure_consume()
Sets store their element in the key slot but use a value destructor
(DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR). On the reject/duplicate path
set_ensure_consume() only checked free_key and otherwise called free().

Follow-up for fcc1d0315d

(cherry picked from commit 87e57c52c1)
(cherry picked from commit 99d7c6743a)
(cherry picked from commit 9323c93384)
2026-07-23 22:37:13 +01:00
Luca Boccassi
e2703f4eab sd-device: bound the tag filter BPF program size
The tag-match loop emits 6 instructions per tag into a fixed 512-entry
stack array without a bounds check (unlike the subsystem loop below),
so enough tags overflow the stack. Refuse with -E2BIG instead.

Follow-up for b1c097af8d

(cherry picked from commit 2f72db10d9)
(cherry picked from commit 5867697d6e)
(cherry picked from commit 6986776982)
2026-07-23 22:37:13 +01:00
Luca Boccassi
225b29b996 logind: drop the seat from the GC queue after draining its devices
manager_gc() pops a seat off m->seat_gc_queue and clears
seat->in_gc_queue before calling seat_free(). seat_free() then drains
the seat's devices, and device_detach() calls seat_add_to_gc_queue() for
a seat that just lost its last master device, re-prepending the dying
seat onto m->seat_gc_queue. seat_free() removed itself from the queue up
front, before that drain, so the re-queued seat is left on the queue as a
dangling pointer once mfree() runs.

Follow-up for 718d006a63

(cherry picked from commit 166d46eb2e)
(cherry picked from commit 0826a4a15d)
(cherry picked from commit fcb04d51b0)
2026-07-23 22:37:13 +01:00
Luca Boccassi
381d615947 logind: cancel long-press timers when the Button is freed
The four *_long_press_event_source timers are Manager-scoped but armed
by start_long_press() with the specific Button that started the press as
their userdata. button_free() unrefs only the Button's own io and check
event sources, never these timers. If the input device backing the
Button is unplugged while a long press is in progress,
manager_process_button_device()'s REMOVE branch calls button_free() and
the still-armed timer fires up to LONG_PRESS_DURATION (5s) later,
dereferencing the freed Button as userdata (b->manager, b->seat).

Cancel each long-press timer the Button owns (matched by userdata) in
button_free().
Also unref all four sources in manager_free() instead of just the reboot
one, for symmetry at daemon teardown.

Follow-up for 952b26c75d

(cherry picked from commit a8b429387a)
(cherry picked from commit d65875951e)
(cherry picked from commit 8c09b0d619)
2026-07-23 22:37:13 +01:00
Luca Boccassi
ae04872e73 logind: don't free live SessionDevice on duplicate TakeDevice
method_take_device() declares its local with
_cleanup_(session_device_freep), but the "device already taken" check
assigns a borrowed hashmap pointer to it and returns immediately:

    sd = hashmap_get(s->devices, &dev);
    if (sd)
            return sd_bus_error_set(error, BUS_ERROR_DEVICE_IS_TAKEN, ...);

On that return the cleanup attribute runs session_device_free() on the
still-live entry that s->devices continues to own and use.
A subsequent ReleaseDevice then fails with BUS_ERROR_DEVICE_NOT_TAKEN
and the caller is left holding a revoked fd.

Follow-up for 360179ea46

(cherry picked from commit 8e70913fc1)
(cherry picked from commit b6a6963e78)
(cherry picked from commit 0018cd99f3)
2026-07-23 22:37:13 +01:00
Luca Boccassi
31415cc948 boot: require a minimum PE optional header size in verify_pe()
verify_pe() only checked SizeOfOptionalHeader against a SIZE_MAX wrap (a
clause that, given SizeOfOptionalHeader is a uint16_t, can never reject
anything) and never read NumberOfRvaAndSizes. But pe_kernel_info(),
pe_kernel_check_nx_compat() and pe_kernel_check_no_relocation() then read
SizeOfImage, AddressOfEntryPoint, DllCharacteristics and the base
relocation data directory entry from the optional header.

Require SizeOfOptionalHeader to be large enough to contain everything down
to the base relocation data directory entry, and require the image to
declare that many data directory entries.

Follow-up for bacc2ed0d5

(cherry picked from commit 918e8f9dd9)
(cherry picked from commit 40467642bd)
(cherry picked from commit e1e7bc081a)
2026-07-23 22:37:13 +01:00
Luca Boccassi
fd3987a70b boot: restore parent loaded image when initrd registration fails
linux_exec() patches the stub's own EFI_LOADED_IMAGE_PROTOCOL to point
at the loaded inner kernel, and restores the saved original only after
the entry point returns. The initrd_register() failure path returns
without restoring, leaving the firmware's protocol pointing to freed
data.

Follow-up for f405165065

(cherry picked from commit baad1744bd)
(cherry picked from commit b16364d0df)
(cherry picked from commit 9e6be8efb5)
2026-07-23 22:37:13 +01:00
Luca Boccassi
7efd2892a8 boot: restore RW/RO memory attributes on every error
linux_exec() marks code sections RO+X for W^X and reverts them to RW+NX
in a loop just before returning, because EDK2 requires freed buffers to
be writable and non-executable or FreePages() crashes. Not every error
path is currently covered. Switch to a _cleanup_ helper so that every
return path is covered.

Follow-up for 56d19b633d

(cherry picked from commit ba0c1c617e)
(cherry picked from commit b2644bfe8f)
(cherry picked from commit 4ab3d11366)
2026-07-23 22:36:22 +01:00
Luca Boccassi
ea6617cd58 boot: check PE section against SizeOfImage
pe_locate_sections_internal() stores each matching section's VirtualSize
and VirtualAddress into PeSectionVector.memory_size/memory_offset with
only SIZE_MAX overflow guards, never checking them against the image's
SizeOfImage.

Wire up the image's SizeOfImage down to pe_locate_sections_internal()
and skip any section whose in-memory section does not fit within it.

Follow-up for fb974ac485

(cherry picked from commit dc55e4a5a0)
(cherry picked from commit 23741dcd57)
(cherry picked from commit f8d58afbe4)
2026-07-23 22:36:21 +01:00
Luca Boccassi
42e5b6d004 boot: bound PE section VirtualSize before zeroing the inner kernel
The inner-kernel section loader checks VirtualAddress + SizeOfRawData
against kernel_size_in_memory (for the memcpy), but the memzero right
after it clears up to VirtualAddress + VirtualSize, and VirtualSize is
only constrained to be >= SizeOfRawData.

Reject a VirtualAddress + VirtualSize that overflows or exceeds
kernel_size_in_memory, mirroring the existing SizeOfRawData checks.

Follow-up for cab9c7b5a4

(cherry picked from commit feeba8fa3b)
(cherry picked from commit 0f3dd7ab02)
(cherry picked from commit 2889746af2)
2026-07-23 22:34:28 +01:00
Luca Boccassi
5a569c49b2 boot: reject inner kernel entry point outside the image
pe_kernel_info() returned AddressOfEntryPoint (and the .compat section
entry_point) straight from the PE header with no check against
SizeOfImage. Since cab9c7b5a4 the stub calls the inner kernel directly
as ImageBase + entry_point, and only EFI_SIZE_TO_PAGES(SizeOfImage) pages
are allocated for it.

Follow-up for cab9c7b5a4

(cherry picked from commit ecf3f5056a)
(cherry picked from commit 1dbedeef33)
(cherry picked from commit a10dd5d8df)
2026-07-23 22:34:28 +01:00
Luca Boccassi
b203203576 boot: initialize return parameters on zero-length EFI variable read
When a variable exists but is empty, the initial size-query
GetVariable() in efivar_get_raw_full() returns EFI_SUCCESS instead of
EFI_BUFFER_TOO_SMALL: the zero-length payload already "fits" the
zero-length query buffer. The helper returns success, but does not
initialize the return parameters.
Handle a couple of corner cases by checking the return size.

Follow-up for a409607489

(cherry picked from commit 7b7599b72d)
(cherry picked from commit 3b32f046f0)
(cherry picked from commit 839c05df2a)
2026-07-23 22:33:27 +01:00
Luca Boccassi
e81c0803ce boot: make device_path_next_node() robust against malformed zero-length nodes
device_path_next_node() advances by the current node's Length field,
which per the EFI device path protocol includes the 4-byte node header;
a well-formed node is therefore at least sizeof(EFI_DEVICE_PATH) bytes
long. A malformed node with Length < sizeof(EFI_DEVICE_PATH), in
particular Length == 0, makes the helper return its input pointer
unchanged.

Advance by at least sizeof(EFI_DEVICE_PATH).

Follow-up for 5080a60a71

(cherry picked from commit 3bcd707d56)
(cherry picked from commit e62dc3e2bf)
(cherry picked from commit 8a15789c04)
2026-07-23 22:33:27 +01:00
Zbigniew Jędrzejewski-Szmek
b1f0736d8d test-socket-util: convert to new ASSERT macros
Replace assert_se() with the typed ASSERT_* macros throughout, matching
the conversions done across the rest of src/test/.

(cherry picked from commit 713a2cf79c)
(cherry picked from commit 0b59b1bd1f)
(cherry picked from commit 6e40ff10b9)
2026-07-23 22:33:26 +01:00
Luca Boccassi
b112ea86c2 boot: reject GPT headers with SizeOfPartitionEntry below the minimum
Commit 0cf5f816f2 replaced the original lower-bound check

    if (h->SizeOfPartitionEntry < sizeof(EFI_PARTITION_ENTRY))
            return false;

with a multiple-of check

    if ((h->SizeOfPartitionEntry % sizeof(EFI_PARTITION_ENTRY)) != 0)
            return false;

to additionally require the entry size to be a multiple of 128. The
modulo test is however also satisfied by SizeOfPartitionEntry == 0, so a
GPT header advertising a zero entry size now passes verify_gpt().

Restore the lower bound in addition to the multiple-of check, so the
entry size must be at least sizeof(EFI_PARTITION_ENTRY) and a multiple of
it (128 bytes).

Follow-up for 0cf5f816f2

(cherry picked from commit d06d8a232b)
(cherry picked from commit e233936dbc)
(cherry picked from commit 9dfd1cdfc3)
2026-07-23 22:32:19 +01:00
Luca Boccassi
93bf2fd1f5 machined: drop superfluos 'supervisor' varlink input parameter for register method
The supervisor is derived from the caller's socket in D-Bus, and it is
not an input parameter. Do the same in varlink.

Follow-up for 97754cd14d

(cherry picked from commit b7769aa34e)
(cherry picked from commit 8eb162df81)
(cherry picked from commit 51f9f9f6d7)
2026-07-23 22:32:19 +01:00
Luca Boccassi
51b8557157 calendarspec: warn on weekday/date conflict in systemd-analyze and systemd-run
When a fixed date (e.g. 2027-01-01) is paired with a weekday constraint
(e.g. Thu) that does not match, the timer silently never elapses.

Add calendar_spec_from_string_full(..., warn_on_weekday_mismatch) so
user-facing tools can opt in to a log_warning() at parse time:
- systemd-analyze calendar: uses _full(true)
- systemd-run --on-calendar: uses _full(true)
- .timer OnCalendar=: uses log_syntax() with file/line context

Add test_calendar_spec_weekday_conflict(): forks a child with stderr
captured in a memfd via pidref_safe_fork_full(), verifies the warning
is emitted for conflicting specs and suppressed for valid ones.

Fixes: #40350
Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit 21de611f69)
(cherry picked from commit 0cb4245755)
(cherry picked from commit 48cb20ec77)
2026-07-23 22:32:19 +01:00
Frantisek Sumsal
764330ce0c test: ignore fails when the formatted timezone differs from the current one
When formatting a timestamp the C API takes into account historical data
from tzdata, so it returns a date strings with a historically-correct
timezone abbreviation. However, tzname[] doesn't do this and it returns
the most recent abbreviation for the given zone.

For example, according to tzdata America/Cancun switched from EST/EDT to
CST/CDT on 1998-08-02:

Zone America/Cancun     -5:47:04 -      LMT     1922 Jan  1  6:00u
                        -6:00   -       CST     1981 Dec 26  2:00
                        -5:00   -       EST     1983 Jan  4  0:00
                        -6:00   Mexico  C%sT    1997 Oct 26  2:00
                        -5:00   Mexico  E%sT    1998 Aug  2  2:00
                        -6:00   Mexico  C%sT    2015 Feb  1  2:00
                        -5:00   -       EST

So, formatting a timestamp from this time will yield a string with the
EDT timezone:

$ TZ=America/Cancun date -d "@902035565"
Sun Aug  2 01:26:05 EDT 1998

But using tzname[] (or strptime %z) shows the most recent data, where
America/Cancun uses EST (and doesn't use DST anymore, hence
tzname[1]=CDT that glibc remembers from the previous zone epoch):

$ TZ=America/Cancun ./tz
{EST, CDT}

This means that when we parse the formatted timestamp back we don't use
the historical timezone data, so we might end up with a different
offset:

TZ=America/Cancun, tzname[0]=EST, tzname[1]=CDT
@902035565603993 → Sun 1998-08-02 01:26:05 EDT → @902039165000000 → Sun 1998-08-02 01:26:05 CDT
src/test/test-time-util.c:452: Assertion failed: Expected "ignore" to be true
Aborted                    (core dumped) build-local/test-time-util

Instead of adding exceptions for every single timezone that switched
between different offsets in the past, let's address this a bit more
generally and skip the check if the parsed timezone doesn't match any of
the current timezones - this still keeps the check that the time
difference in such case is exactly one hour, so its effect should be
limited mostly to DST-related changes.

Resolves: #37684
(cherry picked from commit 7273d38335)
(cherry picked from commit 387df32dc2)
(cherry picked from commit 971b7789a9)
2026-07-23 22:32:19 +01:00
Yu Watanabe
1578c62ec8 bless-boot: avoid false maybe-uninitialized warning
Obserbed with GCC-11 on Ubuntu.
```
In file included from ../src/shared/format-table.h:7,
                 from ../src/bless-boot/bless-boot.c:11:
../src/bless-boot/bless-boot.c: In function ‘verb_set’:
../src/basic/log.h:187:27: error: ‘source2’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  187 |                         ? log_internal(_level, _e, PROJECT_FILE, __LINE__, __func__, __VA_ARGS__) \
      |                           ^~~~~~~~~~~~
../src/bless-boot/bless-boot.c:458:40: note: ‘source2’ was declared here
  458 |         const char *target, *source1, *source2;
      |                                        ^~~~~~~
In file included from ../src/shared/format-table.h:7,
                 from ../src/bless-boot/bless-boot.c:11:
../src/basic/log.h:187:27: error: ‘source1’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  187 |                         ? log_internal(_level, _e, PROJECT_FILE, __LINE__, __func__, __VA_ARGS__) \
      |                           ^~~~~~~~~~~~
../src/bless-boot/bless-boot.c:458:30: note: ‘source1’ was declared here
  458 |         const char *target, *source1, *source2;
      |                              ^~~~~~~
In file included from ../src/shared/format-table.h:7,
                 from ../src/bless-boot/bless-boot.c:11:
../src/basic/log.h:187:27: error: ‘target’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  187 |                         ? log_internal(_level, _e, PROJECT_FILE, __LINE__, __func__, __VA_ARGS__) \
      |                           ^~~~~~~~~~~~
../src/bless-boot/bless-boot.c:458:21: note: ‘target’ was declared here
  458 |         const char *target, *source1, *source2;
      |                     ^~~~~~
cc1: all warnings being treated as errors
```

(cherry picked from commit d04423c870)
(cherry picked from commit 4f5dcef65d)
(cherry picked from commit 757517410b)
2026-07-23 22:32:14 +01:00
Yu Watanabe
f1e06e330a resolve: fix segfault when built with OPENSSL_NO_DEPRECATED_3_0
In that case, deprecated funcdions are not loaded from libcrypto.so,
and calling them causes segfault.

(cherry picked from commit 6268b094eb)
(cherry picked from commit a035cb3445)
(cherry picked from commit b3d0887d56)
2026-07-23 22:32:14 +01:00
dongshengyuan
2bc5ca0b56 coredumpctl: use break instead of continue for time bound checks
When iterating journal entries with --until (forward scan) or --since
(reverse scan), the code used continue instead of break after crossing
the time boundary.

Since sd_journal_seek_realtime_usec() is called before the loop to
position at the start of the range, sd_journal_next()/previous()
returns entries in monotonically increasing/decreasing time order.
Once an entry's timestamp exceeds arg_until (or falls below arg_since
in reverse), all subsequent entries will also be out of range.

Using continue caused the entire remaining journal to be scanned
unnecessarily. journalctl uses break for the identical pattern in
src/journal/journalctl-show.c.

Fixes: #42808
Signed-off-by: dongshengyuan <dongshengyuan@uniontech.com>
(cherry picked from commit bd1bb49ffa)
(cherry picked from commit 1f720ac2dd)
(cherry picked from commit 007ef4ea89)
2026-07-23 22:32:14 +01:00