Karel Zak [Thu, 30 Oct 2025 11:11:43 +0000 (12:11 +0100)]
libfdisk: (dos) fix off-by-one in maximum last sector calculation
The get_disk_ranges() function incorrectly capped the last usable
sector at UINT_MAX, which could cause an overflow when calculating
partition size for MBR partition tables.
MBR stores partition size as a 32-bit value with maximum UINT_MAX.
The partition size is calculated as: size = stop - start + 1
For a partition starting at sector 0:
- If stop = UINT_MAX: size = UINT_MAX + 1 (overflow!)
- If stop = UINT_MAX - 1: size = UINT_MAX (correct maximum)
This fixes the inconsistency where dos_init() correctly warns about
disks larger than UINT_MAX sectors (2TiB - 512 bytes for 512-byte
sectors), but get_disk_ranges() allowed creating partitions that
would overflow the 32-bit size field.
Addresses: https://issues.redhat.com/browse/RHEL-122367 Signed-off-by: Karel Zak <kzak@redhat.com>
Bastian Krause [Fri, 24 Oct 2025 15:32:20 +0000 (17:32 +0200)]
hwclock: skip RTC_PARAM_SET for --param-set with unchanged value
Parameters set with `hwclock --param-set` tend to be persisted in the
RTC's EEPROM. Writing the same value over and over again can wear out
the EEPROM (e.g. on each boot).
So read the current value first. Only if the parameter is changed,
actually write the new value.
This allows for easier integrations, especially since there is no
machine-readable way of retrieving the current value via hwclock.
A lot of documentation on the Internet seems to assume "defaults" is the
/correct/ default value when no other options are intended.
Documentation/example.files/fstab does not have an entry for swap, but
it shows "defaults" for other file systems.
It seems prudent to align on a single variant, at least in the
documentation, even if both are accepted by swapon.
Signed-off-by: Chris Hofstaedtler <zeha@debian.org>
Karel Zak [Wed, 22 Oct 2025 08:42:36 +0000 (10:42 +0200)]
mount: add note about systemd and --all historical context
Add information that mount -a was originally designed for init scripts
but many modern systemd-based distributions use systemd units instead
for mounting filesystems on boot in a more sophisticated way.
Karel Zak [Wed, 22 Oct 2025 08:36:32 +0000 (10:36 +0200)]
mount: improve --all documentation regarding swap areas
The --all option description did not mention that swap entries in
fstab are silently ignored. Add a note clarifying this behavior and
pointing users to swapon --all for enabling swap devices and files.
Karel Zak [Tue, 21 Oct 2025 09:45:54 +0000 (11:45 +0200)]
losetup: improve command line option processing
The options --detach, --remove, and --set-capacity are mutually
exclusive. We can assume the device name follows the options, which is
better than assuming the device name is specified as an option's
argument. This also allows the use of the existing mutually-exclusive
check.
Karel Zak [Tue, 21 Oct 2025 08:58:36 +0000 (10:58 +0200)]
lostup: report EACCES on loop-control
Don't start scanning /dev/loop* after a failed access to
/dev/loop-control. It's a waste of time, and the user does not receive
a relevant error message.
Karel Zak [Thu, 16 Oct 2025 10:16:27 +0000 (12:16 +0200)]
losetup: improve --remove documentation
Rewrite the --remove option description to clearly explain the
difference between --detach and --remove. Add a new LOOP DEVICE
LIFECYCLE section that describes the three stages: creation,
detachment, and removal, with corresponding ioctl names.
Karel Zak [Thu, 16 Oct 2025 09:56:08 +0000 (11:56 +0200)]
losetup: make --remove a long-only option with mutual exclusivity
Change --remove from '-R, --remove' to a long-only option '--remove'.
This makes it consistent with other administrative options and adds
mutual exclusivity with other major actions like -d, -D, -a, -c, -f,
-j, -l, and -O.
Add a new static helper function loopcxt_get_device_nr() to extract
the loop device number from the device path. This eliminates code
duplication in loopcxt_remove_device() and loopcxt_add_device().
The helper function supports both /dev/loop<N> and /dev/loop/<N>
formats and provides consistent error handling with debug logging.
Karel Zak [Thu, 16 Oct 2025 09:22:47 +0000 (11:22 +0200)]
losetup: add error feedback for --remove command
The remove_loop() function was silently failing without providing
any feedback to the user. This also fixes incorrect indentation
(spaces instead of tabs).
Signed-off-by: Karel Zak <kzak@redhat.com> Reported-by: Benno Schulenberg <bensberg@telfort.nl>
Karel Zak [Wed, 15 Oct 2025 13:46:06 +0000 (15:46 +0200)]
treewide: use is_dotdir_dirent() helper
This simplifies the code by using the is_dotdir_dirent() helper
function instead of manual strcmp() checks for "." and ".." directory
entries across multiple utilities.
Karel Zak [Wed, 15 Oct 2025 13:30:06 +0000 (15:30 +0200)]
tests: (configs) add sorting and masking test
Add a new test that verifies:
- Main config file appears first
- Drop-in files are sorted alphabetically
- Files from /etc mask same-named files from /usr
- Priority ordering is correct (etc > usr)
The test creates mmm.conf in both /etc and /usr to verify
that the /etc version takes precedence and /usr version is
masked (not included in output).
Karel Zak [Wed, 15 Oct 2025 13:18:05 +0000 (15:18 +0200)]
lib/configs: simplify merge error checking
Combine the three config_merge_list() calls into a single
conditional statement to reduce repetitive error checking.
The calls are short-circuited on first failure.
Karel Zak [Wed, 15 Oct 2025 13:15:02 +0000 (15:15 +0200)]
lib/configs: eliminate counter variable
Remove the counter variable and return list_count_entries()
directly. This simplifies the code by calculating the count
only when needed (on success path) rather than tracking it
throughout the function.
Karel Zak [Wed, 15 Oct 2025 13:11:25 +0000 (15:11 +0200)]
lib/configs: add head parameter to configs_refer_filename()
Allow configs_refer_filename() to add entries at either the head
or tail of the list by adding a 'head' parameter. This simplifies
the code for adding the main config file, eliminating the need to
add to the tail and then move to the head.
When head=1, use list_add() to prepend to the list.
When head=0, use list_add_tail() to append to the list.
Karel Zak [Wed, 15 Oct 2025 12:59:44 +0000 (14:59 +0200)]
lib/configs: merge new_list_entry() and configs_add_filename()
Introduce configs_refer_filename() which merges the functionality
of new_list_entry() and configs_add_filename() while avoiding
unnecessary string duplication.
The new function takes ownership of the filename pointer directly
instead of using strdup(), which eliminates one allocation per
config file entry. Callers no longer need to free the filename
after adding it to the list, as ownership is transferred to the
list element.
This improves both performance and code clarity by making the
ownership semantics explicit.
Karel Zak [Wed, 15 Oct 2025 12:52:29 +0000 (14:52 +0200)]
lib/configs: refactor directory list merging
The original implementation used complex nested loops to merge
configuration file lists from different directories. This commit
simplifies the code by introducing a new config_merge_list()
function that handles the merging logic.
Changes:
- Add config_merge_list() to merge lists with duplicate detection
- Add config_cmp() comparison function using strcoll() (consistent
with alphasort() behavior from scandirat())
- Add configs_add_filename() helper to reduce code duplication
- Simplify ul_configs_file_list() by replacing ~120 lines of
merging logic with 3 calls to config_merge_list()
- Remove intermediate etc_run_file_list, merge directly to output
- Update read_dir() to return 0/-ENOMEM instead of entry count
- Use list_count_entries() to get final count
The new config_merge_list() moves entries directly from source
lists to the destination list without extra allocations, making
it more efficient than the previous approach.
Karel Zak [Tue, 14 Oct 2025 11:20:42 +0000 (13:20 +0200)]
tests: (configs) add file listings to expected output
Add sorted file listings to the configs test output to help debug
platform-specific test failures. Each subtest now outputs the actual
files created in the test directory before running the config helper,
making it easier to identify issues with filesystem ordering or file
creation problems.
Karel Zak [Thu, 9 Oct 2025 20:19:40 +0000 (22:19 +0200)]
lib/configs: introduce config_mk_path() helper
Refactor main_configs() and read_dir() to use a new helper function
that combines path construction with existence and type checking.
This reduces code duplication and simplifies the logic.
Karel Zak [Thu, 9 Oct 2025 20:04:19 +0000 (22:04 +0200)]
tests: add regression tests for ul_configs_file_list()
Add comprehensive test script for configuration file list functionality
with the following test cases:
- main-etc: Main config file in /etc
- main-usr: Main config file fallback to /usr
- dropin-etc: Drop-in files from /etc
- dropin-usr: Drop-in files from /usr
- combined: Main config + drop-ins from multiple directories
- masking: Same basename in multiple directories (masking behavior)
- no-project: Configuration without project subdirectory
The tests verify proper file discovery, priority ordering across /etc,
/run, and /usr directories, and file masking behavior according to the
Configuration Files Specification.
Karel Zak [Thu, 9 Oct 2025 20:02:24 +0000 (22:02 +0200)]
lib/configs: add test program for ul_configs_file_list()
Add a test program with command line options to test the configuration
file list functionality. The test program allows specifying custom paths
for /etc, /run, and /usr directories, project name, config name, and suffix.
This enables testing the priority ordering and file discovery logic
of ul_configs_file_list() from the command line.
Karel Zak [Tue, 14 Oct 2025 08:54:14 +0000 (10:54 +0200)]
Merge branch 'test--lsfd-revise-rpi5' of https://github.com/masatake/util-linux
* 'test--lsfd-revise-rpi5' of https://github.com/masatake/util-linux:
tests: (lsfd/mkfds-unix-dgram) skip if the unix diag netlink interface is not available
tests: (lsfd-functions.sh) make lsfd_check_sockdiag usable in subtests
tests: (lsfd/mkfds-unix-stream-requiring-sockdiag) revise the test description
Karel Zak [Tue, 14 Oct 2025 08:35:26 +0000 (10:35 +0200)]
Merge branch 'tests--kill-make-test-bits' of https://github.com/masatake/util-linux
* 'tests--kill-make-test-bits' of https://github.com/masatake/util-linux:
ts/kill/decode: compare decoded output in an architecture-independent way
ts/kill/decode: check the availability of "sed"
ts/kill/decode: consider arch dependent signum/name association
tests: (libmount) improve explicit loop read-write mount check
Some kernel configurations will affect default mount behavior
and add extra mount options. As a result, the $TS_OUTPUT will not
reliably match on all kernels. Therefore it is better to simply
test whether 'rw' is an option and not write the full options
list to $TS_OUTPUT.
Adresses: #3765 Signed-off-by: Christian Goeschel Ndjomouo <cgoesc2@wgu.edu>
umount: consider helper return status for success message
If a helper function was executed to unmount, we simply return
without any user feedback. That can unintentionally surpress
verbose messages (`--verbose`) for non-root users who use udisks2
to mount filesystems, and unmount via the unmount.udisks2 helper.
It would be better to check the helper return status as well for
completeness and a more reliable way to test the success of the
unmount operation.
mnt_context_get_helper_status() is only called if the helper was
executed, i.e. mnt_context_helper_executed == 1, anything else
wouldnt make sense anyways.
Addresses: #3790 Signed-off-by: Christian Goeschel Ndjomouo <cgoesc2@wgu.edu>
Post job cleanup.
/usr/bin/docker exec 94db032be2efb37ea68b3ce562ce52ba3dea047f5ac970aabb7fded075116c20 sh -c "cat /etc/*release | grep ^ID"
/__e/node20/bin/node: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.28' not found (required by /__e/node20/bin/node)
This adds the -J and --json options that enable JSON output mode
for the libsmartcols table. JSON output can be especially useful if
another program wants to consume lslogins's data in an easily parse-
able and language independent format.
Each keys's value will be converted into an appropriate JSON data
type, i.e. integers are numbers, empty values are null and others
are strings.
Signed-off-by: Christian Goeschel Ndjomouo <cgoesc2@wgu.edu>
treewide: consolidate --list-columns option in usage() to USAGE_LIST_COLUMNS_OPTION()
This consolidates the --list-columns description in the usage()
of ls-like tools to the USAGE_LIST_COLUMNS_OPTION() macro. It
makes it simplier and ensures a consistent definition.
Signed-off-by: Christian Goeschel Ndjomouo <cgoesc2@wgu.edu>
With this new macro we no longer have to redundantly specify
`fputs(_(" -H, --list-columns...` in the usage() function of ls-like tools, as it
will be consolidated to the USAGE_LIST_COLUMNS_OPTION() macro.
USAGE_LIST_COLUMNS_OPTION() aligns the option description to the other descriptions
in the usage() output in the same way as USAGE_HELP_OPTIONS().
Signed-off-by: Christian Goeschel Ndjomouo <cgoesc2@wgu.edu>
Masatake YAMATO [Fri, 10 Oct 2025 21:51:51 +0000 (06:51 +0900)]
ts/kill/decode: compare decoded output in an architecture-independent way
Reported-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Fixed: https://github.com/util-linux/util-linux/issues/3774 Signed-off-by: Masatake YAMATO <yamato@redhat.com>
bash-completion: dmesg: remove redundant completion for --buffer-size
The option --buffer-size already infers that its the optional argument
is a size value. In addition to that, when the option is completed the
user will have to delete the word 'size' from the command line and type
the desired value, which is not an ideal user experience.
Signed-off-by: Christian Goeschel Ndjomouo <cgoesc2@wgu.edu>
Masatake YAMATO [Fri, 10 Oct 2025 20:41:25 +0000 (05:41 +0900)]
ts/kill/decode: consider arch dependent signum/name association
In the original code, the signal bits passed to the decode test were
sampled on x86_64. As reported in #3774, the association between signal
number and its name is architecture dependent.
With this change, the test case calculates the signal bits from signal
names at runtime instead of hardcoding.
Stanislav Brabec [Fri, 10 Oct 2025 11:17:26 +0000 (13:17 +0200)]
agetty: Process all data from ul_nl_process()
However select() normally triggers immediately after a partial read, it does not
happen for netlink socket. It keeps unprocessed data until the next netlink
message appears. It causes raising processing delays.
Always read all data. It also potentially decreases number of issue redraws.
Karel Zak [Thu, 9 Oct 2025 08:17:45 +0000 (10:17 +0200)]
Merge branch 'PR/sprintf-replace' of https://github.com/karelzak/util-linux-work
* 'PR/sprintf-replace' of https://github.com/karelzak/util-linux-work:
hwclock: use snprintf() instead of sprintf()
lib/mbsalign: use snprintf() instead of sprintf()
col: use snprintf() instead of sprintf()
libfdisk: use snprintf() instead of sprintf()
lsfd: use snprintf() instead of sprintf()
pipesz: use snprintf() instead of sprintf()
dmesg: use snprintf() instead of sprintf()
lsipc: use snprintf() instead of sprintf()
libblkid: use snprintf() instead of sprintf()
If there are no IP addresses, ul_netaddrq_bestaddr() returns threshold
ULNETLINK_RATING_BAD, but there were no addresses in the best array, and
best_ifaceq remains unset, which caused crash. Setting the initial
threshold to __ULNETLINK_RATING_MAX and checking for that value fixes that.
And more, it also allows to accept IP addresses with ULNETLINK_RATING_BAD
rating.
Karel Zak [Tue, 7 Oct 2025 10:48:41 +0000 (12:48 +0200)]
lib/mbsalign: use snprintf() instead of sprintf()
Add bufsiz parameter to mbs_safe_encode_to_buffer() and
mbs_invalid_encode_to_buffer() functions to enable safe buffer
operations. Track remaining buffer size internally using int
variable and convert all sprintf() calls to snprintf().
Add buffer overflow protection by checking snprintf() return
values and verifying sufficient space before memcpy() and
direct writes. Break encoding loop early if buffer space
is exhausted.
This change improves code safety by preventing potential buffer
overflows and makes buffer size limits explicit in the API.
Karel Zak [Mon, 6 Oct 2025 12:31:29 +0000 (14:31 +0200)]
Merge branch 'fix/rename_annotation_opt_to_annotate' of https://github.com/cgoesche/util-linux-fork
* 'fix/rename_annotation_opt_to_annotate' of https://github.com/cgoesche/util-linux-fork:
man-common: rename annotation.adoc to annotate.adoc
swapon: use ANNOTATE_OPTION as enum name for --annotate
swapon: rename the new --annotation option to --annotate
swapon: (usage) make the help text fit within 80 columns again
Karel Zak [Mon, 6 Oct 2025 12:29:50 +0000 (14:29 +0200)]
Merge branch 'kill--line-oriented-list' of https://github.com/masatake/util-linux
* 'kill--line-oriented-list' of https://github.com/masatake/util-linux:
kill (-l/-L): print one signal per line when stdout is not a TTY
kill: (refactor) rename parameter to better reflect its purpose
swapon: rename the new --annotation option to --annotate
The form --annotation gave the impression that after the subsequent
"=" comes the text that each column name should be annotated with.
Furthermore, the other two options with optional arguments (--show
and --discard) are in the imperative, so follow that style and use
--annotate instead.
(In the bargain, this allows aligning the descriptions in the help
text perfectly again.)
Also, improve the description of --annotate in the man page somewhat.
swapon: (usage) make the help text fit within 80 columns again
Recent commit 72829b08fe added four extra spaces to each description
in the usage text, causing some lines to be wider than 80 characters.
Undo that addition, to make the help text fit again in 80 columns.
Also, put the equals sign for the new --annotation option inside the
square brackets instead of mistakenly before them.
UL_NL_SOFT_ERROR can be issued if kernel sends unpaired RTM_DELADDR. It
should not happen, but it can happen due to race condition. And it happened
in some kernel versions. It is not reason to exit the processing loop.