Commit Graph
91369 Commits
Author SHA1 Message Date
Jörg Behrmann 7824cc524d NEWS: IEC prefixes are binary 2026-08-26 10:56:12 +02:00
Jörg Behrmann e88adcdd2b NEWS: mark --introspect-cli as experimental 2026-08-26 10:51:53 +02:00
Zbigniew Jędrzejewski-Szmek 9843b23141 tar-util: several fixlets for tar_x/tar_c() (#43522) 2026-08-26 10:20:50 +02:00
Yu Watanabe 10adafa358 test-tar: log failure in loading libarchive on LOG_ERR
Other failures are logged on LOG_ERR.
2026-08-26 08:20:34 +09:00
Yu Watanabe 1e615d7e4e import: missing dlopen_libacl() before fork
tar_x() and tar_c() may use libacl. Hence, libacl should be loaded
before fork.
2026-08-26 08:20:34 +09:00
Yu Watanabe 06318e7b98 tar-util: add missing dlopen libarchive
Otherwise, if the library is not loaded yet, these functions will fail.

Note, currently, all callers of tar_x/tar_c() load libarchive before
calling them. So, this should not change any behavior. Just for safety
and following our usual coding style.
2026-08-26 08:20:34 +09:00
Yu Watanabe 32798431dd tar-util: do not call open_inode_done() twice on failure
Previously, if open_inode_finalize() for an object was failed, the number
count was not decremented, hence open_inode_done() is called twice for
the object: once in the failed open_inode_finalize(), and once in the
open_inode_free_array() invoked by the cleanup attribute.

Note, with the previous commit, open_inode_done() is idempotent. Hence,
calling open_inode_done() twice (or more) for the same object is
harmless. Just for safety.
2026-08-26 08:20:33 +09:00
Yu Watanabe 25d7cdc9f5 tar-util: clear xattrs and acls in open_inode_done()
Otherwise, if it is called multiple times for an object, then the
xattrs and acls may be freed multiple times.
2026-08-26 08:19:44 +09:00
Srijan KeshriandRobin Richard Rajan 4d6cea8de6 hwdb: stop lid open toggling airplane mode on HP ENVY x360 Convertible 13 (#43521)
The embedded controller on the HP ENVY x360 Convertible 13 emits atkbd
scancode e057 on every lid open. The generic HP block maps e057 to
KEY_WLAN, which desktop environments bind to the airplane-mode action, so
opening the lid switches off every radio. There is no physical key on this
machine that emits e057, it only ever arrives from the lid.

This is the same firmware behavior already quirked for the HP Spectre
x360 Convertible ("Prevents random airplane mode activation") and the HP
Pavilion Gaming 15-dk1 ("lid keys").

Add the property to the existing ENVY x360 13 record rather than to the
Spectre d7 block. The match line for this model already appears further
down the file, so duplicating it there is rejected by parse-hwdb.

e058 is emitted on lid close but carries no keycode in the generic HP
block, so it is already inert and is left alone here.

Replaces #43495.
Closes #43494.

Co-authored-by: Robin Richard Rajan <robinrichardrajan@gmail.com>
2026-08-26 05:40:36 +09:00
Luca Boccassi 1aec3dfbef NEWS: update up to b6c432be08 2026-08-25 19:27:50 +01:00
Zbigniew Jędrzejewski-Szmek b6c432be08 meson: drop deprecated options (#43410)
The meson option -Dlibiptc= was deprecated in v259. Other options were
deprecated in v260.
2026-08-25 18:33:55 +02:00
Victor Verdan 03596afe7d hwdb: mark Hangsheng R75 QMK as not a joystick (#43513)
The Hangsheng R75 QMK keyboard (USB 342d:e483) exposes a System
Control interface with ABS capabilities. input_id consequently
classifies the interface as a joystick and sets ID_INPUT_JOYSTICK=1.

This makes desktop environments such as KDE Plasma expose the
keyboard as a game controller.

Setting ID_INPUT_JOYSTICK=0 for this device fixes the classification
while preserving its keyboard, consumer control and system control
functionality.

Affected modalias:
input:b0003v342DpE483e0111-e0,1,3,4,k74,8A,8B,8E,8F,94,AE,E3,F8,161,164,198,1B6,24E,24F,ra10,11,28,m4,lsfw
2026-08-26 01:23:35 +09:00
Zbigniew Jędrzejewski-Szmek dc39dc759b Pressure metrics (#43377)
This adds a slightly extended and improved version of the patch we had
internally.
2026-08-25 14:45:16 +02:00
Parag Gupta 3bc5914676 shell-completion: zsh: complete options for systemctl show
zsh only ever offered unit names after `systemctl show`, since
_systemctl_show() was sharing the same completion function as
is-active/status/preset/etc., none of which recognize `-`-prefixed
words at all. This meant `systemctl show --<TAB>` and
`systemctl show --property <TAB>` produced no completions, even
though the same options complete fine before the subcommand word
(bash has always completed both cases correctly).

Give `show` its own completion function that first tries the
existing global option specs (now pulled out into a `_sys_arguments`
array so they can be reused) via _arguments, falling back to unit
name completion for everything else. The unit-name fallback is
factored into a shared _systemctl_non_template_units() helper so it
isn't duplicated between _systemctl_show() and the existing
NONTEMPLATE_UNITS loop.

While doing so, fix pre-existing bugs in that option list which this
change makes newly reachable (and, for the filters below, newly
relevant) after `show`:

- `-P` was documented as a bare `--privileged[Acquire privileges
  before execution]` flag, which systemctl does not have. `-P NAME`
  is actually short-only and equivalent to `--value --property=NAME`
  (src/systemctl/systemctl.c); it now completes property names the
  same way `-p`/`--property` do, and is grouped next to them instead
  of sitting in `--privileged`'s old, unrelated slot.
- `-p`/`--property`, `-t`/`--type`, and `--state` all lacked the `*`
  repeatability prefix, so completion stopped offering each after its
  first use even though systemctl accumulates all three
  (parse_property_argument()/parse_types_argument()/
  parse_states_argument(), all via strv_consume()). `_loginctl`
  already uses the correct `'*'{-p+,--property=}...` form for -p.
  -t/--type and --state are both documented as filters that apply to
  `show` specifically (man/systemctl.xml), same as -p/--property.
- `--value`, documented specifically for `show` ("When showing
  properties, only print the value"), was missing from the zsh
  completion entirely, though bash already completes it.
- `-M`/`--machine=` (OPTION_COMMON_MACHINE) was likewise missing,
  despite directly affecting `show`'s bus transport the same way the
  already-present `-H`/`--host` does; `_loginctl`/`_busctl` already
  have the matching `_sd_machines`-backed spec.

Also switch both `_arguments` call sites to splice `_sys_arguments`
as `"$_sys_arguments[@]"` rather than bare, matching the prevailing
quoted-array idiom used by five other completions in this directory
(_systemd-hwdb, _userdbctl, _systemd-id128, _updatectl,
_systemd-sysupdate) and avoiding the unquoted form's behavior of
silently eliding any element that becomes empty.

Fixes #37463
2026-08-25 10:22:01 +01:00
Zbigniew Jędrzejewski-Szmek 68e1f67b36 Another batch of conversions to COMMAND structures and additions of --introspect-cli (#43503)
This time, various commands with non-trivial requirements are handled.
So the series is shorter, but has a pattern of feature additions and
then those new features being used. The way that --help output is
formatted is changed a bit in various places. Those changes are
described in individual commits.

22 'static int help()' functions left after this.
2026-08-25 11:04:22 +02:00
Zbigniew Jędrzejewski-Szmek f976133dbf mount: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added.

Options are now in two groups: "Common options" and Mount options". In
--help, for systemd-mount, both groups are shown. For systemd-umount, only
the first. This changes the behaviour a bit: previously, both groups were
shown together as one list. I think the new behaviour is actually a bit
better, because it makes it easier for the user to figure out that the
commands share common options and one of the commands has its private
second group. But if people think that the previous behaviour should
be restored, we could add a display options to squish the groups back
together.

--help now goes through the pager, like other commands with --no-pager.
2026-08-25 09:36:33 +02:00
Zbigniew Jędrzejewski-Szmek 5f45122e75 shared/verbs: allow commands to filter option groups
So far, option groups were only used for display: when parsing options,
the group markers were ignored and all options within a namespace were
considered as potential matches. The group was reported in introspection
data and used as section seperator in help display. To allow a single
option namespace to be used for two commands, pipe through a nulstr with
option group names to look at when parsing options. The field is set in
the Command description and used in various option-handling contexts:
- when parsing and looking for an option, do not consider the entries
  that are in the group that is not listed in the nulstr,
- when listing options in help or introspection, skip over unlisted
  groups.

The verbs_find_verb and verbs_find_command helpers are adjusted to have
a consistent interface.
2026-08-25 09:33:59 +02:00
Zbigniew Jędrzejewski-Szmek dfe557dc7c sysext: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. --help now goes through the pager, like other
commands with --no-pager.

Also, previously, -h/--help/--version were listed in the "Commands"
section. This was cute, but recreating this in the new scheme would
be complicated. Also, it seems unnecessary. --help/--version and some
other commands terminate the program in all binaries, so they could
be considered "commands" in all cases. But we printed them together
with verbs only in a few cases. So I think it's fine to move them
back to the "Options" section. This makes the description of options
much more consistent between different programs.
2026-08-25 09:33:58 +02:00
Zbigniew Jędrzejewski-Szmek b62d32c7b5 shared/verbs: add concept of "shared verbs"
This allows commands like systemd-sysext + systemd-confext to be handled
without duplicating entries in the verbs table. The basic idea is to have
the following layout in the SYSTEMD_VERBS section:

  VERB_COMMAND_MARKER → "systemd-sysext", .flags = COMMAND_VERBS_SHARED
  VERB_COMMAND_MARKER → "systemd-confext", .flags = COMMAND_VERBS_SHARED
  VERB("status"),
  VERB("merge"),
  ...

And then in places where we want to work on the verbs, we skip over the
verb entries with VERB_COMMAND_MARKER and COMMAND_VERBS_SHARED flag set.
2026-08-25 09:33:53 +02:00
Zbigniew Jędrzejewski-Szmek 2b4c6dda9d kernel-install: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The note about invocation as 'installkernel' is
kept as the footer. Verb and option column widths are kept separate, since
the verb table is very wide. --help now goes through the pager, like other
commands with --no-pager.

A separate COMMAND block is included for installkernel, but it is only
used for introspection data.
2026-08-25 09:33:52 +02:00
Zbigniew Jędrzejewski-Szmek 2364f0d7c8 systemctl: describe the halt/poweroff/reboot/shutdown compat commands
The custom halt_help() and shutdown_help() are replaced by COMMAND()
descriptions (one per command name, halt/poweroff/reboot sharing the
"halt" option namespace), and --introspect-cli is added to both parsers.
halt/poweroff/reboot now each reference their own man page name.
2026-08-25 09:33:51 +02:00
Paul Menzel ebe4dbf426 journal: log the error that made a journal file unusable
journal_file_open_reliably() recovers from nine distinct errors, but the
warning it emits names none of them:

  systemd-journald[47980]: File /var/log/journal/95790226b8d0779f4b4797314ca986d4/user-7736.journal corrupted or uncleanly shut down, renaming and replacing.

So an administrator cannot tell an unclean journald shutdown (-EBUSY)
from real corruption (-EBADMSG), an incompatible feature flag
(-EPROTONOSUPPORT) or a failing disk (-EIO) — all of which reach this
line. The reason is known at this point, but only reachable through the
log_debug_errno() calls in journal_file_verify_header(), which are off by
default and gone by the time the warning is noticed.

Append %m so the error is part of the message. It now reads

  File /run/log/journal/…/user-7736.journal corrupted or uncleanly shut down, renaming and replacing: Device or resource busy

for a file left online by an unclean journald exit, and

  … renaming and replacing: No data available

for a truncated one.
2026-08-25 10:48:49 +09:00
Martin Pitt b8bcae41ac ukify: add naming a certificate created by genkey
Image builds create a key separate from the SecureBoot one for verity
signing. Its certificate ships inside the image as the sysext trust
anchor.

`genkey` certs had a hardcoded "SecureBoot signing key on host <fqdn of
the build machine>" CN, which describes neither that verity role nor a
meaningful hostname.

Make that name configurable with `SecureBootCertificateCommonName=`,
like mkosi's `--genkey-common-name`. That allows image build tools to
re-use `ukify genkey` for non-SB keys.

Unlike the implicit truncation for the default name, a specified one
which is too long is an error. Add a citation where that limit comes
frm.
2026-08-25 07:22:47 +09:00
Yu Watanabe 2d31e784f1 vconsole: allow to control font scaling
This adds FONT_SCALE= setting in vconsole.conf,
vconsole.font_scale= kernel command line option and credential support.
When 2 or 200% is specified, the console font size will be doubled.

Closes #43273.
2026-08-25 06:58:06 +09:00
dongshengyuan 471e34d5cb homectl: write recovery key file via linkable tmpfile
Create the file with open_tmpfile_linkable_at().
Write the recovery key and trailing newline to the temporary fd.
Set the final mode to 0600 before publishing it.
Link it into place with link_tmpfile_at(..., LINK_TMPFILE_SYNC).
2026-08-25 06:57:32 +09:00
Zbigniew Jędrzejewski-Szmek 27f63ef988 basic/procfs-util: make procfs_cpu_get_ticks lenient again
In review it was raised that the file is often synthesized and that this
synthetization might not include all the fields, let's allow the more
recently added fields to be missing to avoid a regression in
compatibility.
2026-08-24 23:56:06 +02:00
Zbigniew Jędrzejewski-Szmek 65ba2ff4a7 report-basic: add idle/iowait/steal as CPUWait family
As discussed in the PR, those fields can go down, so they cannot be advertised
as type COUNTER. But the type is shared for the whole family, so we need to
create a new family to keep the other ones as COUNTER and add the new ones
as GAUGE.

kernel/sched/cputime.c says above get_cpu_idle_time_us() and get_cpu_iowait_time_us():
> Note that this is partially broken due to the counter of iowait tasks that
> can be remotely updated without any synchronization. Therefore it is possible
> to observe backward values within two consecutive reads.

steal is apparently also unreliable because it is reported by the hyperviser.
So let's be cautious and report it as gauge too.
2026-08-24 23:56:06 +02:00
Zbigniew Jędrzejewski-Szmek b8cc2ef04b report-basic: cpu, memory, pressure, and disk metrics
Extend the io.systemd.Basic metric families with host-level runtime
metrics: cumulative per-state CPU seconds, memory in use (MemTotal minus
MemAvailable), swap in use, the kernel's 10s pressure stall averages
(cpu/memory/io x some/full). Partitions and stacked devices are excluded
from the disk counters, since their traffic is already accounted for in
the parent device.

Also extend the TEST-74 report subtest with checks for the new metrics.

Network metrics are not added, because the service runs with
PrivateNetwork=yes, and it doesn't make sense to report stats for 'lo'.

After some back-and-forth, I settled on "CPUUsage". We use this scheme of
capitalization in other metric family names: "IPv4Public", "IPv6Public",
IPv4AddressState", "IPv6AddressState", "OSRelease" "SMBIOS" "BootID",
"CPUsOnline", "MachineID", "MachineInfo", "OSRelease",
"SMBIOS.SystemManufacturer", "TPM2.Manufacturer", "TPM2.VendorString",
"IOReadBytes", "IOReadOperations", "CGroup". The exception is
"io.systemd.cgroup.CpuUsage". I think we should treat that one as a
mistake and consider changing it to conform.
2026-08-24 23:56:06 +02:00
Yu Watanabe 3f72568682 varlink: introduce io.systemd.service.GetLogLevel (#43484)
...and use it to implement `log-level` in `resolvectl`.
2026-08-25 05:44:16 +09:00
Zbigniew Jędrzejewski-Szmek 2e18587872 shared/blockdev-list: allow uninitalized devices
This means we can gather stats without udev running, which can be good
in containers and such.
2026-08-24 21:24:04 +02:00
Zbigniew Jędrzejewski-Szmek 47df51ea40 shared/blockdev-list: add flag to gather read&write stats 2026-08-24 21:24:00 +02:00
Nick Rosbrook cf31d92de3 resolvectl: implement log-level with varlink methods 2026-08-24 13:32:42 -04:00
Nick Rosbrook 071f10991c shared: add varlink_{get,set}_log_level_string helpers to verb-log-control.c
Most of the time, the CLI tools that will use this helper are dealing
with the string representation of log levels, so just add string-based
helpers for now.
2026-08-24 13:32:42 -04:00
Nick Rosbrook 0420097525 varlink: introduce io.systemd.service.GetLogLevel
We already have io.systemd.service.SetLogLevel. Add a getter so that
CLI tools with `log-level` subcommands can be more easily implemented
with varlink.

Bind this method to all services that already bind io.systemd.service.SetLogLevel.
2026-08-24 11:54:44 -04:00
Lennart Poettering 52d2fe7d83 dissect-image: tighten error path a bit
When we set up a device with LUKS or verity, we so far didn't release
references to the allocated device nodes even though we destructed the
volumes they are for. Let's fix that, and release everything.

This mostly matters for cases where multiple attempts to unlock are made
(for example because of a password issue), without releasing the
DissectedImage.
2026-08-24 16:32:37 +01:00
Luca Boccassi ffb861ef22 man: add some notes regarding security features (#43434) 2026-08-24 15:12:03 +01:00
Christian Glombek f9185464bb resolved: never serve stale cache data on link-local scopes
Serving stale cache data on a retry is a resilience feature for unicast
DNS: when the configured server does not respond, an expired answer beats
no answer. The gate in dns_transaction_go() that switches the cache lookup
into serve-stale mode from the second attempt on only checks
StaleRetentionSec=, not the scope's protocol, so it applies to mDNS and
LLMNR scopes as well. There it is wrong twice over:

 * With StaleRetentionSec= set, a query for a peer that has left the
   network misses the cache on the first attempt (the record's TTL has
   expired), gets no reply, and is then answered from the expired but
   retained record on the retry — for as long as the retention window
   lasts. On the link-local protocols a retry means that no peer
   answered, not that some server is unreachable, and RFC 6762 treats
   TTL expiry as a presence signal: a host whose records lapse is gone.

 * Independently of whether anything stale is cached, a cache hit made
   in serve-stale mode is reported with its TTL clamped to 30s (see
   dns_cache_lookup()) and counted in the served-stale statistics. mDNS
   transactions are retried at 1s, 2s, 4s, ... whenever nobody answers,
   so a record announced or learnt from another transaction in between
   is handed to the client with a 30s TTL instead of its real remaining
   TTL, and logged as a "Serve Stale response" although it never was
   stale.

Hence only enter serve-stale mode on unicast DNS scopes. This is the
lookup-side counterpart of the cache-side change that stops link-local
records from being retained past their TTL at all.
2026-08-24 23:06:26 +09:00
David 'equinox' Lamparter 1aedc8fe5e core/service: document & improve STOPPING=1
`STOPPING=1` is final, explain in the sd_notify man page that this is
the case and log an error if a service attempts to get back out of
STOPPING with another notification.

Fixes #43465 / 98734ac74d
2026-08-24 22:46:01 +09:00
Luca Boccassi dfaa2d3ee1 man: note that blocking w+x memory is required for RestrictFileSystemAccess= 2026-08-24 13:22:56 +01:00
Luca Boccassi 8ae9973783 man: note that overriding TTY isolation with run0 is discouraged 2026-08-24 13:22:56 +01:00
Luca Boccassi 744b7801cb man: note that GPT is implicitly trusted by sd-mountfsd 2026-08-24 13:22:56 +01:00
Luca Boccassi e8e852fa76 man: note that mixing sd-nsresourced and /etc/subuid is unsupported 2026-08-24 13:22:56 +01:00
Yu Watanabe 98b867040e compress: several trivial cleanups (#43490) 2026-08-24 21:12:06 +09:00
Lennart Poettering 9139f3c53f switch-root: do not check fs to sync against allowlist
This drops a good chunk of 21ab2fe6ec
again, which I think is plainly wrong or at the very least too
overengineered.

1. it's wrong to assume that overlayfs layers are mounted elsewhere in
   the fs. it's quite likely they aren't. and overlayfs correctly passes
   through fsync() to the top layer, hence we really should keep syncing
   it.

2. network file systems deserve syncing. This code here runs in the
   initrd, where a very restrictive set of file systems is mounted and
   which runs for a very short time only, i.e. the circumstances haven't
   really changed. Hence I am very sure it's better to sync file systems
   here than not to, we do this for safety reasons after all.
   Reliability always trumps speed here, we should not give up
   correctness over presumed speed improvements.

3. There's zero reason to believe FUSE doesn't need syncing. We live in
   a world where increasingly complex kernel file systems are moved to
   userspace, and hence FUSE can be used to implement *anything*. Hence
   we should sync it. Yes, FUSE means some backing process needs to run,
   but that's a job for the initrd to get right: make sure the process
   runs properly over the switch root if the mount is left in tact over
   the switch root too.

Hence, dumb this all down and drop the weird fine tuning here.
2026-08-24 14:06:59 +02:00
Zbigniew Jędrzejewski-Szmek 4cf46d47a2 shared/verbs: allow commands to specify footer highlighting
In practice I think this will ever only be used with ansi_highlight_red(),
but it's cleaner to add this generic extension rather than e.g. a boolean
highlight_footer_red.

The options is passed through via command_print_help_full(), not through
the COMMAND structure, which means that commands with 'help' verb are not
covered by this. The red footer highligting is used for legacy commands,
which don't have verbs, so I think this is OK. Making it generic and
covering 'help' verbs would require more refactoring, and I think it
doesn't make sense to add it until it's actually needed.
2026-08-24 13:46:21 +02:00
Zbigniew Jędrzejewski-Szmek 16d0cbf04b systemctl: convert to VERB_COMMAND and add --introspect-cli
The custom help() is replaced by a COMMAND() description, and
--introspect-cli is added. The generic help-verb check in the test is
filtered out, since systemctl's "help" verb shows unit manuals and fails
without arguments.
2026-08-24 13:45:11 +02:00
Zbigniew Jędrzejewski-Szmek 1cf40c9c72 shared/verbs: stop requiring an explicit program name
Almost all programs are simple and have only a single command. When
printing options, let's just use the first COMMAND block found by default.
This means we can drop the explicit program-name argument and reduce
copy&paste boilerplate.
2026-08-24 13:45:07 +02:00
Hijae Song d669464b2a hwdb: add calibration override for AYANEO Flip KB/DS touchscreen
The Goodix Capacitive TouchScreen on the AYANEO Flip KB reports an
invalid calibration range during boot, due to unreliable I2C
communication with the touch controller early in the boot sequence.
Observed values include ABS_X max as high as 65343 and ABS_Y max as
low as 256, far outside the panel's actual resolution.

Confirmed on real hardware across multiple cold boots that the
controller never reports a correct calibration on its own, including
after forcing driver re-probes via unbind/bind. Override the axis
ranges with the panel's real resolution (1200x1920).

Also covers the Flip DS, mostly identical to the Flip KB apart from a
second screen replacing the keyboard. Not independently verified on
Flip DS hardware, but consistent with a community report of the same
Y-axis maximum (1919) for that model's main display, using a
different (and seemingly non-functional) override syntax.

Note: the panel is also mounted rotated relative to the raw sensor
axes; this entry only fixes the calibration range, not rotation (most
desktop environments handle touch rotation automatically when the
display output is rotated, independent of this).
2026-08-24 12:07:42 +01:00
Lennart Poettering 6cff583546 update TODO 2026-08-24 11:56:27 +02:00
Yu Watanabe e036040529 test-compress: extend buffer size
Otherwise, random input cases are not tested:
```
/* test_compress_decompress_blob */
/* testing xz text blob compression/decompression */
Loaded shared library 'liblzma.so.5' via dlopen().
/* testing xz random blob compression/decompression */
compression failed: No buffer space available
/* testing lz4 text blob compression/decompression */
Loaded shared library 'liblz4.so.1' via dlopen().
/* testing lz4 random blob compression/decompression */
compression failed: No buffer space available
/* testing zstd text blob compression/decompression */
Loaded shared library 'libzstd.so.1' via dlopen().
/* testing zstd random blob compression/decompression */
compression failed: No buffer space available
/* testing gzip text blob compression/decompression */
Loaded shared library 'libz.so.1' via dlopen().
/* testing gzip random blob compression/decompression */
compression failed: No buffer space available
/* testing bzip2 text blob compression/decompression */
Loaded shared library 'libbz2.so.1' via dlopen().
/* testing bzip2 random blob compression/decompression */
compression failed: No buffer space available
```
2026-08-24 03:30:52 +09:00