Util-Linux package development
 help / color / mirror / Atom feed
* Security issue in util-linux: out-of-bounds read in ul_parse_size()
From: Yashashree Gund @ 2026-02-01 14:47 UTC (permalink / raw)
  To: kzak@redhat.com, util-linux@vger.kernel.org


[-- Attachment #1.1: Type: text/plain, Size: 2060 bytes --]

Hello util-linux maintainers,

I would like to report a security issue in util-linux involving a memory safety flaw in ul_parse_size() that is reachable via libmount during mount option processing.
The issue is an out-of-bounds read caused by unchecked lookahead accesses when parsing malformed decimal size strings.

The crash is reliably triggered by inputs such as sizelimit=00000.000, which cause ul_parse_size() to read past the end of the input buffer.
This occurs even when the input string is properly NUL-terminated. The problem was initially discovered via libFuzzer while fuzzing libmount and was later confirmed with a minimal standalone reproducer that directly calls ul_parse_size(), demonstrating that the issue is intrinsic to the function and not dependent on higher-level parsing behavior.

Impact:

This bug can lead to process crashes and out-of-bounds memory reads in privileged contexts where util-linux or libmount parse attacker-influenced mount options (e.g., mount helpers, containers, or namespace-aware tools). The issue is therefore security-relevant.

Attachments included:


  *   A minimized reproducer input that triggers the crash
  *   The full AddressSanitizer crash report
  *   Execution-path notes describing how the input reaches ul_parse_size()
  *   A minimal standalone reproducer (verify.c)

Standalone reproducer details:

The attached verify-repro.c is a small test program that directly invokes ul_parse_size() with a crafted decimal size string and checks the result.

When built with AddressSanitizer enabled and linked against the util-linux source tree, running the program reliably triggers an out-of-bounds read in ul_parse_size(), confirming the issue independently of libmount or fuzzing infrastructure.

Please let me know if you would like the reproducer adapted further or if additional information would be helpful. I am happy to assist with validation or testing of a fix.

Thank you for your time and for maintaining util-linux.

Best Regards
Yashashree Gund





[-- Attachment #1.2: Type: text/html, Size: 7639 bytes --]

[-- Attachment #2: ul_parse_size_asan_report.txt --]
[-- Type: text/plain, Size: 8049 bytes --]

=================================================================
==290472==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x5020008924fa at pc 0xc25d0090fcdc bp 0xffffdcfa9630 sp 0xffffdcfa9628
READ of size 1 at 0x5020008924fa thread T0
    #0 0xc25d0090fcd8 in ul_parse_size /home/parallels/util-linux/lib/strutils.c:116:6
    #1 0xc25d008d1bd0 in setup_loopdev /home/parallels/util-linux/libmount/src/hook_loopdev.c:170:7
    #2 0xc25d008d1bd0 in hook_prepare_loopdev /home/parallels/util-linux/libmount/src/hook_loopdev.c:541:7
    #3 0xc25d008b1440 in mnt_context_call_hooks /home/parallels/util-linux/libmount/src/hooks.c:369:9
    #4 0xc25d00878384 in mnt_context_prepare_srcpath /home/parallels/util-linux/libmount/src/context.c:2002:7
    #5 0xc25d0088adf4 in mnt_context_prepare_mount /home/parallels/util-linux/libmount/src/context_mount.c:792:8
    #6 0xc25d0082ab44 in LLVMFuzzerTestOneInput /home/parallels/util-linux/libmount_fuzzer.c:40:27
    #7 0xc25d00735c0c in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) (/home/parallels/util-linux/libmount_fuzzer_deep+0x225c0c) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #8 0xc25d00735364 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool, bool*) (/home/parallels/util-linux/libmount_fuzzer_deep+0x225364) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #9 0xc25d00736b30 in fuzzer::Fuzzer::MutateAndTestOne() (/home/parallels/util-linux/libmount_fuzzer_deep+0x226b30) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #10 0xc25d00737894 in fuzzer::Fuzzer::Loop(std::vector<fuzzer::SizedFile, std::allocator<fuzzer::SizedFile>>&) (/home/parallels/util-linux/libmount_fuzzer_deep+0x227894) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #11 0xc25d00725730 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) (/home/parallels/util-linux/libmount_fuzzer_deep+0x215730) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #12 0xc25d0074e594 in main (/home/parallels/util-linux/libmount_fuzzer_deep+0x23e594) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #13 0xe8fca88884c0 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
    #14 0xe8fca8888594 in __libc_start_main csu/../csu/libc-start.c:360:3
    #15 0xc25d0071ba6c in _start (/home/parallels/util-linux/libmount_fuzzer_deep+0x20ba6c) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)

0x5020008924fa is located 0 bytes after 10-byte region [0x5020008924f0,0x5020008924fa)
allocated by thread T0 here:
    #0 0xc25d007ed0d4 in malloc (/home/parallels/util-linux/libmount_fuzzer_deep+0x2dd0d4) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #1 0xc25d00763b98 in strndup (/home/parallels/util-linux/libmount_fuzzer_deep+0x253b98) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #2 0xc25d0096e6bc in optlist_new_opt /home/parallels/util-linux/libmount/src/optlist.c:438:16
    #3 0xc25d00963424 in optlist_add_optstr /home/parallels/util-linux/libmount/src/optlist.c:524:9
    #4 0xc25d00880f84 in apply_fs /home/parallels/util-linux/libmount/src/context.c:2460:8
    #5 0xc25d00882a24 in mnt_context_apply_fstab /home/parallels/util-linux/libmount/src/context.c:2610:9
    #6 0xc25d0088aa50 in mnt_context_prepare_mount /home/parallels/util-linux/libmount/src/context_mount.c:782:7
    #7 0xc25d0082ab44 in LLVMFuzzerTestOneInput /home/parallels/util-linux/libmount_fuzzer.c:40:27
    #8 0xc25d00735c0c in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) (/home/parallels/util-linux/libmount_fuzzer_deep+0x225c0c) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #9 0xc25d00735364 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool, bool*) (/home/parallels/util-linux/libmount_fuzzer_deep+0x225364) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #10 0xc25d00736b30 in fuzzer::Fuzzer::MutateAndTestOne() (/home/parallels/util-linux/libmount_fuzzer_deep+0x226b30) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #11 0xc25d00737894 in fuzzer::Fuzzer::Loop(std::vector<fuzzer::SizedFile, std::allocator<fuzzer::SizedFile>>&) (/home/parallels/util-linux/libmount_fuzzer_deep+0x227894) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #12 0xc25d00725730 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) (/home/parallels/util-linux/libmount_fuzzer_deep+0x215730) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #13 0xc25d0074e594 in main (/home/parallels/util-linux/libmount_fuzzer_deep+0x23e594) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)
    #14 0xe8fca88884c0 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
    #15 0xe8fca8888594 in __libc_start_main csu/../csu/libc-start.c:360:3
    #16 0xc25d0071ba6c in _start (/home/parallels/util-linux/libmount_fuzzer_deep+0x20ba6c) (BuildId: cd366d821202ca98528bf79b9941e431153e4cc3)

SUMMARY: AddressSanitizer: heap-buffer-overflow /home/parallels/util-linux/lib/strutils.c:116:6 in ul_parse_size
Shadow bytes around the buggy address:
  0x502000892200: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000892280: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000892300: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000892380: fa fa fa fa fa fa fd fa fa fa fa fa fa fa fa fa
  0x502000892400: fa fa fa fa fa fa fd fa fa fa fa fa fa fa fa fa
=>0x502000892480: fa fa fa fa fa fa fd fd fa fa fa fa fa fa 00[02]
  0x502000892500: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000892580: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000892600: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000892680: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x502000892700: fa fa fa fa fa fa fa fa fa fa fd fd fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
==290472==ABORTING
MS: 10 ManualDict-Custom-CopyPart-Custom-ChangeByte-Custom-ShuffleBytes-Custom-CrossOver-Custom- DE: "iversion"-; base unit: aed04bcf8f04c9b420bd06e9bd0054341e9ad91d
0x69,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x31,0x37,0x33,0x20,0x30,0x35,0x64,0x30,0xa,0x37,0x20,0x32,0x35,0x20,0x6e,0x31,0x37,0x33,0x20,0x30,0x35,0x64,0x30,0xa,0x37,0x20,0x72,0xbf,0x67,0x65,0x78,0x65,0xa8,0x20,0x2d,0x20,0x6e,0x66,0x73,0x38,0x20,0xa,0x30,0x35,0x30,0x72,0x2e,0x2e,0x2f,0x2e,0x2f,0x6d,0x28,0x31,0xe4,0x20,0x2f,0x20,0xb2,0x6d,0x70,0x66,0x73,0x20,0xf2,0x2c,0x72,0x77,0x3d,0x22,0x22,0x2c,0x75,0x22,0x22,0x2c,0x2c,0x72,0x77,0x3d,0x22,0x22,0x2c,0x75,0x73,0x65,0x72,0x2c,0x6e,0x6f,0x61,0x75,0x74,0x6f,0x2c,0x58,0x75,0x6d,0x61,0x6b,0x65,0x2d,0x73,0x68,0x61,0x72,0x65,0x64,0x22,0x22,0x2c,0x73,0x69,0x7a,0x65,0x6c,0x69,0x6d,0x69,0x74,0x3d,0x30,0x30,0x30,0x30,0x30,0x2e,0x30,0x30,0x30,0xa,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x30,0x33,0x30,0x36,0x32,0x32,0x36,0x31,0x36,0x2c,0x68,0x65,0x6c,0x70,0x2c,0x64,0x69,0x32,
iversion173 05d0\0127 25 n173 05d0\0127 r\277gexe\250 - nfs8 \012050r.././m(1\344 / \262mpfs \362,rw=\"\",u\"\",,rw=\"\",user,noauto,Xumake-shared\"\",sizelimit=00000.000\012000000001030622616,help,di2
artifact_prefix='./'; Test unit written to ./crash-eecdf3b60e9e72795b3cea62b63d59a61b770c42
Base64: aXZlcnNpb24xNzMgMDVkMAo3IDI1IG4xNzMgMDVkMAo3IHK/Z2V4ZaggLSBuZnM4IAowNTByLi4vLi9tKDHkIC8gsm1wZnMg8ixydz0iIix1IiIsLHJ3PSIiLHVzZXIsbm9hdXRvLFh1bWFrZS1zaGFyZWQiIixzaXplbGltaXQ9MDAwMDAuMDAwCjAwMDAwMDAwMTAzMDYyMjYxNixoZWxwLGRpMg==

[-- Attachment #3: verify-repro.c --]
[-- Type: text/plain, Size: 293 bytes --]

#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include "strutils.h"

int main(void)
{
    uintmax_t res;
    const char *s = "00000.000";

    int rc = ul_parse_size(s, &res, NULL);

    printf("input='%s' rc=%d errno=%d res=%ju\n",
           s, rc, errno, res);

    return 0;
}

[-- Attachment #4: ul_parse_size_execution_path.txt --]
[-- Type: text/plain, Size: 1342 bytes --]

Execution path notes – ul_parse_size heap OOB read

Overview

The attached reproducer input triggers a heap out-of-bounds read in
ul_parse_size() during mount option parsing in libmount.

High-level flow

The reproducer input is consumed by libmount as part of mount option
processing (e.g. via options such as sizelimit=).

libmount parses mount options into an option list.

Size-related options are passed to ul_parse_size() for numeric parsing.

Call path (trimmed)

mnt_context_prepare_mount()
 └─ mnt_context_apply_fstab()
    └─ apply_fs()
       └─ optlist_add_optstr()
          └─ optlist_new_opt()
             └─ ul_parse_size()


Fault details

Input value example: sizelimit=00000.000

Inside ul_parse_size():

strtoumax() parses the integer part and sets end to the decimal point.

Decimal parsing advances the pointer p to the last fractional digit.

The suffix-checking logic then unconditionally dereferences p + 1
(and potentially further offsets).

When p points to the final byte of a heap-allocated string (allocated via
strndup()), dereferencing p + 1 results in a heap out-of-bounds read.

Result

AddressSanitizer reports a reproducible heap buffer overflow (read of size 1)
in ul_parse_size(). The issue is input-driven and does not depend on
uninitialized memory or use-after-free conditions.

^ permalink raw reply

* v2.42 branch
From: Karel Zak @ 2026-02-04 12:48 UTC (permalink / raw)
  To: util-linux


Hi all,

I'm going on vacation next week (starting tomorrow), so please be
patient with reviews and merges on GitHub :-)

After that, I'd like to create the stable/v2.42 branch and start
working on code stabilization and translations. If there's something
we really need in the next release, please send a PR.

  Karel

-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com


^ permalink raw reply

* [PATCH v2 1/2] lscpu-arm: Include the ARM SMC CC SOC_ID name.
From: Paul Benoit @ 2026-02-11 21:23 UTC (permalink / raw)
  To: util-linux; +Cc: Paul Benoit
In-Reply-To: <a758edc3-2d4f-4e5d-8951-8aad0c3a546a@os.amperecomputing.com>

On ARM SMC CC 1.6 compliant systems, output the optional SMC CC SOC_ID
name if available.

Vendor ID:                   Ampere
  BIOS Vendor ID:            Ampere (R)
  Model name:                Ampere-1a
    SMCCC SOC_ID name:       AmpereOne (R) A192-32X
    BIOS Model name:         AmpereOne (R) A192-32X CPU @ 3.2GH

Signed-off-by: Paul Benoit <paul@os.amperecomputing.com>
---
 sys-utils/lscpu-arm.c | 38 ++++++++++++++++++++++++++++++++++++++
 sys-utils/lscpu.c     |  2 ++
 sys-utils/lscpu.h     |  4 ++++
 3 files changed, 44 insertions(+)

diff --git a/sys-utils/lscpu-arm.c b/sys-utils/lscpu-arm.c
index ed255a3c7..f388080ad 100644
--- a/sys-utils/lscpu-arm.c
+++ b/sys-utils/lscpu-arm.c
@@ -11,6 +11,7 @@
  * The information here is gathered from
  *  - ARM manuals
  *  - Linux kernel: arch/armX/include/asm/cputype.h
+ *  - Linux kernel: Documentation/ABI/testing/sysfs-devices-soc
  *  - GCC sources: config/arch/arch-cores.def
  *  - Ancient wisdom
  *  - SMBIOS tables (if applicable)
@@ -460,6 +461,41 @@ static int arm_rXpY_decode(struct lscpu_cputype *ct)
 	return 0;
 }
 
+static void on_smc_platform_get_socidname(struct lscpu_cputype *ct)
+{
+	char *machinename = NULL;
+	char *soc_id_jep106_id_str = NULL;
+
+	/* On systems that support SMC CC (Secure Monitor Call Calling
+	 * Convention, get the SOC_ID name.  The Linux kernel obtains it from
+	 * Trusted Firmware via an SMC CC call, and sets
+	 * /sys/bus/soc/devices/soc0/machine _PATH_SOC_ID to this value.  lscpu
+	 * will obtain the value from there.
+	 *
+	 * Documentation/ABI/testing/sysfs-devices-soc, in the Linux kernel
+	 * source tree, gives insight into detecting a SMC CC compliant system
+	 * by checking that start of the _PATH_SOC_ID value for "jep106:".
+	 */
+	ul_path_read_string(NULL, &soc_id_jep106_id_str, _PATH_SOC_ID);
+
+	if (soc_id_jep106_id_str) {
+		if (strncmp(soc_id_jep106_id_str, "jep106:", 7) == 0) {
+			ul_path_read_string(NULL, &machinename,
+					    _PATH_SOC_MACHINENAME);
+			if (machinename) {
+				if (strnlen(machinename, sizeof(machinename))) {
+					free(ct->socid_name);
+					ct->socid_name = xstrdup(machinename);
+				}
+
+				free(machinename);
+			}
+		}
+
+		free(soc_id_jep106_id_str);
+	}
+}
+
 static void arm_decode(struct lscpu_cxt *cxt, struct lscpu_cputype *ct)
 {
 	if (is_live(cxt) && access(_PATH_SYS_DMI, R_OK) == 0)
@@ -468,6 +504,8 @@ static void arm_decode(struct lscpu_cxt *cxt, struct lscpu_cputype *ct)
 	arm_ids_decode(ct);
 	arm_rXpY_decode(ct);
 
+	on_smc_platform_get_socidname(ct);
+
 	if (is_live(cxt) && cxt->is_cluster)
 		ct->nr_socket_on_cluster = get_number_of_physical_sockets_from_dmi();
 }
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index 4556aa6df..cd2d00312 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -895,6 +895,8 @@ print_summary_cputype(struct lscpu_cxt *cxt,
 		     struct libscols_line *sec)
 {
 	sec = add_summary_s(tb, sec, _("Model name:"), ct->modelname ? ct->modelname : "-");
+	if (ct->socid_name)
+		add_summary_s(tb, sec, _("SMCCC SOC_ID name:"), ct->socid_name);
 	if (ct->bios_modelname)
 		add_summary_s(tb, sec, _("BIOS Model name:"), ct->bios_modelname);
 	if (ct->bios_family)
diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h
index 0fae5d29e..b8011bc55 100644
--- a/sys-utils/lscpu.h
+++ b/sys-utils/lscpu.h
@@ -46,6 +46,8 @@ UL_DEBUG_DECLARE_MASK(lscpu);
 #define _PATH_SYS_NODE		_PATH_SYS_SYSTEM "/node"
 #define _PATH_SYS_DMI		"/sys/firmware/dmi/tables/DMI"
 #define _PATH_ACPI_PPTT		"/sys/firmware/acpi/tables/PPTT"
+#define _PATH_SOC_ID		"/sys/devices/soc0/soc_id"
+#define _PATH_SOC_MACHINENAME	"/sys/devices/soc0/machine"
 
 struct lscpu_cache {
 	int		id;		/* unique identifier */
@@ -119,6 +121,8 @@ struct lscpu_cputype {
 	size_t nr_socket_on_cluster; /* the number of sockets if the is_cluster is 1 */
 
 	char	*isa;	/* loongarch */
+
+	char	*socid_name;	/* aarch64 */
 };
 
 /* dispatching modes */
-- 
2.48.1


^ permalink raw reply related

* [PATCH v2 2/2] lscpu-arm: Correct Ampere part name strings.
From: Paul Benoit @ 2026-02-11 21:23 UTC (permalink / raw)
  To: util-linux; +Cc: Paul Benoit
In-Reply-To: <a758edc3-2d4f-4e5d-8951-8aad0c3a546a@os.amperecomputing.com>

Change "Ampere-1" to "Ampere1", and "Ampere-1a" to "Ampere1a" in the
ampere_part table.

Signed-off-by: Paul Benoit <paul@os.amperecomputing.com>
---
 sys-utils/lscpu-arm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/sys-utils/lscpu-arm.c b/sys-utils/lscpu-arm.c
index f388080ad..0b0935402 100644
--- a/sys-utils/lscpu-arm.c
+++ b/sys-utils/lscpu-arm.c
@@ -276,8 +276,8 @@ static const struct id_part hisi_part[] = {
 };
 
 static const struct id_part ampere_part[] = {
-    { 0xac3, "Ampere-1" },
-    { 0xac4, "Ampere-1a" },
+    { 0xac3, "Ampere1" },
+    { 0xac4, "Ampere1a" },
     { -1, "unknown" },
 };
 
-- 
2.48.1


^ permalink raw reply related

* [PATCH] lsblk: improve error reporting for invalid device paths
From: sina-abroshan @ 2026-02-12 11:24 UTC (permalink / raw)
  To: util-linux; +Cc: kzak, sina-abroshan

Differentiate stat() failures from non-block-device cases,
so users get accurate errno-based error messages.

Signed-off-by: sina-abroshan <sina.abroshan@gmail.com>
---
 misc-utils/lsblk.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c
index 3d2bc21a6..4a0d7c70e 100644
--- a/misc-utils/lsblk.c
+++ b/misc-utils/lsblk.c
@@ -1793,14 +1793,20 @@ static int __process_one_device(struct lsblk_devtree *tr, char *devname, dev_t d
 	int real_part = 0, rc = -EINVAL;
 
 	if (devno == 0 && devname) {
-		struct stat st;
+    	struct stat st;
 
-		DBG(DEV, ul_debug("%s: reading alone device", devname));
+    	DBG(DEV, ul_debug("%s: reading alone device", devname));
 
-		if (stat(devname, &st) || !S_ISBLK(st.st_mode)) {
+		if (stat(devname, &st) != 0) {
+			warn(_("%s"), devname);
+			goto leave;
+		}
+
+		if (!S_ISBLK(st.st_mode)) {
 			warnx(_("%s: not a block device"), devname);
 			goto leave;
 		}
+
 		devno = st.st_rdev;
 	} else if (devno) {
 		DBG(DEV, ul_debug("%d:%d: reading alone device", major(devno), minor(devno)));
-- 
2.34.1


^ permalink raw reply related

* [PATCH] nsenter: Support specifying namespace by ID
From: Xiao Liang @ 2026-02-14  3:23 UTC (permalink / raw)
  To: util-linux; +Cc: Karel Zak

Linux kernel v6.19 introduces listns() syscall that lists namespace IDs,
as well as the support for opening an nsfile by a file_handle of ns ID.

This patch allows specifying namespaces by ID for nsenter. For example:

  # nsenter --net=:7

enters init net namespace (7 for NET_NS_INIT_ID).

In the rare case that a ns file name starts with a colon, prepend "./"
for disambiguation.

Signed-off-by: Xiao Liang <shaw.leon@gmail.com>
---
 configure.ac             |   4 ++
 meson.build              |   3 ++
 sys-utils/nsenter.1.adoc |  34 +++++++------
 sys-utils/nsenter.c      | 104 +++++++++++++++++++++++++++++++++++----
 4 files changed, 119 insertions(+), 26 deletions(-)

diff --git a/configure.ac b/configure.ac
index 912aa85d0..a0c8d0752 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1052,6 +1052,10 @@ char *c = crypt("abc","pw");
 ])
 AM_CONDITIONAL([HAVE_LIBCRYPT], [test "x$have_libcrypt" = xyes])
 
+AC_CHECK_TYPES([struct nsfs_file_handle], [], [], [[
+#include <linux/nsfs.h>
+]])
+
 
 AC_ARG_WITH([selinux],
   AS_HELP_STRING([--with-selinux], [compile with SELinux support]),
diff --git a/meson.build b/meson.build
index 1f4a5babb..5b8d03270 100644
--- a/meson.build
+++ b/meson.build
@@ -915,6 +915,9 @@ conf.set('USE_COLORS_BY_DEFAULT', get_option('colors-default') ? 1 : false)
 
 is_glibc = cc.has_header_symbol('limits.h', '__GLIBC__')
 
+have = cc.has_type('struct nsfs_file_handle', prefix : '#include <linux/nsfs.h>')
+conf.set('HAVE_STRUCT_NSFS_FILE_HANDLE', have ? 1 : false)
+
 ############################################################
 
 
diff --git a/sys-utils/nsenter.1.adoc b/sys-utils/nsenter.1.adoc
index d12097472..3dec46d66 100644
--- a/sys-utils/nsenter.1.adoc
+++ b/sys-utils/nsenter.1.adoc
@@ -87,36 +87,36 @@ Optionally, a process can be addressed with the format _PID:inode_. The _inode_
 identifies the unique process's file descriptor. To retrieve a process's inode
 number you can use the *getino*(1) utility.
 
-*-m*, *--mount*[**=**_file_]::
-Enter the mount namespace. If no file is specified, enter the mount namespace of the target process. If _file_ is specified, enter the mount namespace specified by _file_.
+*-m*, *--mount*[**=**<__file__|:__nsid__>]::
+Enter the mount namespace. If no argument is specified, enter the mount namespace of the target process. If _file_ or :__nsid__ is specified, enter the mount namespace specified by _file_ or _nsid_.
 
-*-u*, *--uts*[**=**_file_]::
-Enter the UTS namespace. If no file is specified, enter the UTS namespace of the target process. If _file_ is specified, enter the UTS namespace specified by _file_.
+*-u*, *--uts*[**=**<__file__|:__nsid__>]::
+Enter the UTS namespace. If no argument is specified, enter the UTS namespace of the target process. If _file_ or :__nsid__ is specified, enter the UTS namespace specified by _file_ or _nsid_.
 
-*-i*, *--ipc*[**=**_file_]::
-Enter the IPC namespace. If no file is specified, enter the IPC namespace of the target process. If _file_ is specified, enter the IPC namespace specified by _file_.
+*-i*, *--ipc*[**=**<__file__|:__nsid__>]::
+Enter the IPC namespace. If no argument is specified, enter the IPC namespace of the target process. If _file_ or :__nsid__ is specified, enter the IPC namespace specified by _file_ or _nsid_.
 
-*-n*, *--net*[**=**_file_]::
-Enter the network namespace. If no file is specified, enter the network namespace of the target process. If _file_ is specified, enter the network namespace specified by _file_.
+*-n*, *--net*[**=**<__file__|:__nsid__>]::
+Enter the network namespace. If no argument is specified, enter the network namespace of the target process. If _file_ or :__nsid__ is specified, enter the network namespace specified by _file_ or _nsid_.
 
 *-N*, *--net-socket* _fd_::
 Enter the network namespace of the target process's socket. It requires *--target* process specified. Supported since Linux 5.6.
 
-*-p*, *--pid*[**=**_file_]::
-Enter the PID namespace. If no file is specified, enter the PID namespace of the target process. If _file_ is specified, enter the PID namespace specified by _file_.
+*-p*, *--pid*[**=**<__file__|:__nsid__>]::
+Enter the PID namespace. If no argument is specified, enter the PID namespace of the target process. If _file_ or :__nsid__ is specified, enter the PID namespace specified by _file_ or _nsid_.
 
-*-U*, *--user*[**=**_file_]::
-Enter the user namespace. If no file is specified, enter the user namespace of the target process. If _file_ is specified, enter the user namespace specified by _file_. See also the *--setuid* and *--setgid* options.
+*-U*, *--user*[**=**<__file__|:__nsid__>]::
+Enter the user namespace. If no argument is specified, enter the user namespace of the target process. If _file_ or :__nsid__ is specified, enter the user namespace specified by _file_ or _nsid_. See also the *--setuid* and *--setgid* options.
 
 *--user-parent*::
 Enter the parent user namespace. Parent user namespace will be acquired from any other enabled namespace.
 If combined with *--user* option the parent user namespace will be fetched from the user namespace and replace it.
 
-*-C*, *--cgroup*[**=**_file_]::
-Enter the cgroup namespace. If no file is specified, enter the cgroup namespace of the target process. If _file_ is specified, enter the cgroup namespace specified by _file_.
+*-C*, *--cgroup*[**=**<__file__|:__nsid__>]::
+Enter the cgroup namespace. If no argument is specified, enter the cgroup namespace of the target process. If _file_ or :__nsid__ is specified, enter the cgroup namespace specified by _file_ or _nsid_.
 
-*-T*, *--time*[**=**_file_]::
-Enter the time namespace. If no file is specified, enter the time namespace of the target process. If _file_ is specified, enter the time namespace specified by _file_.
+*-T*, *--time*[**=**<__file__|:__nsid__>]::
+Enter the time namespace. If no argument is specified, enter the time namespace of the target process. If _file_ or :__nsid__ is specified, enter the time namespace specified by _file_ or _nsid_.
 
 *-G*, *--setgid* _gid_::
 Set the group ID which will be used in the entered namespace and drop supplementary groups.
@@ -161,6 +161,8 @@ include::man-common/help-version.adoc[]
 
 The *--user-parent* option requires Linux 4.9 or higher, older kernels will raise inappropriate ioctl for device error.
 
+Specifying namesapces by _nsid_ requires Linux 6.19 or higher.
+
 == AUTHORS
 
 mailto:biederm@xmission.com[Eric Biederman],
diff --git a/sys-utils/nsenter.c b/sys-utils/nsenter.c
index b45f626b1..2820a7123 100644
--- a/sys-utils/nsenter.c
+++ b/sys-utils/nsenter.c
@@ -93,16 +93,16 @@ static void __attribute__((__noreturn__)) usage(void)
 	fputs(USAGE_OPTIONS, out);
 	fputs(_(" -a, --all                    enter all namespaces\n"), out);
 	fputs(_(" -t, --target <PID>           target process to get namespaces from\n"), out);
-	fputs(_(" -m, --mount[=<file>]         enter mount namespace\n"), out);
-	fputs(_(" -u, --uts[=<file>]           enter UTS namespace (hostname etc)\n"), out);
-	fputs(_(" -i, --ipc[=<file>]           enter System V IPC namespace\n"), out);
-	fputs(_(" -n, --net[=<file>]           enter network namespace\n"), out);
+	fputs(_(" -m, --mount[=<file|:nsid>]   enter mount namespace\n"), out);
+	fputs(_(" -u, --uts[=<file|:nsid>]     enter UTS namespace (hostname etc)\n"), out);
+	fputs(_(" -i, --ipc[=<file|:nsid>]     enter System V IPC namespace\n"), out);
+	fputs(_(" -n, --net[=<file|:nsid>]     enter network namespace\n"), out);
 	fputs(_(" -N, --net-socket <fd>        enter socket's network namespace (use with --target)\n"), out);
-	fputs(_(" -p, --pid[=<file>]           enter pid namespace\n"), out);
-	fputs(_(" -C, --cgroup[=<file>]        enter cgroup namespace\n"), out);
-	fputs(_(" -U, --user[=<file>]          enter user namespace\n"), out);
+	fputs(_(" -p, --pid[=<file|:nsid>]     enter pid namespace\n"), out);
+	fputs(_(" -C, --cgroup[=<file|:nsid>]  enter cgroup namespace\n"), out);
+	fputs(_(" -U, --user[=<file|:nsid>]    enter user namespace\n"), out);
 	fputs(_("     --user-parent            enter parent user namespace\n"), out);
-	fputs(_(" -T, --time[=<file>]          enter time namespace\n"), out);
+	fputs(_(" -T, --time[=<file|:nsid>]    enter time namespace\n"), out);
 	fputs(_(" -S, --setuid[=<uid>]         set uid in entered namespace\n"), out);
 	fputs(_(" -G, --setgid[=<gid>]         set gid in entered namespace\n"), out);
 	fputs(_("     --preserve-credentials   do not touch uids or gids\n"), out);
@@ -177,10 +177,89 @@ static void open_target_fd(int *fd, const char *type, const char *path)
 		err(EXIT_FAILURE, _("cannot open %s"), path);
 }
 
+#ifdef HAVE_STRUCT_NSFS_FILE_HANDLE
+
+static struct file_handle nsfs_fh_tmpl = {};
+static int nsfs_fd = -1;
+
+static int fill_nsfs_file_handle(struct file_handle *fh, uint64_t ns_id)
+{
+	struct nsfs_file_handle *nsfh = (struct nsfs_file_handle *)fh->f_handle;
+	int pidfd_self;
+	int mount_id;
+
+	if (nsfs_fh_tmpl.handle_type) {
+		*fh = nsfs_fh_tmpl;
+		goto out;
+	}
+
+	/*
+	 * Before we can build a file handle of the namespace file of given
+	 * nsid and open it, we need the handle_type of nsfs and a "mount_fd"
+	 * for open_by_handle_at(2)). However,
+	 *
+	 *  1. FILEID_NSFS is currently not exposed to userspace, and
+	 *  2. linux/fcntl.h, in which FD_NSFS_ROOT is defined, conflicts with
+	 *     fcntl.h,
+	 *
+	 * so we retrieve the information by grabbing a temporary ns file.
+	 */
+	pidfd_self = pidfd_open(getpid(), 0);
+	if (pidfd_self < 0)
+		return -errno;
+
+	/* Mount namespace can not be disabled by kernel config */
+	nsfs_fd = ioctl(pidfd_self, PIDFD_GET_MNT_NAMESPACE, 0);
+	if (nsfs_fd < 0)
+		return -errno;
+	close(pidfd_self);
+
+	fh->handle_bytes = sizeof(struct nsfs_file_handle);
+	if (name_to_handle_at(nsfs_fd, "", fh, &mount_id,
+			      AT_EMPTY_PATH | AT_HANDLE_FID) == -1)
+		return -errno;
+	assert(fh->handle_type);
+	nsfs_fh_tmpl = *fh;
+
+out:
+	memset(nsfh, 0, sizeof(*nsfh));
+	nsfh->ns_id = ns_id;
+	return 0;
+}
+
+static void open_target_fd_by_nsid(int *fd, const char *idstr)
+{
+	unsigned char fh_buf[sizeof(struct file_handle) +
+		sizeof(struct nsfs_file_handle)];
+	struct file_handle *fh = (struct file_handle *)fh_buf;
+	uint64_t ns_id;
+
+	if (ul_strtou64(idstr, &ns_id, 10) != 0)
+		errx(EXIT_FAILURE, _("failed to parse nsid: %s"), idstr);
+
+	if (fill_nsfs_file_handle(fh, ns_id) != 0)
+		err(EXIT_FAILURE, _("failed to fill namespace file handle"));
+
+	if (*fd >= 0)
+		close(*fd);
+
+	*fd = open_by_handle_at(nsfs_fd, fh, O_RDONLY);
+	if (*fd < 0)
+		err(EXIT_FAILURE, _("cannot open namespace of id %"PRIu64),
+		    ns_id);
+}
+#endif /* HAVE_STRUCT_NSFS_FILE_HANDLE */
+
 static void enable_nsfile(struct namespace_file *n, const char *path)
 {
-	if (path)
-		open_target_fd(&n->fd, n->name, path);
+	if (path) {
+#ifdef HAVE_STRUCT_NSFS_FILE_HANDLE
+		if (*path == ':')
+			open_target_fd_by_nsid(&n->fd, path + 1);
+		else
+#endif
+			open_target_fd(&n->fd, n->name, path);
+	}
 	n->enabled = true;
 }
 
@@ -776,6 +855,11 @@ int main(int argc, char *argv[])
 	if (pid_fd >= 0)
 		close(pid_fd);
 
+#ifdef HAVE_STRUCT_NSFS_FILE_HANDLE
+	if (nsfs_fd >= 0)
+		close(nsfs_fd);
+#endif
+
 	/* Remember the current working directory if I'm not changing it */
 	if (root_fd >= 0 && wd_fd < 0 && wdns == NULL) {
 		wd_fd = open(".", O_RDONLY);
-- 
2.53.0


^ permalink raw reply related

* Re: [PATCH] lsblk: improve error reporting for invalid device paths
From: Benno Schulenberg @ 2026-02-14 15:24 UTC (permalink / raw)
  To: sina-abroshan, util-linux; +Cc: kzak
In-Reply-To: <20260212112423.2400888-1-sina.abroshan@gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 553 bytes --]


Op 12-02-2026 om 12:24 schreef sina-abroshan:
> -		struct stat st;
> +    	struct stat st;
>   
> -		DBG(DEV, ul_debug("%s: reading alone device", devname));
> +    	DBG(DEV, ul_debug("%s: reading alone device", devname));

Why these whitespace changes?  There should be tabs there, not spaces.

> -		if (stat(devname, &st) || !S_ISBLK(st.st_mode)) {
> +		if (stat(devname, &st) != 0) {
> +			warn(_("%s"), devname);
Gettextizing a message that contains nothing translatable is pointless.
In other words: drop the _() call.


Benno


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

^ permalink raw reply

* [PATCH] lsblk: improve error reporting for invalid device paths
From: sina-abroshan @ 2026-02-15  8:34 UTC (permalink / raw)
  To: util-linux; +Cc: kzak, bensberg, Sina Abroshan
In-Reply-To: <20260212112423.2400888-1-sina.abroshan@gmail.com>

From: Sina Abroshan <sina.abroshan@gmail.com>

Differentiate stat() failures from non-block-device cases,
so users get accurate errno-based error messages.

Signed-off-by: Sina Abroshan <sina.abroshan@gmail.com>

---
v2:
 - Use tabs instead of spaces
 - Drop unnecessary _() around "%s"
---
 misc-utils/lsblk.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c
index 3d2bc21a6..6a8769bc7 100644
--- a/misc-utils/lsblk.c
+++ b/misc-utils/lsblk.c
@@ -1797,7 +1797,12 @@ static int __process_one_device(struct lsblk_devtree *tr, char *devname, dev_t d
 
 		DBG(DEV, ul_debug("%s: reading alone device", devname));
 
-		if (stat(devname, &st) || !S_ISBLK(st.st_mode)) {
+		if (stat(devname, &st) != 0) {
+			warn("%s", devname);
+			goto leave;
+		}
+
+		if (!S_ISBLK(st.st_mode)) {
 			warnx(_("%s: not a block device"), devname);
 			goto leave;
 		}
-- 
2.34.1


^ permalink raw reply related

* Re: [PATCH] lsblk: improve error reporting for invalid device paths
From: Karel Zak @ 2026-02-18 10:01 UTC (permalink / raw)
  To: sina-abroshan; +Cc: util-linux, bensberg
In-Reply-To: <20260215083417.185974-1-sina.abroshan@gmail.com>

On Sun, Feb 15, 2026 at 12:04:17PM +0330, sina-abroshan wrote:
>  misc-utils/lsblk.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)

Applied, thanks.

-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com


^ permalink raw reply

* Re: [PATCH] nsenter: Support specifying namespace by ID
From: Karel Zak @ 2026-02-18 11:44 UTC (permalink / raw)
  To: Xiao Liang; +Cc: util-linux
In-Reply-To: <20260214032345.32457-1-shaw.leon@gmail.com>

On Sat, Feb 14, 2026 at 11:23:42AM +0800, Xiao Liang wrote:
>  configure.ac             |   4 ++
>  meson.build              |   3 ++
>  sys-utils/nsenter.1.adoc |  34 +++++++------
>  sys-utils/nsenter.c      | 104 +++++++++++++++++++++++++++++++++++----
>  4 files changed, 119 insertions(+), 26 deletions(-)

Applied, thanks.

I made minor changes to the code and man page in separate commits.

-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com


^ permalink raw reply

* [PATCH] Various subsystems: avoid UB from ref counts
From: Jonathan Gruber @ 2026-02-24 10:23 UTC (permalink / raw)
  To: util-linux; +Cc: Jonathan Gruber

util-linux uses type signed int for reference counters. The functions
that increment reference counters thus risk undefined behavior (UB) if
the value of the reference counter is INT_MAX prior to the increment,
because overflow in signed integers is UB. A program that creates more
than INT_MAX coexistent references to some reference-counted object
would thus trigger UB by overflowing the reference counter over INT_MAX.
On systems with size_t larger than int, such as many 64-bit systems, it
is possible, given sufficient RAM, for a program to create more than
INT_MAX pointers holding the address of the same reference-counted
object and to attempt to make each of those pointers be a reference to
the reference-counted object, thereby overflowing the reference counter
over INT_MAX and triggering UB. It is best to protect against the
demonstrated *possibility* of this UB-triggering scenario regardless of
the scenario's probability.

While signed integer overflow is UB, it is likely to manifest in this
scenario as the reference counter wrapping from INT_MAX to INT_MIN.
However, the functions that decrement the reference counters deallocate
the reference-counted object if the value of the reference counter
becomes less than or equal to zero after the decrement. Therefore, if
the reference counter starts with a value of one and is incremented
INT_MAX + 2 times with no intervening decrements, then, assuming that
the resulting integer overflow manifests as a wrap from INT_MAX to
INT_MIN, the value of the reference counter would become INT_MIN + 2. If
the reference counter is then decremented once, then its value would
become INT_MIN + 1, which is less than zero, so the reference-counted
object would be deallocated even though there are still
1 + (INT_MAX + 2) - 1 = INT_MAX + 2 live references to the object. Since
the object has been deallocated, any access to the remaining references
would trigger UB. Additionally, if the reference counter is *attempted*
to be decremented again (which would trigger UB since the
reference-counted object has been deallocated), then, assuming that the
memory formerly occupied by the reference-counted object has somehow not
been reallocated to another object or overwritten, and assuming that the
UB from the attempted decrement manifests as an actual decrement, the
"value" of the (deallocated) reference counter would become INT_MIN,
which is less than zero, so the already-deallocated reference-counted
object would be deallocated again, resulting in a double free, which
also triggers UB.

This patch attempts to address the UB from the reference counters. In
order to avoid UB from overflowing the reference counters, this patch
changes the types of the reference counters to an unsigned integer type,
since overflow for unsigned integer types is not UB but wraps; in this
case, if the reference counter overflows, then its value would wrap to
zero. In order to avoid the UB resulting from deallocating the
reference-counted object when there are still live references to the
object, this patch ensures that the value of the reference counter is
zero only if there are actually no live references to the
reference-counted object. This is done by calling abort() in the
functions that increment reference counters when the reference counter
overflows; this behavior is also documented in the documentation
comments for the functions. The choice to call abort() was made for
simplicity and because the *least bad* result of accessing a reference
counted object that has been deallocated too early is for the program to
crash, which is also what calling abort() triggers. Finally, the
unsigned integer type that was chosen for the reference counters is
size_t; this choice minimizes the risk of overflowing the reference
counter and triggering an abort() because storing more than SIZE_MAX
coexistent pointers/references to a reference-counted object would
require more than SIZE_MAX bytes of memory. size_t can be larger than
int, so this patch might increase the sizes of some reference-counted
objects, but this increase should be miniscule.

Signed-off-by: Jonathan Gruber <jonathan.gruber.jg@gmail.com>
---
 include/path.h                |  2 +-
 lib/path.c                    | 22 +++++++++++++++--
 libfdisk/src/ask.c            | 18 +++++++++++---
 libfdisk/src/context.c        | 18 ++++++++++++--
 libfdisk/src/fdiskP.h         | 15 ++++++------
 libfdisk/src/item.c           | 16 +++++++++++--
 libfdisk/src/partition.c      | 19 ++++++++++++---
 libfdisk/src/parttype.c       | 16 +++++++++++--
 libfdisk/src/script.c         | 19 ++++++++++++---
 libfdisk/src/table.c          | 17 +++++++++++--
 libmount/src/cache.c          | 20 ++++++++++++----
 libmount/src/fs.c             | 21 ++++++++++++----
 libmount/src/fs_statmount.c   | 18 +++++++++++---
 libmount/src/lock.c           | 21 ++++++++++++----
 libmount/src/monitor.c        | 16 +++++++++++--
 libmount/src/monitor.h        |  3 ++-
 libmount/src/mountP.h         | 10 ++++----
 libmount/src/optlist.c        | 23 ++++++++++++++++--
 libmount/src/tab.c            | 19 +++++++++++----
 libsmartcols/src/column.c     | 15 ++++++++++--
 libsmartcols/src/filter.c     | 34 +++++++++++++++++++++++---
 libsmartcols/src/grouping.c   | 24 +++++++++++++++++--
 libsmartcols/src/line.c       | 15 ++++++++++--
 libsmartcols/src/smartcolsP.h | 18 +++++++-------
 libsmartcols/src/symbols.c    | 15 ++++++++++--
 libsmartcols/src/table.c      | 15 ++++++++++--
 misc-utils/lsblk-devtree.c    | 45 +++++++++++++++++++++++++++++++----
 misc-utils/lsblk.h            |  4 ++--
 sys-utils/lscpu-cpu.c         | 23 ++++++++++++++++--
 sys-utils/lscpu-cputype.c     | 23 +++++++++++++++---
 sys-utils/lscpu.h             |  5 ++--
 31 files changed, 454 insertions(+), 95 deletions(-)

diff --git a/include/path.h b/include/path.h
index 60a6162df..1b403d66e 100644
--- a/include/path.h
+++ b/include/path.h
@@ -17,7 +17,7 @@ struct path_cxt {
 	int	dir_fd;
 	char	*dir_path;
 
-	int	refcount;
+	size_t	refcount;
 
 	char *prefix;
 	char path_buffer[PATH_MAX];
diff --git a/lib/path.c b/lib/path.c
index 6ce8a10d2..10aaa7b5c 100644
--- a/lib/path.c
+++ b/lib/path.c
@@ -18,6 +18,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <inttypes.h>
 #include <errno.h>
 
@@ -79,10 +80,27 @@ fail:
 	return NULL;
 }
 
+/**
+ * ul_ref_path:
+ * @pc: path_cxt instance
+ *
+ * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
+ */
 void ul_ref_path(struct path_cxt *pc)
 {
-	if (pc)
+	if (pc) {
 		pc->refcount++;
+		/*
+		 * pc->refcount == 0 now if and only if
+		 * pc->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (pc->refcount == 0)
+			abort();
+	}
 }
 
 void ul_unref_path(struct path_cxt *pc)
@@ -92,7 +110,7 @@ void ul_unref_path(struct path_cxt *pc)
 
 	pc->refcount--;
 
-	if (pc->refcount <= 0) {
+	if (pc->refcount == 0) {
 		DBG(CXT, ul_debugobj(pc, "dealloc"));
 		if (pc->dialect)
 			pc->free_dialect(pc);
diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c
index 507cc6fc6..3ce472aa4 100644
--- a/libfdisk/src/ask.c
+++ b/libfdisk/src/ask.c
@@ -3,6 +3,7 @@
 #include "fdiskP.h"
 
 #include <stdarg.h>
+#include <stdlib.h>
 
 /**
  * SECTION: ask
@@ -49,7 +50,7 @@ struct fdisk_ask *fdisk_new_ask(void)
 
 void fdisk_reset_ask(struct fdisk_ask *ask)
 {
-	int refcount;
+	size_t refcount;
 
 	assert(ask);
 	free(ask->query);
@@ -69,11 +70,22 @@ void fdisk_reset_ask(struct fdisk_ask *ask)
  * @ask: ask instance
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void fdisk_ref_ask(struct fdisk_ask *ask)
 {
-	if (ask)
+	if (ask) {
 		ask->refcount++;
+		/*
+		 * ask->refcount == 0 now if and only if
+		 * ask->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (ask->refcount == 0)
+			abort();
+	}
 }
 
 
@@ -90,7 +102,7 @@ void fdisk_unref_ask(struct fdisk_ask *ask)
 		return;
 	ask->refcount--;
 
-	if (ask->refcount <= 0) {
+	if (ask->refcount == 0) {
 		fdisk_reset_ask(ask);
 		DBG(ASK, ul_debugobj(ask, "free"));
 		free(ask);
diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c
index bc46f1f62..6d8faa8ff 100644
--- a/libfdisk/src/context.c
+++ b/libfdisk/src/context.c
@@ -1,3 +1,6 @@
+
+#include <stdlib.h>
+
 #ifdef HAVE_LIBBLKID
 # include <blkid.h>
 #endif
@@ -199,11 +202,22 @@ struct fdisk_context *fdisk_new_nested_context(struct fdisk_context *parent,
  * @cxt: context pointer
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void fdisk_ref_context(struct fdisk_context *cxt)
 {
-	if (cxt)
+	if (cxt) {
 		cxt->refcount++;
+		/*
+		 * ctx->refcount == 0 now if and only if
+		 * ctx->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (cxt->refcount == 0)
+			abort();
+	}
 }
 
 /**
@@ -1089,7 +1103,7 @@ void fdisk_unref_context(struct fdisk_context *cxt)
 		return;
 
 	cxt->refcount--;
-	if (cxt->refcount <= 0) {
+	if (cxt->refcount == 0) {
 		DBG(CXT, ul_debugobj(cxt, "freeing context %p for %s", cxt, cxt->dev_path));
 
 		reset_context(cxt);	/* this is sensitive to parent<->child relationship! */
diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
index e3e57929a..e1af40588 100644
--- a/libfdisk/src/fdiskP.h
+++ b/libfdisk/src/fdiskP.h
@@ -107,12 +107,13 @@ struct fdisk_iter {
  * Partition types
  */
 struct fdisk_parttype {
-	unsigned int	code;		/* type as number or zero */
+	size_t		refcount;	/* reference counter for allocated types */
+
 	char		*name;		/* description */
 	char		*typestr;	/* type as string or NULL */
 
+	unsigned int	code;		/* type as number or zero */
 	unsigned int	flags;		/* FDISK_PARTTYPE_* flags */
-	int		refcount;	/* reference counter for allocated types */
 };
 
 enum {
@@ -136,7 +137,7 @@ struct fdisk_shortcut {
 };
 
 struct fdisk_partition {
-	int		refcount;		/* reference counter */
+	size_t		refcount;		/* reference counter */
 
 	size_t		partno;			/* partition number */
 	size_t		parent_partno;		/* for logical partitions */
@@ -200,7 +201,7 @@ enum {
 
 struct fdisk_table {
 	struct list_head	parts;		/* partitions */
-	int			refcount;
+	size_t			refcount;
 	size_t			nents;		/* number of partitions */
 };
 
@@ -340,7 +341,7 @@ struct fdisk_ask {
 	int		type;		/* FDISK_ASKTYPE_* */
 	char		*query;
 
-	int		refcount;
+	size_t		refcount;
 
 	union {
 		/* FDISK_ASKTYPE_{NUMBER,OFFSET} */
@@ -384,7 +385,7 @@ struct fdisk_context {
 	char *dev_model;    /* on linux /sys/block/<name>/device/model or NULL */
 	struct stat dev_st; /* stat(2) result */
 
-	int refcount;
+	size_t refcount;
 
 	unsigned char *firstsector; /* buffer with master boot record */
 	unsigned long firstsector_bufsz;
@@ -484,7 +485,7 @@ extern int fdisk_probe_labels(struct fdisk_context *cxt);
 extern void fdisk_deinit_label(struct fdisk_label *lb);
 
 struct fdisk_labelitem {
-	int		refcount;	/* reference counter */
+	size_t		refcount;	/* reference counter */
 	int		id;		/* <label>_ITEM_* */
 	char		type;		/* s = string, j = uint64 */
 	const char	*name;		/* human readable name */
diff --git a/libfdisk/src/item.c b/libfdisk/src/item.c
index 9e2f44ca1..3c2802c5e 100644
--- a/libfdisk/src/item.c
+++ b/libfdisk/src/item.c
@@ -1,5 +1,6 @@
 
 #include <inttypes.h>
+#include <stdlib.h>
 
 #include "fdiskP.h"
 
@@ -53,6 +54,8 @@ struct fdisk_labelitem *fdisk_new_labelitem(void)
  * @li: label item
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
+ *
  * Since: 2.29
  */
 void fdisk_ref_labelitem(struct fdisk_labelitem *li)
@@ -61,6 +64,15 @@ void fdisk_ref_labelitem(struct fdisk_labelitem *li)
 		/* make sure we do not use refcounting for static items */
 		assert(li->refcount > 0);
 		li->refcount++;
+		/*
+		 * li->refcount == 0 now if and only if
+		 * li->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (li->refcount == 0)
+			abort();
 	}
 }
 
@@ -75,7 +87,7 @@ void fdisk_ref_labelitem(struct fdisk_labelitem *li)
  */
 int fdisk_reset_labelitem(struct fdisk_labelitem *li)
 {
-	int refcount;
+	size_t refcount;
 
 	if (!li)
 		return -EINVAL;
@@ -106,7 +118,7 @@ void fdisk_unref_labelitem(struct fdisk_labelitem *li)
 	assert(li->refcount > 0);
 
 	li->refcount--;
-	if (li->refcount <= 0) {
+	if (li->refcount == 0) {
 		DBG(ITEM, ul_debugobj(li, "free"));
 		fdisk_reset_labelitem(li);
 		free(li);
diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c
index 9a5614d21..0ef16b602 100644
--- a/libfdisk/src/partition.c
+++ b/libfdisk/src/partition.c
@@ -1,4 +1,6 @@
 
+#include <stdlib.h>
+
 #include "c.h"
 #include "strutils.h"
 
@@ -57,7 +59,7 @@ struct fdisk_partition *fdisk_new_partition(void)
  */
 void fdisk_reset_partition(struct fdisk_partition *pa)
 {
-	int ref;
+	size_t ref;
 
 	if (!pa)
 		return;
@@ -137,11 +139,22 @@ static struct fdisk_partition *__copy_partition(struct fdisk_partition *o)
  * @pa: partition pointer
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void fdisk_ref_partition(struct fdisk_partition *pa)
 {
-	if (pa)
+	if (pa) {
 		pa->refcount++;
+		/*
+		 * pa->refcount == 0 now if and only if
+		 * pa->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (pa->refcount == 0)
+			abort();
+	}
 }
 
 /**
@@ -157,7 +170,7 @@ void fdisk_unref_partition(struct fdisk_partition *pa)
 		return;
 
 	pa->refcount--;
-	if (pa->refcount <= 0) {
+	if (pa->refcount == 0) {
 		list_del(&pa->parts);
 		fdisk_reset_partition(pa);
 		DBG(PART, ul_debugobj(pa, "free"));
diff --git a/libfdisk/src/parttype.c b/libfdisk/src/parttype.c
index 8e36ada74..026d8ef64 100644
--- a/libfdisk/src/parttype.c
+++ b/libfdisk/src/parttype.c
@@ -1,5 +1,6 @@
 
 #include <ctype.h>
+#include <stdlib.h>
 
 #include "fdiskP.h"
 #include "cctype.h"
@@ -41,11 +42,22 @@ struct fdisk_parttype *fdisk_new_parttype(void)
  * @t: partition type
  *
  * Increments reference counter for allocated types
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void fdisk_ref_parttype(struct fdisk_parttype *t)
 {
-	if (fdisk_parttype_is_allocated(t))
+	if (fdisk_parttype_is_allocated(t)) {
 		t->refcount++;
+		/*
+		 * t->refcount == 0 now if and only if
+		 * t->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (t->refcount == 0)
+			abort();
+	}
 }
 
 /**
@@ -61,7 +73,7 @@ void fdisk_unref_parttype(struct fdisk_parttype *t)
 		return;
 
 	t->refcount--;
-	if (t->refcount <= 0) {
+	if (t->refcount == 0) {
 		DBG(PARTTYPE, ul_debugobj(t, "free"));
 		free(t->typestr);
 		free(t->name);
diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c
index 62ca5eeb2..6ad1c9261 100644
--- a/libfdisk/src/script.c
+++ b/libfdisk/src/script.c
@@ -1,4 +1,6 @@
 
+#include <stdlib.h>
+
 #include "cctype.h"
 #include "fdiskP.h"
 #include "strutils.h"
@@ -56,7 +58,7 @@ struct fdisk_script {
 	struct list_head	headers;
 	struct fdisk_context	*cxt;
 
-	int			refcount;
+	size_t			refcount;
 	char			*(*fn_fgets)(struct fdisk_script *, char *, size_t, FILE *);
 	void			*userdata;
 
@@ -158,11 +160,22 @@ done:
  * @dp: script pointer
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void fdisk_ref_script(struct fdisk_script *dp)
 {
-	if (dp)
+	if (dp) {
 		dp->refcount++;
+		/*
+		 * dp->refcount == 0 now if and only if
+		 * dp->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (dp->refcount == 0)
+			abort();
+	}
 }
 
 static void fdisk_reset_script(struct fdisk_script *dp)
@@ -195,7 +208,7 @@ void fdisk_unref_script(struct fdisk_script *dp)
 		return;
 
 	dp->refcount--;
-	if (dp->refcount <= 0) {
+	if (dp->refcount == 0) {
 		fdisk_reset_script(dp);
 		fdisk_unref_context(dp->cxt);
 		fdisk_unref_table(dp->table);
diff --git a/libfdisk/src/table.c b/libfdisk/src/table.c
index 30955e1a6..ea9f26f7e 100644
--- a/libfdisk/src/table.c
+++ b/libfdisk/src/table.c
@@ -1,4 +1,6 @@
 
+#include <stdlib.h>
+
 #include "fdiskP.h"
 
 /**
@@ -66,11 +68,22 @@ int fdisk_reset_table(struct fdisk_table *tb)
  * @tb: table pointer
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void fdisk_ref_table(struct fdisk_table *tb)
 {
-	if (tb)
+	if (tb) {
 		tb->refcount++;
+		/*
+		 * tb->refcount == 0 now if and only if
+		 * tb->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (tb->refcount == 0)
+			abort();
+	}
 }
 
 /**
@@ -86,7 +99,7 @@ void fdisk_unref_table(struct fdisk_table *tb)
 		return;
 
 	tb->refcount--;
-	if (tb->refcount <= 0) {
+	if (tb->refcount == 0) {
 		fdisk_reset_table(tb);
 
 		DBG(TAB, ul_debugobj(tb, "free"));
diff --git a/libmount/src/cache.c b/libmount/src/cache.c
index 4d2a20f23..e94c67cf7 100644
--- a/libmount/src/cache.c
+++ b/libmount/src/cache.c
@@ -61,7 +61,7 @@ struct libmnt_cache {
 	struct mnt_cache_entry	*ents;
 	size_t			nents;
 	size_t			nallocs;
-	int			refcount;
+	size_t			refcount;
 	int			probe_sb_extra;	/* extra BLKID_SUBLKS_* flags */
 
 	/* blkid_evaluate_tag() works in two ways:
@@ -126,7 +126,7 @@ void mnt_free_cache(struct libmnt_cache *cache)
 	if (!cache)
 		return;
 
-	DBG(CACHE, ul_debugobj(cache, "free [refcount=%d]", cache->refcount));
+	DBG(CACHE, ul_debugobj(cache, "free [refcount=%zu]", cache->refcount));
 
 	for (i = 0; i < cache->nents; i++) {
 		struct mnt_cache_entry *e = &cache->ents[i];
@@ -145,12 +145,22 @@ void mnt_free_cache(struct libmnt_cache *cache)
  * @cache: cache pointer
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void mnt_ref_cache(struct libmnt_cache *cache)
 {
 	if (cache) {
 		cache->refcount++;
-		/*DBG(CACHE, ul_debugobj(cache, "ref=%d", cache->refcount));*/
+		/*DBG(CACHE, ul_debugobj(cache, "ref=%zu", cache->refcount));*/
+		/*
+		 * cache->refcount == 0 now if and only if
+		 * cache->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (cache->refcount == 0)
+			abort();
 	}
 }
 
@@ -165,8 +175,8 @@ void mnt_unref_cache(struct libmnt_cache *cache)
 {
 	if (cache) {
 		cache->refcount--;
-		/*DBG(CACHE, ul_debugobj(cache, "unref=%d", cache->refcount));*/
-		if (cache->refcount <= 0) {
+		/*DBG(CACHE, ul_debugobj(cache, "unref=%zu", cache->refcount));*/
+		if (cache->refcount == 0) {
 			mnt_unref_table(cache->mountinfo);
 
 			mnt_free_cache(cache);
diff --git a/libmount/src/fs.c b/libmount/src/fs.c
index a9b738022..5af562aa8 100644
--- a/libmount/src/fs.c
+++ b/libmount/src/fs.c
@@ -19,6 +19,7 @@
 #include <ctype.h>
 #include <blkid.h>
 #include <stddef.h>
+#include <stdlib.h>
 
 #include "mountP.h"
 #include "strutils.h"
@@ -58,7 +59,7 @@ void mnt_free_fs(struct libmnt_fs *fs)
 	if (!fs)
 		return;
 
-	DBG(FS, ul_debugobj(fs, "free [refcount=%d]", fs->refcount));
+	DBG(FS, ul_debugobj(fs, "free [refcount=%zu]", fs->refcount));
 
 	mnt_reset_fs(fs);
 	free(fs);
@@ -72,7 +73,7 @@ void mnt_free_fs(struct libmnt_fs *fs)
  */
 void mnt_reset_fs(struct libmnt_fs *fs)
 {
-	int ref;
+	size_t ref;
 
 	if (!fs)
 		return;
@@ -116,12 +117,22 @@ void mnt_reset_fs(struct libmnt_fs *fs)
  * @fs: fs pointer
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void mnt_ref_fs(struct libmnt_fs *fs)
 {
 	if (fs) {
 		fs->refcount++;
-		/*DBG(FS, ul_debugobj(fs, "ref=%d", fs->refcount));*/
+		/*DBG(FS, ul_debugobj(fs, "ref=%zu", fs->refcount));*/
+		/*
+		 * fs->refcount == 0 now if and only if
+		 * fs->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (fs->refcount == 0)
+			abort();
 	}
 }
 
@@ -136,8 +147,8 @@ void mnt_unref_fs(struct libmnt_fs *fs)
 {
 	if (fs) {
 		fs->refcount--;
-		/*DBG(FS, ul_debugobj(fs, "unref=%d", fs->refcount));*/
-		if (fs->refcount <= 0)
+		/*DBG(FS, ul_debugobj(fs, "unref=%zu", fs->refcount));*/
+		if (fs->refcount == 0)
 			mnt_free_fs(fs);
 	}
 }
diff --git a/libmount/src/fs_statmount.c b/libmount/src/fs_statmount.c
index 599ee8c52..a1b1dca53 100644
--- a/libmount/src/fs_statmount.c
+++ b/libmount/src/fs_statmount.c
@@ -15,6 +15,8 @@
  * @title: statmount setting
  * @short_description: Fetches information about mount node from the kernel.
  */
+#include <stdlib.h>
+
 #include "mountP.h"
 
 #include "mangle.h"
@@ -56,12 +58,22 @@ struct libmnt_statmnt *mnt_new_statmnt(void)
  * @sm: statmount setting
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void mnt_ref_statmnt(struct libmnt_statmnt *sm)
 {
 	if (sm) {
 		sm->refcount++;
-		/*DBG(STATMNT, ul_debugobj(sm, "ref=%d", sm->refcount));*/
+		/*DBG(STATMNT, ul_debugobj(sm, "ref=%zu", sm->refcount));*/
+		/*
+		 * sm->refcount == 0 now if and only if
+		 * sm->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (sm->refcount == 0)
+			abort();
 	}
 }
 
@@ -76,8 +88,8 @@ void mnt_unref_statmnt(struct libmnt_statmnt *sm)
 {
 	if (sm) {
 		sm->refcount--;
-		/*DBG(STATMNT, ul_debugobj(sm, "unref=%d", sm->refcount));*/
-		if (sm->refcount <= 0) {
+		/*DBG(STATMNT, ul_debugobj(sm, "unref=%zu", sm->refcount));*/
+		if (sm->refcount == 0) {
 			free(sm->buf);
 			free(sm);
 		}
diff --git a/libmount/src/lock.c b/libmount/src/lock.c
index 28ff8b788..b4ec0e3f2 100644
--- a/libmount/src/lock.c
+++ b/libmount/src/lock.c
@@ -25,6 +25,7 @@
 #include <fcntl.h>
 #include <limits.h>
 #include <sys/file.h>
+#include <stdlib.h>
 
 #include "strutils.h"
 #include "closestream.h"
@@ -36,7 +37,7 @@
  * lock handler
  */
 struct libmnt_lock {
-	int	refcount;	/* reference counter */
+	size_t	refcount;	/* reference counter */
 	char	*lockfile;	/* path to lock file (e.g. /etc/mtab~) */
 	int	lockfile_fd;	/* lock file descriptor */
 
@@ -101,7 +102,7 @@ void mnt_free_lock(struct libmnt_lock *ml)
 	if (!ml)
 		return;
 
-	DBG(LOCKS, ul_debugobj(ml, "free%s [refcount=%d]",
+	DBG(LOCKS, ul_debugobj(ml, "free%s [refcount=%zu]",
 					ml->locked ? " !!! LOCKED !!!" : "",
 					ml->refcount));
 	free(ml->lockfile);
@@ -113,6 +114,7 @@ void mnt_free_lock(struct libmnt_lock *ml)
  * @ml: lock pointer
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  *
  * Since: 2.40
  */
@@ -120,7 +122,16 @@ void mnt_ref_lock(struct libmnt_lock *ml)
 {
 	if (ml) {
 		ml->refcount++;
-		/*DBG(FS, ul_debugobj(fs, "ref=%d", ml->refcount));*/
+		/*DBG(FS, ul_debugobj(fs, "ref=%zu", ml->refcount));*/
+		/*
+		 * ml->refcount == 0 now if and only if
+		 * ml->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (ml->refcount == 0)
+			abort();
 	}
 }
 
@@ -135,8 +146,8 @@ void mnt_unref_lock(struct libmnt_lock *ml)
 {
 	if (ml) {
 		ml->refcount--;
-		/*DBG(FS, ul_debugobj(fs, "unref=%d", ml->refcount));*/
-		if (ml->refcount <= 0)
+		/*DBG(FS, ul_debugobj(fs, "unref=%zu", ml->refcount));*/
+		if (ml->refcount == 0)
 			mnt_free_lock(ml);
 	}
 }
diff --git a/libmount/src/monitor.c b/libmount/src/monitor.c
index 194817aac..35c70857b 100644
--- a/libmount/src/monitor.c
+++ b/libmount/src/monitor.c
@@ -38,6 +38,7 @@
 #include "mountP.h"
 #include "monitor.h"
 
+#include <stdlib.h>
 #include <sys/epoll.h>
 
 /**
@@ -67,11 +68,22 @@ struct libmnt_monitor *mnt_new_monitor(void)
  * @mn: monitor pointer
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void mnt_ref_monitor(struct libmnt_monitor *mn)
 {
-	if (mn)
+	if (mn) {
 		mn->refcount++;
+		/*
+		 * mn->refcount == 0 now if and only if
+		 * mn->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (mn->refcount == 0)
+			abort();
+	}
 }
 
 void free_monitor_entry(struct monitor_entry *me)
@@ -102,7 +114,7 @@ void mnt_unref_monitor(struct libmnt_monitor *mn)
 		return;
 
 	mn->refcount--;
-	if (mn->refcount <= 0) {
+	if (mn->refcount == 0) {
 		mnt_monitor_close_fd(mn);	/* destroys all file descriptors */
 
 		while (!list_empty(&mn->ents)) {
diff --git a/libmount/src/monitor.h b/libmount/src/monitor.h
index a7859c075..b17b271be 100644
--- a/libmount/src/monitor.h
+++ b/libmount/src/monitor.h
@@ -6,6 +6,7 @@
 
 #include "c.h"
 #include <stdbool.h>
+#include <stddef.h>
 
 struct monitor_opers;
 
@@ -26,7 +27,7 @@ struct monitor_entry {
 };
 
 struct libmnt_monitor {
-	int			refcount;
+	size_t			refcount;
 	int			fd;		/* public monitor file descriptor */
 
 	struct list_head	ents;
diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h
index 7a6a4fbe2..41dee526f 100644
--- a/libmount/src/mountP.h
+++ b/libmount/src/mountP.h
@@ -205,13 +205,13 @@ struct libmnt_iter {
  * statmount setting; shared between tables and filesystems
  */
 struct libmnt_statmnt {
-	int             refcount;
-	uint64_t        mask;           /* default statmount() mask */
+	size_t		refcount;
+	uint64_t	mask;           /* default statmount() mask */
 
 	struct ul_statmount *buf;
 	size_t bufsiz;
 
-	unsigned int    disabled: 1;    /* enable or disable statmount() */
+	unsigned int	disabled: 1;    /* enable or disable statmount() */
 };
 
 
@@ -223,7 +223,7 @@ struct libmnt_fs {
 	struct list_head ents;
 	struct libmnt_table *tab;
 
-	int		refcount;	/* reference counter */
+	size_t		refcount;	/* reference counter */
 
 	unsigned int	opts_age;	/* to sync with optlist */
 	struct libmnt_optlist *optlist;
@@ -322,7 +322,7 @@ static inline void mnt_fs_mark_moved(struct libmnt_fs *fs)
 struct libmnt_table {
 	int		fmt;		/* MNT_FMT_* file format */
 	int		nents;		/* number of entries */
-	int		refcount;	/* reference counter */
+	size_t		refcount;	/* reference counter */
 	int		comms;		/* enable/disable comment parsing */
 	char		*comm_intro;	/* First comment in file */
 	char		*comm_tail;	/* Last comment in file */
diff --git a/libmount/src/optlist.c b/libmount/src/optlist.c
index 5bb32c6a8..0b6f6cd19 100644
--- a/libmount/src/optlist.c
+++ b/libmount/src/optlist.c
@@ -13,6 +13,8 @@
  * The "optlist" is container for parsed mount options.
  *
  */
+#include <stdlib.h>
+
 #include "strutils.h"
 #include "list.h"
 #include "mountP.h"
@@ -51,7 +53,7 @@ struct libmnt_opt {
 };
 
 struct libmnt_optlist {
-	int refcount;
+	size_t refcount;
 	unsigned int age;			/* incremented after each change */
 
 	const struct libmnt_optmap	*linux_map;	/* map with MS_ flags */
@@ -90,10 +92,27 @@ struct libmnt_optlist *mnt_new_optlist(void)
 	return ls;
 }
 
+/**
+ * mnt_ref_optlist:
+ * @ls: optlist instance
+ *
+ * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
+ */
 void mnt_ref_optlist(struct libmnt_optlist *ls)
 {
-	if (ls)
+	if (ls) {
 		ls->refcount++;
+		/*
+		 * ls->refcount == 0 now if and only if
+		 * ls->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (ls->refcount == 0)
+			abort();
+	}
 }
 
 static void reset_cache(struct optlist_cache *cache)
diff --git a/libmount/src/tab.c b/libmount/src/tab.c
index 0d2b0ecd4..903cad522 100644
--- a/libmount/src/tab.c
+++ b/libmount/src/tab.c
@@ -48,6 +48,7 @@
  * will return the first entry (if UUID matches with the device).
  */
 #include <blkid.h>
+#include <stdlib.h>
 
 #include "mountP.h"
 #include "strutils.h"
@@ -126,12 +127,22 @@ int mnt_reset_table(struct libmnt_table *tb)
  * @tb: table pointer
  *
  * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void mnt_ref_table(struct libmnt_table *tb)
 {
 	if (tb) {
 		tb->refcount++;
-		/*DBG(FS, ul_debugobj(tb, "ref=%d", tb->refcount));*/
+		/*DBG(FS, ul_debugobj(tb, "ref=%zu", tb->refcount));*/
+		/*
+		 * tb->refcount == 0 now if and only if
+		 * tb->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (tb->refcount == 0)
+			abort();
 	}
 }
 
@@ -146,8 +157,8 @@ void mnt_unref_table(struct libmnt_table *tb)
 {
 	if (tb) {
 		tb->refcount--;
-		/*DBG(FS, ul_debugobj(tb, "unref=%d", tb->refcount));*/
-		if (tb->refcount <= 0)
+		/*DBG(FS, ul_debugobj(tb, "unref=%zu", tb->refcount));*/
+		if (tb->refcount == 0)
 			mnt_free_table(tb);
 	}
 }
@@ -169,7 +180,7 @@ void mnt_free_table(struct libmnt_table *tb)
 		return;
 
 	mnt_reset_table(tb);
-	DBG(TAB, ul_debugobj(tb, "free [refcount=%d]", tb->refcount));
+	DBG(TAB, ul_debugobj(tb, "free [refcount=%zu]", tb->refcount));
 
 	mnt_unref_cache(tb->cache);
 	free(tb->comm_intro);
diff --git a/libsmartcols/src/column.c b/libsmartcols/src/column.c
index a36e54690..f29475db2 100644
--- a/libsmartcols/src/column.c
+++ b/libsmartcols/src/column.c
@@ -51,11 +51,22 @@ struct libscols_column *scols_new_column(void)
  * @cl: a pointer to a struct libscols_column instance
  *
  * Increases the refcount of @cl.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void scols_ref_column(struct libscols_column *cl)
 {
-	if (cl)
+	if (cl) {
 		cl->refcount++;
+		/*
+		 * cl->refcount == 0 now if and only if
+		 * cl->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (cl->refcount == 0)
+			abort();
+	}
 }
 
 /**
@@ -67,7 +78,7 @@ void scols_ref_column(struct libscols_column *cl)
  */
 void scols_unref_column(struct libscols_column *cl)
 {
-	if (cl && --cl->refcount <= 0) {
+	if (cl && --cl->refcount == 0) {
 		DBG(COL, ul_debugobj(cl, "dealloc"));
 		list_del(&cl->cl_columns);
 		scols_reset_cell(&cl->header);
diff --git a/libsmartcols/src/filter.c b/libsmartcols/src/filter.c
index 4923cd802..a9254d9cd 100644
--- a/libsmartcols/src/filter.c
+++ b/libsmartcols/src/filter.c
@@ -60,13 +60,24 @@ struct libscols_filter *scols_new_filter(const char *str)
  * @fltr: filter instance
  *
  * Increment filter reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  *
  * Since: 2.40
  */
 void scols_ref_filter(struct libscols_filter *fltr)
 {
-	if (fltr)
+	if (fltr) {
 		fltr->refcount++;
+		/*
+		 * fltr->refcount == 0 now if and only if
+		 * fltr->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (fltr->refcount == 0)
+			abort();
+	}
 }
 
 static void reset_filter(struct libscols_filter *fltr)
@@ -112,7 +123,7 @@ static void remove_counters(struct libscols_filter *fltr)
  */
 void scols_unref_filter(struct libscols_filter *fltr)
 {
-	if (fltr && --fltr->refcount <= 0) {
+	if (fltr && --fltr->refcount == 0) {
 		DBG(FLTR, ul_debugobj(fltr, "dealloc"));
 		reset_filter(fltr);
 		remove_counters(fltr);
@@ -149,10 +160,27 @@ void filter_unref_node(struct filter_node *n)
 	}
 }
 
+/**
+ * filter_ref_node:
+ * @n: filter_node instance
+ *
+ * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
+ */
 void filter_ref_node(struct filter_node *n)
 {
-	if (n)
+	if (n) {
 		n->refcount++;
+		/*
+		 * n->refcount == 0 now if and only if
+		 * n->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (n->refcount == 0)
+			abort();
+	}
 }
 
 void filter_dump_node(struct ul_jsonwrt *json, struct filter_node *n)
diff --git a/libsmartcols/src/grouping.c b/libsmartcols/src/grouping.c
index 7e004b647..7445a7fb4 100644
--- a/libsmartcols/src/grouping.c
+++ b/libsmartcols/src/grouping.c
@@ -1,6 +1,8 @@
 /*
  * Copyright (C) 2018 Karel Zak <kzak@redhat.com>
  */
+#include <stdlib.h>
+
 #include "smartcolsP.h"
 
 /**
@@ -15,10 +17,28 @@
  */
 
 /* Private API */
+
+/**
+ * scols_ref_group:
+ * @gr: group instance
+ *
+ * Increments reference counter.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
+ */
 void scols_ref_group(struct libscols_group *gr)
 {
-	if (gr)
+	if (gr) {
 		gr->refcount++;
+		/*
+		 * gr->refcount == 0 now if and only if
+		 * gr->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (gr->refcount == 0)
+			abort();
+	}
 }
 
 void scols_group_remove_children(struct libscols_group *gr)
@@ -61,7 +81,7 @@ void scols_group_remove_members(struct libscols_group *gr)
 /* note group has to be already without members to deallocate */
 void scols_unref_group(struct libscols_group *gr)
 {
-	if (gr && --gr->refcount <= 0) {
+	if (gr && --gr->refcount == 0) {
 		DBG(GROUP, ul_debugobj(gr, "dealloc"));
 		scols_group_remove_children(gr);
 		list_del(&gr->gr_groups);
diff --git a/libsmartcols/src/line.c b/libsmartcols/src/line.c
index ffefcfba0..7789ed3aa 100644
--- a/libsmartcols/src/line.c
+++ b/libsmartcols/src/line.c
@@ -56,11 +56,22 @@ struct libscols_line *scols_new_line(void)
  * @ln: a pointer to a struct libscols_line instance
  *
  * Increases the refcount of @ln.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void scols_ref_line(struct libscols_line *ln)
 {
-	if (ln)
+	if (ln) {
 		ln->refcount++;
+		/*
+		 * ln->refcount == 0 now if and only if
+		 * ln->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (ln->refcount == 0)
+			abort();
+	}
 }
 
 /**
@@ -72,7 +83,7 @@ void scols_ref_line(struct libscols_line *ln)
  */
 void scols_unref_line(struct libscols_line *ln)
 {
-	if (ln && --ln->refcount <= 0) {
+	if (ln && --ln->refcount == 0) {
 		DBG(CELL, ul_debugobj(ln, "dealloc"));
 		list_del(&ln->ln_lines);
 		list_del(&ln->ln_children);
diff --git a/libsmartcols/src/smartcolsP.h b/libsmartcols/src/smartcolsP.h
index 1e9dcec01..8e6e92d09 100644
--- a/libsmartcols/src/smartcolsP.h
+++ b/libsmartcols/src/smartcolsP.h
@@ -61,7 +61,7 @@ struct libscols_iter {
  * Tree symbols
  */
 struct libscols_symbols {
-	int	refcount;
+	size_t	refcount;
 
 	char	*tree_branch;
 	char	*tree_vert;
@@ -69,7 +69,7 @@ struct libscols_symbols {
 
 	char	*group_vert;
 	char	*group_horz;
-	char    *group_first_member;
+	char	*group_first_member;
 	char	*group_last_member;
 	char	*group_middle_member;
 	char	*group_last_child;
@@ -111,7 +111,7 @@ struct libscols_wstat {
  * Table column
  */
 struct libscols_column {
-	int	refcount;	/* reference counter */
+	size_t	refcount;	/* reference counter */
 	size_t	seqnum;		/* column index */
 
 	size_t	width;		/* expected column width */
@@ -182,9 +182,9 @@ enum {
 #define SCOLS_GRPSET_CHUNKSIZ	3
 
 struct libscols_group {
-	int     refcount;
+	size_t	refcount;
 
-	size_t  nmembers;
+	size_t	nmembers;
 
 	struct list_head gr_members;	/* head of line->ln_group */
 	struct list_head gr_children;	/* head of line->ln_children */
@@ -197,7 +197,7 @@ struct libscols_group {
  * Table line
  */
 struct libscols_line {
-	int	refcount;
+	size_t	refcount;
 	size_t	seqnum;
 
 	void	*userdata;
@@ -227,7 +227,7 @@ enum {
  * The table
  */
 struct libscols_table {
-	int	refcount;
+	size_t	refcount;
 	char	*name;		/* optional table name (for JSON) */
 	size_t	ncols;		/* number of columns */
 	size_t  ntreecols;	/* number of columns with SCOLS_FL_TREE */
@@ -527,7 +527,7 @@ enum filter_etype {
 
 struct filter_node {
 	enum filter_ntype type;
-	int refcount;
+	size_t refcount;
 };
 
 #define filter_node_get_type(n)	(((struct filter_node *)(n))->type)
@@ -549,7 +549,7 @@ struct libscols_counter {
 };
 
 struct libscols_filter {
-	int refcount;
+	size_t refcount;
 	char *errmsg;
 	struct filter_node *root;
 	FILE *src;
diff --git a/libsmartcols/src/symbols.c b/libsmartcols/src/symbols.c
index 2fadfc7ad..9acb62fa3 100644
--- a/libsmartcols/src/symbols.c
+++ b/libsmartcols/src/symbols.c
@@ -43,11 +43,22 @@ struct libscols_symbols *scols_new_symbols(void)
  * @sy: a pointer to a struct libscols_symbols instance
  *
  * Increases the refcount of @sy.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void scols_ref_symbols(struct libscols_symbols *sy)
 {
-	if (sy)
+	if (sy) {
 		sy->refcount++;
+		/*
+		 * sy->refcount == 0 now if and only if
+		 * sy->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (sy->refcount == 0)
+			abort();
+	}
 }
 
 /**
@@ -58,7 +69,7 @@ void scols_ref_symbols(struct libscols_symbols *sy)
  */
 void scols_unref_symbols(struct libscols_symbols *sy)
 {
-	if (sy && --sy->refcount <= 0) {
+	if (sy && --sy->refcount == 0) {
 		free(sy->tree_branch);
 		free(sy->tree_vert);
 		free(sy->tree_right);
diff --git a/libsmartcols/src/table.c b/libsmartcols/src/table.c
index aa7cdf3c6..9d60519e5 100644
--- a/libsmartcols/src/table.c
+++ b/libsmartcols/src/table.c
@@ -96,11 +96,22 @@ struct libscols_table *scols_new_table(void)
  * @tb: a pointer to a struct libscols_table instance
  *
  * Increases the refcount of @tb.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
  */
 void scols_ref_table(struct libscols_table *tb)
 {
-	if (tb)
+	if (tb) {
 		tb->refcount++;
+		/*
+		 * tb->refcount == 0 now if and only if
+		 * tb->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (tb->refcount == 0)
+			abort();
+	}
 }
 
 static void scols_table_remove_groups(struct libscols_table *tb)
@@ -123,7 +134,7 @@ static void scols_table_remove_groups(struct libscols_table *tb)
  */
 void scols_unref_table(struct libscols_table *tb)
 {
-	if (tb && (--tb->refcount <= 0)) {
+	if (tb && (--tb->refcount == 0)) {
 		DBG(TAB, ul_debugobj(tb, "dealloc <-"));
 		scols_table_remove_groups(tb);
 		scols_table_remove_lines(tb);
diff --git a/misc-utils/lsblk-devtree.c b/misc-utils/lsblk-devtree.c
index 5e9d38da1..1736c82ed 100644
--- a/misc-utils/lsblk-devtree.c
+++ b/misc-utils/lsblk-devtree.c
@@ -16,11 +16,12 @@
  *
  * Copyright (C) 2018 Karel Zak <kzak@redhat.com>
  */
+#include <stdlib.h>
+
 #include "lsblk.h"
 #include "sysfs.h"
 #include "pathnames.h"
 
-
 void lsblk_reset_iter(struct lsblk_iter *itr, int direction)
 {
 	if (direction == -1)
@@ -51,10 +52,27 @@ struct lsblk_device *lsblk_new_device(void)
 	return dev;
 }
 
+/**
+ * lsblk_ref_device:
+ * @dev: a pointer to a struct lsblk_device instance
+ *
+ * Increments the refcount of @dev.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
+ */
 void lsblk_ref_device(struct lsblk_device *dev)
 {
-	if (dev)
+	if (dev) {
 		dev->refcount++;
+		/*
+		 * dev->refcount == 0 now if and only if
+		 * dev->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (dev->refcount == 0)
+			abort();
+	}
 }
 
 /* removes dependence from child as well as from parent */
@@ -101,7 +119,7 @@ void lsblk_unref_device(struct lsblk_device *dev)
 	if (!dev)
 		return;
 
-	if (--dev->refcount <= 0) {
+	if (--dev->refcount == 0) {
 		DBG(DEV, ul_debugobj(dev, " freeing [%s] <<", dev->name));
 
 		device_remove_dependences(dev);
@@ -251,10 +269,27 @@ struct lsblk_devtree *lsblk_new_devtree(void)
 	return tr;
 }
 
+/**
+ * lsblk_ref_devtree:
+ * @tr: a pointer to a struct lsblk_devtree instance
+ *
+ * Increments the refcount of @tr.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
+ */
 void lsblk_ref_devtree(struct lsblk_devtree *tr)
 {
-	if (tr)
+	if (tr) {
 		tr->refcount++;
+		/*
+		 * tr->refcount == 0 now if and only if
+		 * tr->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (tr->refcount == 0)
+			abort();
+	}
 }
 
 void lsblk_unref_devtree(struct lsblk_devtree *tr)
@@ -262,7 +297,7 @@ void lsblk_unref_devtree(struct lsblk_devtree *tr)
 	if (!tr)
 		return;
 
-	if (--tr->refcount <= 0) {
+	if (--tr->refcount == 0) {
 		DBG(TREE, ul_debugobj(tr, "dealloc"));
 
 		while (!list_empty(&tr->devices)) {
diff --git a/misc-utils/lsblk.h b/misc-utils/lsblk.h
index 90d2df1a1..f51949ec0 100644
--- a/misc-utils/lsblk.h
+++ b/misc-utils/lsblk.h
@@ -124,7 +124,7 @@ struct lsblk_devdep {
 };
 
 struct lsblk_device {
-	int	refcount;
+	size_t	refcount;
 
 	struct list_head	childs;		/* list with lsblk_devdep */
 	struct list_head	parents;
@@ -193,7 +193,7 @@ struct lsblk_devnomap {
  *    md0 -> sda1 -> sda
  */
 struct lsblk_devtree {
-	int	refcount;
+	size_t	refcount;
 
 	struct list_head	roots;		/* tree root devices */
 	struct list_head	devices;	/* all devices */
diff --git a/sys-utils/lscpu-cpu.c b/sys-utils/lscpu-cpu.c
index 0619e7d34..1f306bb5d 100644
--- a/sys-utils/lscpu-cpu.c
+++ b/sys-utils/lscpu-cpu.c
@@ -8,6 +8,8 @@
  *
  * Copyright (C) 2020 Karel Zak <kzak@redhat.com>
  */
+#include <stdlib.h>
+
 #include "lscpu.h"
 
 struct lscpu_cpu *lscpu_new_cpu(int id)
@@ -28,10 +30,27 @@ struct lscpu_cpu *lscpu_new_cpu(int id)
 	return cpu;
 }
 
+/**
+ * lscpu_ref_cpu:
+ * @cpu: a pointer to a struct lscpu_cpu instance
+ *
+ * Increments the refcount of @cpu.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
+ */
 void lscpu_ref_cpu(struct lscpu_cpu *cpu)
 {
-	if (cpu)
+	if (cpu) {
 		cpu->refcount++;
+		/*
+		 * cpu->refcount == 0 now if and only if
+		 * cpu->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (cpu->refcount == 0)
+			abort();
+	}
 }
 
 void lscpu_unref_cpu(struct lscpu_cpu *cpu)
@@ -39,7 +58,7 @@ void lscpu_unref_cpu(struct lscpu_cpu *cpu)
 	if (!cpu)
 		return;
 
-	if (--cpu->refcount <= 0) {
+	if (--cpu->refcount == 0) {
 		DBG(CPU, ul_debugobj(cpu, "  freeing #%d", cpu->logical_id));
 		lscpu_unref_cputype(cpu->type);
 		cpu->type = NULL;
diff --git a/sys-utils/lscpu-cputype.c b/sys-utils/lscpu-cputype.c
index 958cbe7b6..9dffb8df9 100644
--- a/sys-utils/lscpu-cputype.c
+++ b/sys-utils/lscpu-cputype.c
@@ -8,6 +8,7 @@
  *
  * Copyright (C) 2020 Karel Zak <kzak@redhat.com>
  */
+#include <stdlib.h>
 #include <sys/utsname.h>
 #include <sys/personality.h>
 
@@ -69,11 +70,27 @@ struct lscpu_cputype *lscpu_new_cputype(void)
 	return ct;
 }
 
+/**
+ * lscpu_ref_cputype:
+ * @ct: a pointer to a struct lscpu_cputype instance
+ *
+ * Increments the refcount of @ct.
+ * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
+ */
 void lscpu_ref_cputype(struct lscpu_cputype *ct)
 {
 	if (ct) {
 		ct->refcount++;
-		/*DBG(TYPE, ul_debugobj(ct, ">>> ref %d", ct->refcount));*/
+		/*DBG(TYPE, ul_debugobj(ct, ">>> ref %zu", ct->refcount));*/
+		/*
+		 * ct->refcount == 0 now if and only if
+		 * ct->refcount == SIZE_MAX prior to the increment.
+		 *
+		 * Checking for overflow after the increment instead of before
+		 * seems to generate better assembly.
+		 */
+		if (ct->refcount == 0)
+			abort();
 	}
 }
 
@@ -82,9 +99,9 @@ void lscpu_unref_cputype(struct lscpu_cputype *ct)
 	if (!ct)
 		return;
 
-	/*DBG(TYPE, ul_debugobj(ct, ">>> unref %d", ct->refcount - 1));*/
+	/*DBG(TYPE, ul_debugobj(ct, ">>> unref %zu", ct->refcount - 1));*/
 
-	if (--ct->refcount <= 0) {
+	if (--ct->refcount == 0) {
 		DBG(TYPE, ul_debugobj(ct, "  freeing %s/%s", ct->vendor, ct->model));
 		lscpu_cputype_free_topology(ct);
 		free(ct->vendor);
diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h
index 0fae5d29e..5f5a0315a 100644
--- a/sys-utils/lscpu.h
+++ b/sys-utils/lscpu.h
@@ -13,6 +13,7 @@
 #define LSCPU_H
 
 #include <stdbool.h>
+#include <stddef.h>
 
 #include "c.h"
 #include "nls.h"
@@ -67,7 +68,7 @@ struct lscpu_cache {
 };
 
 struct lscpu_cputype {
-	int	refcount;
+	size_t	refcount;
 
 	char	*vendor;
 	int	vendor_id;	/* created by lscpu_decode_arm() */
@@ -137,7 +138,7 @@ enum {
 };
 
 struct lscpu_cpu {
-	int refcount;
+	size_t refcount;
 	struct lscpu_cputype *type;
 
 	int logical_id;
-- 
2.53.0


^ permalink raw reply related

* [PATCH] fdisk: (man) correct the markup + punctuation of two option descriptions
From: Benno Schulenberg @ 2026-02-24 15:24 UTC (permalink / raw)
  To: util-linux

Do not colorize 'dos' and 'cylinders' as if they were placeholders --
they are literal example values.

Also, use a semicolon where a comma will not do.  And remove three
redundant blank lines.

Signed-off-by: Benno Schulenberg <bensberg@telfort.nl>
---
 disk-utils/fdisk.8.adoc | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/disk-utils/fdisk.8.adoc b/disk-utils/fdisk.8.adoc
index 7f2f6a42f..515ddee3f 100644
--- a/disk-utils/fdisk.8.adoc
+++ b/disk-utils/fdisk.8.adoc
@@ -48,7 +48,7 @@ Specify the sector size of the disk. Valid values are 512, 1024, 2048, and 4096.
 Don't erase the beginning of the first disk sector when creating a new disk label. This feature is supported for GPT and MBR.
 
 *-c*, *--compatibility*[**=**_mode_]::
-Specify the compatibility mode, 'dos' or 'nondos'. The default is non-DOS mode. For backward compatibility, it is possible to use the option without the _mode_ argument -- then the default is used. Note that the optional _mode_ argument cannot be separated from the *-c* option by a space, the correct form is for example *-c*=_dos_.
+Specify the compatibility mode: 'dos' or 'nondos'. The default is non-DOS mode. For backward compatibility, it is possible to use the option without the _mode_ argument -- then the default is used. Note that the optional _mode_ argument cannot be separated from the *-c* option by a space; the correct form is *-c=dos*, for example.
 
 *-L*, *--color*[**=**_when_]::
 Colorize the output. The optional argument _when_ can be *auto*, *never* or *always*. If the _when_ argument is omitted, it defaults to *auto*. The colors can be disabled; for the current built-in default see the *--help* output. See also the *COLORS* section.
@@ -88,7 +88,7 @@ Print the size in 512-byte sectors of each given block device. This option is DE
 Enable support only for disklabels of the specified _type_, and disable support for all other types.
 
 *-u*, *--units*[**=**_unit_]::
-When listing partition tables, show sizes in 'sectors' or in 'cylinders'. The default is to show sizes in sectors. For backward compatibility, it is possible to use the option without the _unit_ argument -- then the default is used. Note that the optional _unit_ argument cannot be separated from the *-u* option by a space, the correct form is for example '**-u=**__cylinders__'.
+When listing partition tables, show sizes in 'sectors' or in 'cylinders'. The default is to show sizes in sectors. For backward compatibility, it is possible to use the option without the _unit_ argument -- then the default is used. Note that the optional _unit_ argument cannot be separated from the *-u* option by a space; the correct form is *-u=cylinders*, for example.
 
 *-C*, *--cylinders* _number_::
 Specify the _number_ of cylinders of the disk. I have no idea why anybody would want to do so.
@@ -115,17 +115,14 @@ The _partition_ is a device name followed by a partition number. For example, _/
 
 == SIZES
 
-
 //TRANSLATORS: Keep {plus} untranslated.
 The "last sector" dialog accepts partition size specified by number of sectors or by {plus}/-<size>{K,B,M,G,...} notation.
 
-
 //TRANSLATORS: Keep {plus} untranslated.
 If the size is prefixed by '{plus}' then it is interpreted as relative to the partition first sector. If the size is prefixed by '-' then it is interpreted as relative to the high limit (last available sector for the partition).
 
 In the case the size is specified in bytes, then the number may be followed by the multiplicative suffixes KiB (1024 bytes), MiB (1024*1024 bytes), and so on for GiB, TiB, PiB, EiB, ZiB and YiB. The "iB" is optional, e.g., "K" has the same meaning as "KiB".
 
-
 //TRANSLATORS: Keep {plus} untranslated.
 The relative sizes if specified with multiplicative suffixes (e.g. +100MiB) are always aligned according to device I/O limits. The {plus}/-<size>{K,B,M,G,...} notation is recommended.
 
-- 
2.53.0


^ permalink raw reply related

* Re: [PATCH] Various subsystems: avoid UB from ref counts
From: Karel Zak @ 2026-02-25 10:18 UTC (permalink / raw)
  To: Jonathan Gruber; +Cc: util-linux
In-Reply-To: <20260224102329.69255-1-jonathan.gruber.jg@gmail.com>


 Hi Jonathan,

I rarely copy and paste from any AI, as I believe it can sometimes be
seen as impolite. However, in this instance, I completely agree with
Claude. See below.

  Karel

I would not merge this. Here's why:

The problem is purely theoretical. Overflowing an int refcount requires ~2 billion live references to
a single object — that's ~16 GB of memory just for the pointers. 

The patch is way too invasive for a non-problem. 31 files, every library, every refcounted type — this
is enormous churn for zero practical benefit. It makes git blame noisy and creates merge conflicts
with any in-flight work.

The identical 6-line comment block is copy-pasted into every _ref() function — that's a lot of
boilerplate explaining something that doesn't need explaining in each location.

Struct layout changes are gratuitous. For example, fdisk_parttype has its members reordered (moving
size_t refcount before code/name). While these are internal structs, pointless layout changes add risk
for no gain.

abort() with no diagnostic message is unfriendly. If the goal is defensive programming, at least print
what happened before crashing.

size_t is an unusual choice for refcounts. It doubles the storage on 64-bit (8 bytes vs 4). unsigned
int would address the UB argument equally well without the size increase. The author's reasoning ("you
can't have SIZE_MAX pointers") applies equally to unsigned int in any realistic scenario.

The <= 0 to == 0 change actually hides bugs. With signed int, if someone double-unrefs, the counter
goes negative and the <= 0 check triggers a (noisy) double-free that tools like ASan catch
immediately. With size_t, a double-unref wraps to SIZE_MAX, the object is never freed, and you get a
silent memory leak — much harder to debug.

Style issue: The #include <stdlib.h> in context.c is placed before #ifdef HAVE_LIBBLKID, outside the
normal include block.

Bottom Line

This is a textbook case of solving a theoretical UB concern with disproportionate real-world cost. The
existing int refcounts have worked fine for years and will continue to work fine. If you wanted to
address this at all, a much smaller approach would be to just add a DBG() assertion in the _ref()
functions, or use unsigned int — but honestly, even that isn't worth the churn.

I'd suggest politely declining the patch.



On Tue, Feb 24, 2026 at 02:23:29AM -0800, Jonathan Gruber wrote:
> util-linux uses type signed int for reference counters. The functions
> that increment reference counters thus risk undefined behavior (UB) if
> the value of the reference counter is INT_MAX prior to the increment,
> because overflow in signed integers is UB. A program that creates more
> than INT_MAX coexistent references to some reference-counted object
> would thus trigger UB by overflowing the reference counter over INT_MAX.
> On systems with size_t larger than int, such as many 64-bit systems, it
> is possible, given sufficient RAM, for a program to create more than
> INT_MAX pointers holding the address of the same reference-counted
> object and to attempt to make each of those pointers be a reference to
> the reference-counted object, thereby overflowing the reference counter
> over INT_MAX and triggering UB. It is best to protect against the
> demonstrated *possibility* of this UB-triggering scenario regardless of
> the scenario's probability.
> 
> While signed integer overflow is UB, it is likely to manifest in this
> scenario as the reference counter wrapping from INT_MAX to INT_MIN.
> However, the functions that decrement the reference counters deallocate
> the reference-counted object if the value of the reference counter
> becomes less than or equal to zero after the decrement. Therefore, if
> the reference counter starts with a value of one and is incremented
> INT_MAX + 2 times with no intervening decrements, then, assuming that
> the resulting integer overflow manifests as a wrap from INT_MAX to
> INT_MIN, the value of the reference counter would become INT_MIN + 2. If
> the reference counter is then decremented once, then its value would
> become INT_MIN + 1, which is less than zero, so the reference-counted
> object would be deallocated even though there are still
> 1 + (INT_MAX + 2) - 1 = INT_MAX + 2 live references to the object. Since
> the object has been deallocated, any access to the remaining references
> would trigger UB. Additionally, if the reference counter is *attempted*
> to be decremented again (which would trigger UB since the
> reference-counted object has been deallocated), then, assuming that the
> memory formerly occupied by the reference-counted object has somehow not
> been reallocated to another object or overwritten, and assuming that the
> UB from the attempted decrement manifests as an actual decrement, the
> "value" of the (deallocated) reference counter would become INT_MIN,
> which is less than zero, so the already-deallocated reference-counted
> object would be deallocated again, resulting in a double free, which
> also triggers UB.
> 
> This patch attempts to address the UB from the reference counters. In
> order to avoid UB from overflowing the reference counters, this patch
> changes the types of the reference counters to an unsigned integer type,
> since overflow for unsigned integer types is not UB but wraps; in this
> case, if the reference counter overflows, then its value would wrap to
> zero. In order to avoid the UB resulting from deallocating the
> reference-counted object when there are still live references to the
> object, this patch ensures that the value of the reference counter is
> zero only if there are actually no live references to the
> reference-counted object. This is done by calling abort() in the
> functions that increment reference counters when the reference counter
> overflows; this behavior is also documented in the documentation
> comments for the functions. The choice to call abort() was made for
> simplicity and because the *least bad* result of accessing a reference
> counted object that has been deallocated too early is for the program to
> crash, which is also what calling abort() triggers. Finally, the
> unsigned integer type that was chosen for the reference counters is
> size_t; this choice minimizes the risk of overflowing the reference
> counter and triggering an abort() because storing more than SIZE_MAX
> coexistent pointers/references to a reference-counted object would
> require more than SIZE_MAX bytes of memory. size_t can be larger than
> int, so this patch might increase the sizes of some reference-counted
> objects, but this increase should be miniscule.
> 
> Signed-off-by: Jonathan Gruber <jonathan.gruber.jg@gmail.com>
> ---
>  include/path.h                |  2 +-
>  lib/path.c                    | 22 +++++++++++++++--
>  libfdisk/src/ask.c            | 18 +++++++++++---
>  libfdisk/src/context.c        | 18 ++++++++++++--
>  libfdisk/src/fdiskP.h         | 15 ++++++------
>  libfdisk/src/item.c           | 16 +++++++++++--
>  libfdisk/src/partition.c      | 19 ++++++++++++---
>  libfdisk/src/parttype.c       | 16 +++++++++++--
>  libfdisk/src/script.c         | 19 ++++++++++++---
>  libfdisk/src/table.c          | 17 +++++++++++--
>  libmount/src/cache.c          | 20 ++++++++++++----
>  libmount/src/fs.c             | 21 ++++++++++++----
>  libmount/src/fs_statmount.c   | 18 +++++++++++---
>  libmount/src/lock.c           | 21 ++++++++++++----
>  libmount/src/monitor.c        | 16 +++++++++++--
>  libmount/src/monitor.h        |  3 ++-
>  libmount/src/mountP.h         | 10 ++++----
>  libmount/src/optlist.c        | 23 ++++++++++++++++--
>  libmount/src/tab.c            | 19 +++++++++++----
>  libsmartcols/src/column.c     | 15 ++++++++++--
>  libsmartcols/src/filter.c     | 34 +++++++++++++++++++++++---
>  libsmartcols/src/grouping.c   | 24 +++++++++++++++++--
>  libsmartcols/src/line.c       | 15 ++++++++++--
>  libsmartcols/src/smartcolsP.h | 18 +++++++-------
>  libsmartcols/src/symbols.c    | 15 ++++++++++--
>  libsmartcols/src/table.c      | 15 ++++++++++--
>  misc-utils/lsblk-devtree.c    | 45 +++++++++++++++++++++++++++++++----
>  misc-utils/lsblk.h            |  4 ++--
>  sys-utils/lscpu-cpu.c         | 23 ++++++++++++++++--
>  sys-utils/lscpu-cputype.c     | 23 +++++++++++++++---
>  sys-utils/lscpu.h             |  5 ++--
>  31 files changed, 454 insertions(+), 95 deletions(-)
> 
> diff --git a/include/path.h b/include/path.h
> index 60a6162df..1b403d66e 100644
> --- a/include/path.h
> +++ b/include/path.h
> @@ -17,7 +17,7 @@ struct path_cxt {
>  	int	dir_fd;
>  	char	*dir_path;
>  
> -	int	refcount;
> +	size_t	refcount;
>  
>  	char *prefix;
>  	char path_buffer[PATH_MAX];
> diff --git a/lib/path.c b/lib/path.c
> index 6ce8a10d2..10aaa7b5c 100644
> --- a/lib/path.c
> +++ b/lib/path.c
> @@ -18,6 +18,7 @@
>  #include <string.h>
>  #include <unistd.h>
>  #include <stdio.h>
> +#include <stdlib.h>
>  #include <inttypes.h>
>  #include <errno.h>
>  
> @@ -79,10 +80,27 @@ fail:
>  	return NULL;
>  }
>  
> +/**
> + * ul_ref_path:
> + * @pc: path_cxt instance
> + *
> + * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
> + */
>  void ul_ref_path(struct path_cxt *pc)
>  {
> -	if (pc)
> +	if (pc) {
>  		pc->refcount++;
> +		/*
> +		 * pc->refcount == 0 now if and only if
> +		 * pc->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (pc->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  void ul_unref_path(struct path_cxt *pc)
> @@ -92,7 +110,7 @@ void ul_unref_path(struct path_cxt *pc)
>  
>  	pc->refcount--;
>  
> -	if (pc->refcount <= 0) {
> +	if (pc->refcount == 0) {
>  		DBG(CXT, ul_debugobj(pc, "dealloc"));
>  		if (pc->dialect)
>  			pc->free_dialect(pc);
> diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c
> index 507cc6fc6..3ce472aa4 100644
> --- a/libfdisk/src/ask.c
> +++ b/libfdisk/src/ask.c
> @@ -3,6 +3,7 @@
>  #include "fdiskP.h"
>  
>  #include <stdarg.h>
> +#include <stdlib.h>
>  
>  /**
>   * SECTION: ask
> @@ -49,7 +50,7 @@ struct fdisk_ask *fdisk_new_ask(void)
>  
>  void fdisk_reset_ask(struct fdisk_ask *ask)
>  {
> -	int refcount;
> +	size_t refcount;
>  
>  	assert(ask);
>  	free(ask->query);
> @@ -69,11 +70,22 @@ void fdisk_reset_ask(struct fdisk_ask *ask)
>   * @ask: ask instance
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void fdisk_ref_ask(struct fdisk_ask *ask)
>  {
> -	if (ask)
> +	if (ask) {
>  		ask->refcount++;
> +		/*
> +		 * ask->refcount == 0 now if and only if
> +		 * ask->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (ask->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  
> @@ -90,7 +102,7 @@ void fdisk_unref_ask(struct fdisk_ask *ask)
>  		return;
>  	ask->refcount--;
>  
> -	if (ask->refcount <= 0) {
> +	if (ask->refcount == 0) {
>  		fdisk_reset_ask(ask);
>  		DBG(ASK, ul_debugobj(ask, "free"));
>  		free(ask);
> diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c
> index bc46f1f62..6d8faa8ff 100644
> --- a/libfdisk/src/context.c
> +++ b/libfdisk/src/context.c
> @@ -1,3 +1,6 @@
> +
> +#include <stdlib.h>
> +
>  #ifdef HAVE_LIBBLKID
>  # include <blkid.h>
>  #endif
> @@ -199,11 +202,22 @@ struct fdisk_context *fdisk_new_nested_context(struct fdisk_context *parent,
>   * @cxt: context pointer
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void fdisk_ref_context(struct fdisk_context *cxt)
>  {
> -	if (cxt)
> +	if (cxt) {
>  		cxt->refcount++;
> +		/*
> +		 * ctx->refcount == 0 now if and only if
> +		 * ctx->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (cxt->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  /**
> @@ -1089,7 +1103,7 @@ void fdisk_unref_context(struct fdisk_context *cxt)
>  		return;
>  
>  	cxt->refcount--;
> -	if (cxt->refcount <= 0) {
> +	if (cxt->refcount == 0) {
>  		DBG(CXT, ul_debugobj(cxt, "freeing context %p for %s", cxt, cxt->dev_path));
>  
>  		reset_context(cxt);	/* this is sensitive to parent<->child relationship! */
> diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
> index e3e57929a..e1af40588 100644
> --- a/libfdisk/src/fdiskP.h
> +++ b/libfdisk/src/fdiskP.h
> @@ -107,12 +107,13 @@ struct fdisk_iter {
>   * Partition types
>   */
>  struct fdisk_parttype {
> -	unsigned int	code;		/* type as number or zero */
> +	size_t		refcount;	/* reference counter for allocated types */
> +
>  	char		*name;		/* description */
>  	char		*typestr;	/* type as string or NULL */
>  
> +	unsigned int	code;		/* type as number or zero */
>  	unsigned int	flags;		/* FDISK_PARTTYPE_* flags */
> -	int		refcount;	/* reference counter for allocated types */
>  };
>  
>  enum {
> @@ -136,7 +137,7 @@ struct fdisk_shortcut {
>  };
>  
>  struct fdisk_partition {
> -	int		refcount;		/* reference counter */
> +	size_t		refcount;		/* reference counter */
>  
>  	size_t		partno;			/* partition number */
>  	size_t		parent_partno;		/* for logical partitions */
> @@ -200,7 +201,7 @@ enum {
>  
>  struct fdisk_table {
>  	struct list_head	parts;		/* partitions */
> -	int			refcount;
> +	size_t			refcount;
>  	size_t			nents;		/* number of partitions */
>  };
>  
> @@ -340,7 +341,7 @@ struct fdisk_ask {
>  	int		type;		/* FDISK_ASKTYPE_* */
>  	char		*query;
>  
> -	int		refcount;
> +	size_t		refcount;
>  
>  	union {
>  		/* FDISK_ASKTYPE_{NUMBER,OFFSET} */
> @@ -384,7 +385,7 @@ struct fdisk_context {
>  	char *dev_model;    /* on linux /sys/block/<name>/device/model or NULL */
>  	struct stat dev_st; /* stat(2) result */
>  
> -	int refcount;
> +	size_t refcount;
>  
>  	unsigned char *firstsector; /* buffer with master boot record */
>  	unsigned long firstsector_bufsz;
> @@ -484,7 +485,7 @@ extern int fdisk_probe_labels(struct fdisk_context *cxt);
>  extern void fdisk_deinit_label(struct fdisk_label *lb);
>  
>  struct fdisk_labelitem {
> -	int		refcount;	/* reference counter */
> +	size_t		refcount;	/* reference counter */
>  	int		id;		/* <label>_ITEM_* */
>  	char		type;		/* s = string, j = uint64 */
>  	const char	*name;		/* human readable name */
> diff --git a/libfdisk/src/item.c b/libfdisk/src/item.c
> index 9e2f44ca1..3c2802c5e 100644
> --- a/libfdisk/src/item.c
> +++ b/libfdisk/src/item.c
> @@ -1,5 +1,6 @@
>  
>  #include <inttypes.h>
> +#include <stdlib.h>
>  
>  #include "fdiskP.h"
>  
> @@ -53,6 +54,8 @@ struct fdisk_labelitem *fdisk_new_labelitem(void)
>   * @li: label item
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
> + *
>   * Since: 2.29
>   */
>  void fdisk_ref_labelitem(struct fdisk_labelitem *li)
> @@ -61,6 +64,15 @@ void fdisk_ref_labelitem(struct fdisk_labelitem *li)
>  		/* make sure we do not use refcounting for static items */
>  		assert(li->refcount > 0);
>  		li->refcount++;
> +		/*
> +		 * li->refcount == 0 now if and only if
> +		 * li->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (li->refcount == 0)
> +			abort();
>  	}
>  }
>  
> @@ -75,7 +87,7 @@ void fdisk_ref_labelitem(struct fdisk_labelitem *li)
>   */
>  int fdisk_reset_labelitem(struct fdisk_labelitem *li)
>  {
> -	int refcount;
> +	size_t refcount;
>  
>  	if (!li)
>  		return -EINVAL;
> @@ -106,7 +118,7 @@ void fdisk_unref_labelitem(struct fdisk_labelitem *li)
>  	assert(li->refcount > 0);
>  
>  	li->refcount--;
> -	if (li->refcount <= 0) {
> +	if (li->refcount == 0) {
>  		DBG(ITEM, ul_debugobj(li, "free"));
>  		fdisk_reset_labelitem(li);
>  		free(li);
> diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c
> index 9a5614d21..0ef16b602 100644
> --- a/libfdisk/src/partition.c
> +++ b/libfdisk/src/partition.c
> @@ -1,4 +1,6 @@
>  
> +#include <stdlib.h>
> +
>  #include "c.h"
>  #include "strutils.h"
>  
> @@ -57,7 +59,7 @@ struct fdisk_partition *fdisk_new_partition(void)
>   */
>  void fdisk_reset_partition(struct fdisk_partition *pa)
>  {
> -	int ref;
> +	size_t ref;
>  
>  	if (!pa)
>  		return;
> @@ -137,11 +139,22 @@ static struct fdisk_partition *__copy_partition(struct fdisk_partition *o)
>   * @pa: partition pointer
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void fdisk_ref_partition(struct fdisk_partition *pa)
>  {
> -	if (pa)
> +	if (pa) {
>  		pa->refcount++;
> +		/*
> +		 * pa->refcount == 0 now if and only if
> +		 * pa->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (pa->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  /**
> @@ -157,7 +170,7 @@ void fdisk_unref_partition(struct fdisk_partition *pa)
>  		return;
>  
>  	pa->refcount--;
> -	if (pa->refcount <= 0) {
> +	if (pa->refcount == 0) {
>  		list_del(&pa->parts);
>  		fdisk_reset_partition(pa);
>  		DBG(PART, ul_debugobj(pa, "free"));
> diff --git a/libfdisk/src/parttype.c b/libfdisk/src/parttype.c
> index 8e36ada74..026d8ef64 100644
> --- a/libfdisk/src/parttype.c
> +++ b/libfdisk/src/parttype.c
> @@ -1,5 +1,6 @@
>  
>  #include <ctype.h>
> +#include <stdlib.h>
>  
>  #include "fdiskP.h"
>  #include "cctype.h"
> @@ -41,11 +42,22 @@ struct fdisk_parttype *fdisk_new_parttype(void)
>   * @t: partition type
>   *
>   * Increments reference counter for allocated types
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void fdisk_ref_parttype(struct fdisk_parttype *t)
>  {
> -	if (fdisk_parttype_is_allocated(t))
> +	if (fdisk_parttype_is_allocated(t)) {
>  		t->refcount++;
> +		/*
> +		 * t->refcount == 0 now if and only if
> +		 * t->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (t->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  /**
> @@ -61,7 +73,7 @@ void fdisk_unref_parttype(struct fdisk_parttype *t)
>  		return;
>  
>  	t->refcount--;
> -	if (t->refcount <= 0) {
> +	if (t->refcount == 0) {
>  		DBG(PARTTYPE, ul_debugobj(t, "free"));
>  		free(t->typestr);
>  		free(t->name);
> diff --git a/libfdisk/src/script.c b/libfdisk/src/script.c
> index 62ca5eeb2..6ad1c9261 100644
> --- a/libfdisk/src/script.c
> +++ b/libfdisk/src/script.c
> @@ -1,4 +1,6 @@
>  
> +#include <stdlib.h>
> +
>  #include "cctype.h"
>  #include "fdiskP.h"
>  #include "strutils.h"
> @@ -56,7 +58,7 @@ struct fdisk_script {
>  	struct list_head	headers;
>  	struct fdisk_context	*cxt;
>  
> -	int			refcount;
> +	size_t			refcount;
>  	char			*(*fn_fgets)(struct fdisk_script *, char *, size_t, FILE *);
>  	void			*userdata;
>  
> @@ -158,11 +160,22 @@ done:
>   * @dp: script pointer
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void fdisk_ref_script(struct fdisk_script *dp)
>  {
> -	if (dp)
> +	if (dp) {
>  		dp->refcount++;
> +		/*
> +		 * dp->refcount == 0 now if and only if
> +		 * dp->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (dp->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  static void fdisk_reset_script(struct fdisk_script *dp)
> @@ -195,7 +208,7 @@ void fdisk_unref_script(struct fdisk_script *dp)
>  		return;
>  
>  	dp->refcount--;
> -	if (dp->refcount <= 0) {
> +	if (dp->refcount == 0) {
>  		fdisk_reset_script(dp);
>  		fdisk_unref_context(dp->cxt);
>  		fdisk_unref_table(dp->table);
> diff --git a/libfdisk/src/table.c b/libfdisk/src/table.c
> index 30955e1a6..ea9f26f7e 100644
> --- a/libfdisk/src/table.c
> +++ b/libfdisk/src/table.c
> @@ -1,4 +1,6 @@
>  
> +#include <stdlib.h>
> +
>  #include "fdiskP.h"
>  
>  /**
> @@ -66,11 +68,22 @@ int fdisk_reset_table(struct fdisk_table *tb)
>   * @tb: table pointer
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void fdisk_ref_table(struct fdisk_table *tb)
>  {
> -	if (tb)
> +	if (tb) {
>  		tb->refcount++;
> +		/*
> +		 * tb->refcount == 0 now if and only if
> +		 * tb->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (tb->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  /**
> @@ -86,7 +99,7 @@ void fdisk_unref_table(struct fdisk_table *tb)
>  		return;
>  
>  	tb->refcount--;
> -	if (tb->refcount <= 0) {
> +	if (tb->refcount == 0) {
>  		fdisk_reset_table(tb);
>  
>  		DBG(TAB, ul_debugobj(tb, "free"));
> diff --git a/libmount/src/cache.c b/libmount/src/cache.c
> index 4d2a20f23..e94c67cf7 100644
> --- a/libmount/src/cache.c
> +++ b/libmount/src/cache.c
> @@ -61,7 +61,7 @@ struct libmnt_cache {
>  	struct mnt_cache_entry	*ents;
>  	size_t			nents;
>  	size_t			nallocs;
> -	int			refcount;
> +	size_t			refcount;
>  	int			probe_sb_extra;	/* extra BLKID_SUBLKS_* flags */
>  
>  	/* blkid_evaluate_tag() works in two ways:
> @@ -126,7 +126,7 @@ void mnt_free_cache(struct libmnt_cache *cache)
>  	if (!cache)
>  		return;
>  
> -	DBG(CACHE, ul_debugobj(cache, "free [refcount=%d]", cache->refcount));
> +	DBG(CACHE, ul_debugobj(cache, "free [refcount=%zu]", cache->refcount));
>  
>  	for (i = 0; i < cache->nents; i++) {
>  		struct mnt_cache_entry *e = &cache->ents[i];
> @@ -145,12 +145,22 @@ void mnt_free_cache(struct libmnt_cache *cache)
>   * @cache: cache pointer
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void mnt_ref_cache(struct libmnt_cache *cache)
>  {
>  	if (cache) {
>  		cache->refcount++;
> -		/*DBG(CACHE, ul_debugobj(cache, "ref=%d", cache->refcount));*/
> +		/*DBG(CACHE, ul_debugobj(cache, "ref=%zu", cache->refcount));*/
> +		/*
> +		 * cache->refcount == 0 now if and only if
> +		 * cache->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (cache->refcount == 0)
> +			abort();
>  	}
>  }
>  
> @@ -165,8 +175,8 @@ void mnt_unref_cache(struct libmnt_cache *cache)
>  {
>  	if (cache) {
>  		cache->refcount--;
> -		/*DBG(CACHE, ul_debugobj(cache, "unref=%d", cache->refcount));*/
> -		if (cache->refcount <= 0) {
> +		/*DBG(CACHE, ul_debugobj(cache, "unref=%zu", cache->refcount));*/
> +		if (cache->refcount == 0) {
>  			mnt_unref_table(cache->mountinfo);
>  
>  			mnt_free_cache(cache);
> diff --git a/libmount/src/fs.c b/libmount/src/fs.c
> index a9b738022..5af562aa8 100644
> --- a/libmount/src/fs.c
> +++ b/libmount/src/fs.c
> @@ -19,6 +19,7 @@
>  #include <ctype.h>
>  #include <blkid.h>
>  #include <stddef.h>
> +#include <stdlib.h>
>  
>  #include "mountP.h"
>  #include "strutils.h"
> @@ -58,7 +59,7 @@ void mnt_free_fs(struct libmnt_fs *fs)
>  	if (!fs)
>  		return;
>  
> -	DBG(FS, ul_debugobj(fs, "free [refcount=%d]", fs->refcount));
> +	DBG(FS, ul_debugobj(fs, "free [refcount=%zu]", fs->refcount));
>  
>  	mnt_reset_fs(fs);
>  	free(fs);
> @@ -72,7 +73,7 @@ void mnt_free_fs(struct libmnt_fs *fs)
>   */
>  void mnt_reset_fs(struct libmnt_fs *fs)
>  {
> -	int ref;
> +	size_t ref;
>  
>  	if (!fs)
>  		return;
> @@ -116,12 +117,22 @@ void mnt_reset_fs(struct libmnt_fs *fs)
>   * @fs: fs pointer
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void mnt_ref_fs(struct libmnt_fs *fs)
>  {
>  	if (fs) {
>  		fs->refcount++;
> -		/*DBG(FS, ul_debugobj(fs, "ref=%d", fs->refcount));*/
> +		/*DBG(FS, ul_debugobj(fs, "ref=%zu", fs->refcount));*/
> +		/*
> +		 * fs->refcount == 0 now if and only if
> +		 * fs->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (fs->refcount == 0)
> +			abort();
>  	}
>  }
>  
> @@ -136,8 +147,8 @@ void mnt_unref_fs(struct libmnt_fs *fs)
>  {
>  	if (fs) {
>  		fs->refcount--;
> -		/*DBG(FS, ul_debugobj(fs, "unref=%d", fs->refcount));*/
> -		if (fs->refcount <= 0)
> +		/*DBG(FS, ul_debugobj(fs, "unref=%zu", fs->refcount));*/
> +		if (fs->refcount == 0)
>  			mnt_free_fs(fs);
>  	}
>  }
> diff --git a/libmount/src/fs_statmount.c b/libmount/src/fs_statmount.c
> index 599ee8c52..a1b1dca53 100644
> --- a/libmount/src/fs_statmount.c
> +++ b/libmount/src/fs_statmount.c
> @@ -15,6 +15,8 @@
>   * @title: statmount setting
>   * @short_description: Fetches information about mount node from the kernel.
>   */
> +#include <stdlib.h>
> +
>  #include "mountP.h"
>  
>  #include "mangle.h"
> @@ -56,12 +58,22 @@ struct libmnt_statmnt *mnt_new_statmnt(void)
>   * @sm: statmount setting
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void mnt_ref_statmnt(struct libmnt_statmnt *sm)
>  {
>  	if (sm) {
>  		sm->refcount++;
> -		/*DBG(STATMNT, ul_debugobj(sm, "ref=%d", sm->refcount));*/
> +		/*DBG(STATMNT, ul_debugobj(sm, "ref=%zu", sm->refcount));*/
> +		/*
> +		 * sm->refcount == 0 now if and only if
> +		 * sm->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (sm->refcount == 0)
> +			abort();
>  	}
>  }
>  
> @@ -76,8 +88,8 @@ void mnt_unref_statmnt(struct libmnt_statmnt *sm)
>  {
>  	if (sm) {
>  		sm->refcount--;
> -		/*DBG(STATMNT, ul_debugobj(sm, "unref=%d", sm->refcount));*/
> -		if (sm->refcount <= 0) {
> +		/*DBG(STATMNT, ul_debugobj(sm, "unref=%zu", sm->refcount));*/
> +		if (sm->refcount == 0) {
>  			free(sm->buf);
>  			free(sm);
>  		}
> diff --git a/libmount/src/lock.c b/libmount/src/lock.c
> index 28ff8b788..b4ec0e3f2 100644
> --- a/libmount/src/lock.c
> +++ b/libmount/src/lock.c
> @@ -25,6 +25,7 @@
>  #include <fcntl.h>
>  #include <limits.h>
>  #include <sys/file.h>
> +#include <stdlib.h>
>  
>  #include "strutils.h"
>  #include "closestream.h"
> @@ -36,7 +37,7 @@
>   * lock handler
>   */
>  struct libmnt_lock {
> -	int	refcount;	/* reference counter */
> +	size_t	refcount;	/* reference counter */
>  	char	*lockfile;	/* path to lock file (e.g. /etc/mtab~) */
>  	int	lockfile_fd;	/* lock file descriptor */
>  
> @@ -101,7 +102,7 @@ void mnt_free_lock(struct libmnt_lock *ml)
>  	if (!ml)
>  		return;
>  
> -	DBG(LOCKS, ul_debugobj(ml, "free%s [refcount=%d]",
> +	DBG(LOCKS, ul_debugobj(ml, "free%s [refcount=%zu]",
>  					ml->locked ? " !!! LOCKED !!!" : "",
>  					ml->refcount));
>  	free(ml->lockfile);
> @@ -113,6 +114,7 @@ void mnt_free_lock(struct libmnt_lock *ml)
>   * @ml: lock pointer
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   *
>   * Since: 2.40
>   */
> @@ -120,7 +122,16 @@ void mnt_ref_lock(struct libmnt_lock *ml)
>  {
>  	if (ml) {
>  		ml->refcount++;
> -		/*DBG(FS, ul_debugobj(fs, "ref=%d", ml->refcount));*/
> +		/*DBG(FS, ul_debugobj(fs, "ref=%zu", ml->refcount));*/
> +		/*
> +		 * ml->refcount == 0 now if and only if
> +		 * ml->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (ml->refcount == 0)
> +			abort();
>  	}
>  }
>  
> @@ -135,8 +146,8 @@ void mnt_unref_lock(struct libmnt_lock *ml)
>  {
>  	if (ml) {
>  		ml->refcount--;
> -		/*DBG(FS, ul_debugobj(fs, "unref=%d", ml->refcount));*/
> -		if (ml->refcount <= 0)
> +		/*DBG(FS, ul_debugobj(fs, "unref=%zu", ml->refcount));*/
> +		if (ml->refcount == 0)
>  			mnt_free_lock(ml);
>  	}
>  }
> diff --git a/libmount/src/monitor.c b/libmount/src/monitor.c
> index 194817aac..35c70857b 100644
> --- a/libmount/src/monitor.c
> +++ b/libmount/src/monitor.c
> @@ -38,6 +38,7 @@
>  #include "mountP.h"
>  #include "monitor.h"
>  
> +#include <stdlib.h>
>  #include <sys/epoll.h>
>  
>  /**
> @@ -67,11 +68,22 @@ struct libmnt_monitor *mnt_new_monitor(void)
>   * @mn: monitor pointer
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void mnt_ref_monitor(struct libmnt_monitor *mn)
>  {
> -	if (mn)
> +	if (mn) {
>  		mn->refcount++;
> +		/*
> +		 * mn->refcount == 0 now if and only if
> +		 * mn->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (mn->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  void free_monitor_entry(struct monitor_entry *me)
> @@ -102,7 +114,7 @@ void mnt_unref_monitor(struct libmnt_monitor *mn)
>  		return;
>  
>  	mn->refcount--;
> -	if (mn->refcount <= 0) {
> +	if (mn->refcount == 0) {
>  		mnt_monitor_close_fd(mn);	/* destroys all file descriptors */
>  
>  		while (!list_empty(&mn->ents)) {
> diff --git a/libmount/src/monitor.h b/libmount/src/monitor.h
> index a7859c075..b17b271be 100644
> --- a/libmount/src/monitor.h
> +++ b/libmount/src/monitor.h
> @@ -6,6 +6,7 @@
>  
>  #include "c.h"
>  #include <stdbool.h>
> +#include <stddef.h>
>  
>  struct monitor_opers;
>  
> @@ -26,7 +27,7 @@ struct monitor_entry {
>  };
>  
>  struct libmnt_monitor {
> -	int			refcount;
> +	size_t			refcount;
>  	int			fd;		/* public monitor file descriptor */
>  
>  	struct list_head	ents;
> diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h
> index 7a6a4fbe2..41dee526f 100644
> --- a/libmount/src/mountP.h
> +++ b/libmount/src/mountP.h
> @@ -205,13 +205,13 @@ struct libmnt_iter {
>   * statmount setting; shared between tables and filesystems
>   */
>  struct libmnt_statmnt {
> -	int             refcount;
> -	uint64_t        mask;           /* default statmount() mask */
> +	size_t		refcount;
> +	uint64_t	mask;           /* default statmount() mask */
>  
>  	struct ul_statmount *buf;
>  	size_t bufsiz;
>  
> -	unsigned int    disabled: 1;    /* enable or disable statmount() */
> +	unsigned int	disabled: 1;    /* enable or disable statmount() */
>  };
>  
>  
> @@ -223,7 +223,7 @@ struct libmnt_fs {
>  	struct list_head ents;
>  	struct libmnt_table *tab;
>  
> -	int		refcount;	/* reference counter */
> +	size_t		refcount;	/* reference counter */
>  
>  	unsigned int	opts_age;	/* to sync with optlist */
>  	struct libmnt_optlist *optlist;
> @@ -322,7 +322,7 @@ static inline void mnt_fs_mark_moved(struct libmnt_fs *fs)
>  struct libmnt_table {
>  	int		fmt;		/* MNT_FMT_* file format */
>  	int		nents;		/* number of entries */
> -	int		refcount;	/* reference counter */
> +	size_t		refcount;	/* reference counter */
>  	int		comms;		/* enable/disable comment parsing */
>  	char		*comm_intro;	/* First comment in file */
>  	char		*comm_tail;	/* Last comment in file */
> diff --git a/libmount/src/optlist.c b/libmount/src/optlist.c
> index 5bb32c6a8..0b6f6cd19 100644
> --- a/libmount/src/optlist.c
> +++ b/libmount/src/optlist.c
> @@ -13,6 +13,8 @@
>   * The "optlist" is container for parsed mount options.
>   *
>   */
> +#include <stdlib.h>
> +
>  #include "strutils.h"
>  #include "list.h"
>  #include "mountP.h"
> @@ -51,7 +53,7 @@ struct libmnt_opt {
>  };
>  
>  struct libmnt_optlist {
> -	int refcount;
> +	size_t refcount;
>  	unsigned int age;			/* incremented after each change */
>  
>  	const struct libmnt_optmap	*linux_map;	/* map with MS_ flags */
> @@ -90,10 +92,27 @@ struct libmnt_optlist *mnt_new_optlist(void)
>  	return ls;
>  }
>  
> +/**
> + * mnt_ref_optlist:
> + * @ls: optlist instance
> + *
> + * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
> + */
>  void mnt_ref_optlist(struct libmnt_optlist *ls)
>  {
> -	if (ls)
> +	if (ls) {
>  		ls->refcount++;
> +		/*
> +		 * ls->refcount == 0 now if and only if
> +		 * ls->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (ls->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  static void reset_cache(struct optlist_cache *cache)
> diff --git a/libmount/src/tab.c b/libmount/src/tab.c
> index 0d2b0ecd4..903cad522 100644
> --- a/libmount/src/tab.c
> +++ b/libmount/src/tab.c
> @@ -48,6 +48,7 @@
>   * will return the first entry (if UUID matches with the device).
>   */
>  #include <blkid.h>
> +#include <stdlib.h>
>  
>  #include "mountP.h"
>  #include "strutils.h"
> @@ -126,12 +127,22 @@ int mnt_reset_table(struct libmnt_table *tb)
>   * @tb: table pointer
>   *
>   * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void mnt_ref_table(struct libmnt_table *tb)
>  {
>  	if (tb) {
>  		tb->refcount++;
> -		/*DBG(FS, ul_debugobj(tb, "ref=%d", tb->refcount));*/
> +		/*DBG(FS, ul_debugobj(tb, "ref=%zu", tb->refcount));*/
> +		/*
> +		 * tb->refcount == 0 now if and only if
> +		 * tb->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (tb->refcount == 0)
> +			abort();
>  	}
>  }
>  
> @@ -146,8 +157,8 @@ void mnt_unref_table(struct libmnt_table *tb)
>  {
>  	if (tb) {
>  		tb->refcount--;
> -		/*DBG(FS, ul_debugobj(tb, "unref=%d", tb->refcount));*/
> -		if (tb->refcount <= 0)
> +		/*DBG(FS, ul_debugobj(tb, "unref=%zu", tb->refcount));*/
> +		if (tb->refcount == 0)
>  			mnt_free_table(tb);
>  	}
>  }
> @@ -169,7 +180,7 @@ void mnt_free_table(struct libmnt_table *tb)
>  		return;
>  
>  	mnt_reset_table(tb);
> -	DBG(TAB, ul_debugobj(tb, "free [refcount=%d]", tb->refcount));
> +	DBG(TAB, ul_debugobj(tb, "free [refcount=%zu]", tb->refcount));
>  
>  	mnt_unref_cache(tb->cache);
>  	free(tb->comm_intro);
> diff --git a/libsmartcols/src/column.c b/libsmartcols/src/column.c
> index a36e54690..f29475db2 100644
> --- a/libsmartcols/src/column.c
> +++ b/libsmartcols/src/column.c
> @@ -51,11 +51,22 @@ struct libscols_column *scols_new_column(void)
>   * @cl: a pointer to a struct libscols_column instance
>   *
>   * Increases the refcount of @cl.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void scols_ref_column(struct libscols_column *cl)
>  {
> -	if (cl)
> +	if (cl) {
>  		cl->refcount++;
> +		/*
> +		 * cl->refcount == 0 now if and only if
> +		 * cl->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (cl->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  /**
> @@ -67,7 +78,7 @@ void scols_ref_column(struct libscols_column *cl)
>   */
>  void scols_unref_column(struct libscols_column *cl)
>  {
> -	if (cl && --cl->refcount <= 0) {
> +	if (cl && --cl->refcount == 0) {
>  		DBG(COL, ul_debugobj(cl, "dealloc"));
>  		list_del(&cl->cl_columns);
>  		scols_reset_cell(&cl->header);
> diff --git a/libsmartcols/src/filter.c b/libsmartcols/src/filter.c
> index 4923cd802..a9254d9cd 100644
> --- a/libsmartcols/src/filter.c
> +++ b/libsmartcols/src/filter.c
> @@ -60,13 +60,24 @@ struct libscols_filter *scols_new_filter(const char *str)
>   * @fltr: filter instance
>   *
>   * Increment filter reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   *
>   * Since: 2.40
>   */
>  void scols_ref_filter(struct libscols_filter *fltr)
>  {
> -	if (fltr)
> +	if (fltr) {
>  		fltr->refcount++;
> +		/*
> +		 * fltr->refcount == 0 now if and only if
> +		 * fltr->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (fltr->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  static void reset_filter(struct libscols_filter *fltr)
> @@ -112,7 +123,7 @@ static void remove_counters(struct libscols_filter *fltr)
>   */
>  void scols_unref_filter(struct libscols_filter *fltr)
>  {
> -	if (fltr && --fltr->refcount <= 0) {
> +	if (fltr && --fltr->refcount == 0) {
>  		DBG(FLTR, ul_debugobj(fltr, "dealloc"));
>  		reset_filter(fltr);
>  		remove_counters(fltr);
> @@ -149,10 +160,27 @@ void filter_unref_node(struct filter_node *n)
>  	}
>  }
>  
> +/**
> + * filter_ref_node:
> + * @n: filter_node instance
> + *
> + * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
> + */
>  void filter_ref_node(struct filter_node *n)
>  {
> -	if (n)
> +	if (n) {
>  		n->refcount++;
> +		/*
> +		 * n->refcount == 0 now if and only if
> +		 * n->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (n->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  void filter_dump_node(struct ul_jsonwrt *json, struct filter_node *n)
> diff --git a/libsmartcols/src/grouping.c b/libsmartcols/src/grouping.c
> index 7e004b647..7445a7fb4 100644
> --- a/libsmartcols/src/grouping.c
> +++ b/libsmartcols/src/grouping.c
> @@ -1,6 +1,8 @@
>  /*
>   * Copyright (C) 2018 Karel Zak <kzak@redhat.com>
>   */
> +#include <stdlib.h>
> +
>  #include "smartcolsP.h"
>  
>  /**
> @@ -15,10 +17,28 @@
>   */
>  
>  /* Private API */
> +
> +/**
> + * scols_ref_group:
> + * @gr: group instance
> + *
> + * Increments reference counter.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
> + */
>  void scols_ref_group(struct libscols_group *gr)
>  {
> -	if (gr)
> +	if (gr) {
>  		gr->refcount++;
> +		/*
> +		 * gr->refcount == 0 now if and only if
> +		 * gr->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (gr->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  void scols_group_remove_children(struct libscols_group *gr)
> @@ -61,7 +81,7 @@ void scols_group_remove_members(struct libscols_group *gr)
>  /* note group has to be already without members to deallocate */
>  void scols_unref_group(struct libscols_group *gr)
>  {
> -	if (gr && --gr->refcount <= 0) {
> +	if (gr && --gr->refcount == 0) {
>  		DBG(GROUP, ul_debugobj(gr, "dealloc"));
>  		scols_group_remove_children(gr);
>  		list_del(&gr->gr_groups);
> diff --git a/libsmartcols/src/line.c b/libsmartcols/src/line.c
> index ffefcfba0..7789ed3aa 100644
> --- a/libsmartcols/src/line.c
> +++ b/libsmartcols/src/line.c
> @@ -56,11 +56,22 @@ struct libscols_line *scols_new_line(void)
>   * @ln: a pointer to a struct libscols_line instance
>   *
>   * Increases the refcount of @ln.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void scols_ref_line(struct libscols_line *ln)
>  {
> -	if (ln)
> +	if (ln) {
>  		ln->refcount++;
> +		/*
> +		 * ln->refcount == 0 now if and only if
> +		 * ln->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (ln->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  /**
> @@ -72,7 +83,7 @@ void scols_ref_line(struct libscols_line *ln)
>   */
>  void scols_unref_line(struct libscols_line *ln)
>  {
> -	if (ln && --ln->refcount <= 0) {
> +	if (ln && --ln->refcount == 0) {
>  		DBG(CELL, ul_debugobj(ln, "dealloc"));
>  		list_del(&ln->ln_lines);
>  		list_del(&ln->ln_children);
> diff --git a/libsmartcols/src/smartcolsP.h b/libsmartcols/src/smartcolsP.h
> index 1e9dcec01..8e6e92d09 100644
> --- a/libsmartcols/src/smartcolsP.h
> +++ b/libsmartcols/src/smartcolsP.h
> @@ -61,7 +61,7 @@ struct libscols_iter {
>   * Tree symbols
>   */
>  struct libscols_symbols {
> -	int	refcount;
> +	size_t	refcount;
>  
>  	char	*tree_branch;
>  	char	*tree_vert;
> @@ -69,7 +69,7 @@ struct libscols_symbols {
>  
>  	char	*group_vert;
>  	char	*group_horz;
> -	char    *group_first_member;
> +	char	*group_first_member;
>  	char	*group_last_member;
>  	char	*group_middle_member;
>  	char	*group_last_child;
> @@ -111,7 +111,7 @@ struct libscols_wstat {
>   * Table column
>   */
>  struct libscols_column {
> -	int	refcount;	/* reference counter */
> +	size_t	refcount;	/* reference counter */
>  	size_t	seqnum;		/* column index */
>  
>  	size_t	width;		/* expected column width */
> @@ -182,9 +182,9 @@ enum {
>  #define SCOLS_GRPSET_CHUNKSIZ	3
>  
>  struct libscols_group {
> -	int     refcount;
> +	size_t	refcount;
>  
> -	size_t  nmembers;
> +	size_t	nmembers;
>  
>  	struct list_head gr_members;	/* head of line->ln_group */
>  	struct list_head gr_children;	/* head of line->ln_children */
> @@ -197,7 +197,7 @@ struct libscols_group {
>   * Table line
>   */
>  struct libscols_line {
> -	int	refcount;
> +	size_t	refcount;
>  	size_t	seqnum;
>  
>  	void	*userdata;
> @@ -227,7 +227,7 @@ enum {
>   * The table
>   */
>  struct libscols_table {
> -	int	refcount;
> +	size_t	refcount;
>  	char	*name;		/* optional table name (for JSON) */
>  	size_t	ncols;		/* number of columns */
>  	size_t  ntreecols;	/* number of columns with SCOLS_FL_TREE */
> @@ -527,7 +527,7 @@ enum filter_etype {
>  
>  struct filter_node {
>  	enum filter_ntype type;
> -	int refcount;
> +	size_t refcount;
>  };
>  
>  #define filter_node_get_type(n)	(((struct filter_node *)(n))->type)
> @@ -549,7 +549,7 @@ struct libscols_counter {
>  };
>  
>  struct libscols_filter {
> -	int refcount;
> +	size_t refcount;
>  	char *errmsg;
>  	struct filter_node *root;
>  	FILE *src;
> diff --git a/libsmartcols/src/symbols.c b/libsmartcols/src/symbols.c
> index 2fadfc7ad..9acb62fa3 100644
> --- a/libsmartcols/src/symbols.c
> +++ b/libsmartcols/src/symbols.c
> @@ -43,11 +43,22 @@ struct libscols_symbols *scols_new_symbols(void)
>   * @sy: a pointer to a struct libscols_symbols instance
>   *
>   * Increases the refcount of @sy.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void scols_ref_symbols(struct libscols_symbols *sy)
>  {
> -	if (sy)
> +	if (sy) {
>  		sy->refcount++;
> +		/*
> +		 * sy->refcount == 0 now if and only if
> +		 * sy->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (sy->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  /**
> @@ -58,7 +69,7 @@ void scols_ref_symbols(struct libscols_symbols *sy)
>   */
>  void scols_unref_symbols(struct libscols_symbols *sy)
>  {
> -	if (sy && --sy->refcount <= 0) {
> +	if (sy && --sy->refcount == 0) {
>  		free(sy->tree_branch);
>  		free(sy->tree_vert);
>  		free(sy->tree_right);
> diff --git a/libsmartcols/src/table.c b/libsmartcols/src/table.c
> index aa7cdf3c6..9d60519e5 100644
> --- a/libsmartcols/src/table.c
> +++ b/libsmartcols/src/table.c
> @@ -96,11 +96,22 @@ struct libscols_table *scols_new_table(void)
>   * @tb: a pointer to a struct libscols_table instance
>   *
>   * Increases the refcount of @tb.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
>   */
>  void scols_ref_table(struct libscols_table *tb)
>  {
> -	if (tb)
> +	if (tb) {
>  		tb->refcount++;
> +		/*
> +		 * tb->refcount == 0 now if and only if
> +		 * tb->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (tb->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  static void scols_table_remove_groups(struct libscols_table *tb)
> @@ -123,7 +134,7 @@ static void scols_table_remove_groups(struct libscols_table *tb)
>   */
>  void scols_unref_table(struct libscols_table *tb)
>  {
> -	if (tb && (--tb->refcount <= 0)) {
> +	if (tb && (--tb->refcount == 0)) {
>  		DBG(TAB, ul_debugobj(tb, "dealloc <-"));
>  		scols_table_remove_groups(tb);
>  		scols_table_remove_lines(tb);
> diff --git a/misc-utils/lsblk-devtree.c b/misc-utils/lsblk-devtree.c
> index 5e9d38da1..1736c82ed 100644
> --- a/misc-utils/lsblk-devtree.c
> +++ b/misc-utils/lsblk-devtree.c
> @@ -16,11 +16,12 @@
>   *
>   * Copyright (C) 2018 Karel Zak <kzak@redhat.com>
>   */
> +#include <stdlib.h>
> +
>  #include "lsblk.h"
>  #include "sysfs.h"
>  #include "pathnames.h"
>  
> -
>  void lsblk_reset_iter(struct lsblk_iter *itr, int direction)
>  {
>  	if (direction == -1)
> @@ -51,10 +52,27 @@ struct lsblk_device *lsblk_new_device(void)
>  	return dev;
>  }
>  
> +/**
> + * lsblk_ref_device:
> + * @dev: a pointer to a struct lsblk_device instance
> + *
> + * Increments the refcount of @dev.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
> + */
>  void lsblk_ref_device(struct lsblk_device *dev)
>  {
> -	if (dev)
> +	if (dev) {
>  		dev->refcount++;
> +		/*
> +		 * dev->refcount == 0 now if and only if
> +		 * dev->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (dev->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  /* removes dependence from child as well as from parent */
> @@ -101,7 +119,7 @@ void lsblk_unref_device(struct lsblk_device *dev)
>  	if (!dev)
>  		return;
>  
> -	if (--dev->refcount <= 0) {
> +	if (--dev->refcount == 0) {
>  		DBG(DEV, ul_debugobj(dev, " freeing [%s] <<", dev->name));
>  
>  		device_remove_dependences(dev);
> @@ -251,10 +269,27 @@ struct lsblk_devtree *lsblk_new_devtree(void)
>  	return tr;
>  }
>  
> +/**
> + * lsblk_ref_devtree:
> + * @tr: a pointer to a struct lsblk_devtree instance
> + *
> + * Increments the refcount of @tr.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
> + */
>  void lsblk_ref_devtree(struct lsblk_devtree *tr)
>  {
> -	if (tr)
> +	if (tr) {
>  		tr->refcount++;
> +		/*
> +		 * tr->refcount == 0 now if and only if
> +		 * tr->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (tr->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  void lsblk_unref_devtree(struct lsblk_devtree *tr)
> @@ -262,7 +297,7 @@ void lsblk_unref_devtree(struct lsblk_devtree *tr)
>  	if (!tr)
>  		return;
>  
> -	if (--tr->refcount <= 0) {
> +	if (--tr->refcount == 0) {
>  		DBG(TREE, ul_debugobj(tr, "dealloc"));
>  
>  		while (!list_empty(&tr->devices)) {
> diff --git a/misc-utils/lsblk.h b/misc-utils/lsblk.h
> index 90d2df1a1..f51949ec0 100644
> --- a/misc-utils/lsblk.h
> +++ b/misc-utils/lsblk.h
> @@ -124,7 +124,7 @@ struct lsblk_devdep {
>  };
>  
>  struct lsblk_device {
> -	int	refcount;
> +	size_t	refcount;
>  
>  	struct list_head	childs;		/* list with lsblk_devdep */
>  	struct list_head	parents;
> @@ -193,7 +193,7 @@ struct lsblk_devnomap {
>   *    md0 -> sda1 -> sda
>   */
>  struct lsblk_devtree {
> -	int	refcount;
> +	size_t	refcount;
>  
>  	struct list_head	roots;		/* tree root devices */
>  	struct list_head	devices;	/* all devices */
> diff --git a/sys-utils/lscpu-cpu.c b/sys-utils/lscpu-cpu.c
> index 0619e7d34..1f306bb5d 100644
> --- a/sys-utils/lscpu-cpu.c
> +++ b/sys-utils/lscpu-cpu.c
> @@ -8,6 +8,8 @@
>   *
>   * Copyright (C) 2020 Karel Zak <kzak@redhat.com>
>   */
> +#include <stdlib.h>
> +
>  #include "lscpu.h"
>  
>  struct lscpu_cpu *lscpu_new_cpu(int id)
> @@ -28,10 +30,27 @@ struct lscpu_cpu *lscpu_new_cpu(int id)
>  	return cpu;
>  }
>  
> +/**
> + * lscpu_ref_cpu:
> + * @cpu: a pointer to a struct lscpu_cpu instance
> + *
> + * Increments the refcount of @cpu.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
> + */
>  void lscpu_ref_cpu(struct lscpu_cpu *cpu)
>  {
> -	if (cpu)
> +	if (cpu) {
>  		cpu->refcount++;
> +		/*
> +		 * cpu->refcount == 0 now if and only if
> +		 * cpu->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (cpu->refcount == 0)
> +			abort();
> +	}
>  }
>  
>  void lscpu_unref_cpu(struct lscpu_cpu *cpu)
> @@ -39,7 +58,7 @@ void lscpu_unref_cpu(struct lscpu_cpu *cpu)
>  	if (!cpu)
>  		return;
>  
> -	if (--cpu->refcount <= 0) {
> +	if (--cpu->refcount == 0) {
>  		DBG(CPU, ul_debugobj(cpu, "  freeing #%d", cpu->logical_id));
>  		lscpu_unref_cputype(cpu->type);
>  		cpu->type = NULL;
> diff --git a/sys-utils/lscpu-cputype.c b/sys-utils/lscpu-cputype.c
> index 958cbe7b6..9dffb8df9 100644
> --- a/sys-utils/lscpu-cputype.c
> +++ b/sys-utils/lscpu-cputype.c
> @@ -8,6 +8,7 @@
>   *
>   * Copyright (C) 2020 Karel Zak <kzak@redhat.com>
>   */
> +#include <stdlib.h>
>  #include <sys/utsname.h>
>  #include <sys/personality.h>
>  
> @@ -69,11 +70,27 @@ struct lscpu_cputype *lscpu_new_cputype(void)
>  	return ct;
>  }
>  
> +/**
> + * lscpu_ref_cputype:
> + * @ct: a pointer to a struct lscpu_cputype instance
> + *
> + * Increments the refcount of @ct.
> + * Calls abort() if reference counter equals SIZE_MAX prior to the increment.
> + */
>  void lscpu_ref_cputype(struct lscpu_cputype *ct)
>  {
>  	if (ct) {
>  		ct->refcount++;
> -		/*DBG(TYPE, ul_debugobj(ct, ">>> ref %d", ct->refcount));*/
> +		/*DBG(TYPE, ul_debugobj(ct, ">>> ref %zu", ct->refcount));*/
> +		/*
> +		 * ct->refcount == 0 now if and only if
> +		 * ct->refcount == SIZE_MAX prior to the increment.
> +		 *
> +		 * Checking for overflow after the increment instead of before
> +		 * seems to generate better assembly.
> +		 */
> +		if (ct->refcount == 0)
> +			abort();
>  	}
>  }
>  
> @@ -82,9 +99,9 @@ void lscpu_unref_cputype(struct lscpu_cputype *ct)
>  	if (!ct)
>  		return;
>  
> -	/*DBG(TYPE, ul_debugobj(ct, ">>> unref %d", ct->refcount - 1));*/
> +	/*DBG(TYPE, ul_debugobj(ct, ">>> unref %zu", ct->refcount - 1));*/
>  
> -	if (--ct->refcount <= 0) {
> +	if (--ct->refcount == 0) {
>  		DBG(TYPE, ul_debugobj(ct, "  freeing %s/%s", ct->vendor, ct->model));
>  		lscpu_cputype_free_topology(ct);
>  		free(ct->vendor);
> diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h
> index 0fae5d29e..5f5a0315a 100644
> --- a/sys-utils/lscpu.h
> +++ b/sys-utils/lscpu.h
> @@ -13,6 +13,7 @@
>  #define LSCPU_H
>  
>  #include <stdbool.h>
> +#include <stddef.h>
>  
>  #include "c.h"
>  #include "nls.h"
> @@ -67,7 +68,7 @@ struct lscpu_cache {
>  };
>  
>  struct lscpu_cputype {
> -	int	refcount;
> +	size_t	refcount;
>  
>  	char	*vendor;
>  	int	vendor_id;	/* created by lscpu_decode_arm() */
> @@ -137,7 +138,7 @@ enum {
>  };
>  
>  struct lscpu_cpu {
> -	int refcount;
> +	size_t refcount;
>  	struct lscpu_cputype *type;
>  
>  	int logical_id;
> -- 
> 2.53.0
> 
> 

-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com


^ permalink raw reply

* Re: [PATCH] fdisk: (man) correct the markup + punctuation of two option descriptions
From: Karel Zak @ 2026-02-25 11:59 UTC (permalink / raw)
  To: Benno Schulenberg; +Cc: util-linux
In-Reply-To: <20260224152422.52931-1-bensberg@telfort.nl>

On Tue, Feb 24, 2026 at 04:24:22PM +0100, Benno Schulenberg wrote:
>  disk-utils/fdisk.8.adoc | 7 ++-----
>  1 file changed, 2 insertions(+), 5 deletions(-)

Applied, thanks!

-- 
 Karel Zak  <kzak@redhat.com>
 http://karelzak.blogspot.com


^ permalink raw reply

* [ANNOUNCE] util-linux v2.42-rc1
From: Karel Zak @ 2026-02-26 12:53 UTC (permalink / raw)
  To: linux-kernel, linux-fsdevel, util-linux


The util-linux release v2.42-rc1 is now available at
 
  http://www.kernel.org/pub/linux/utils/util-linux/v2.42/
 
Feedback and bug reports, as always, are welcomed.
 
  Karel


util-linux 2.42 Release Notes
=============================

The NTFS mount type (kernel FS driver) can be changed by the compile option
--with-ntfs-mounttype=, the default is ntfs3.

login(1) now uses the original FQDN (as specified by "-h <host>") to configure
the PAM RHOST item. All previous versions used the hostname without domain.
This may affect users who use login(1) for remote access (rlogin, rsh) and
pam_access to define access rules. (Don't worry, if you still use rlogin then
security is already irrelevant for you.)

login(1), if configured with LOGIN_SHELL_FALLBACK in login.defs, can fall back
to another valid shell from /etc/shells if the user's configured shell is
inaccessible due to administrative errors.

agetty reads issue file(s) in a way compatible with libeconf and systemd,
hermetic-usr and drop-ins are now supported. For more details see
https://uapi-group.org/specifications/specs/configuration_files_specification/

agetty uses netlink to get network interface information for issue file output.

The libsmartcols-based tools with JSON support can now produce additional JSON
formats. The output format may be changed by LIBSMARTCOLS_JSON={lines,compact}
environment variable.

column(1) now supports colors.

New command copyfilerange(1) to copy file ranges using the copy_file_range()
syscall.

New command getino(1) to print the unique inode number associated with a
process file descriptor or namespace for a given PID.

fadvise(1) now supports --fd to address a file by file descriptor rather than
by path.

fallocate(1) now supports --report-holes to scan the file and report the
distribution of holes.

A significant performance regression has been fixed in hardlink(1).

hardlink(1) now supports FIEMAP-based sparse file optimization.

kill(1), waitpid(1) and nsenter(1) now support the PID:INO convention to
precisely address processes.

mount(8) now supports --beneath to atomically replace a filesystem at a
mountpoint.

mount(8) now supports --exclusive to ensure that the filesystem is mounted as a
unique instance and that the superblock is not reused by the kernel.

libmount now reads filesystem information from udevd (with fallback to classic
libblkid-based detection). This feature can be disabled by
--disable-libmount-udev-support.

setarch(8) now supports --pid to show the personality of a specified process.

The pager support for tools like "dmesg -H" has been improved to work better
with signals.

losetup(8) now supports --remove to remove a loop device node from the system.

lsblk(8), lslocks(8), lsmem(1) and lsclocks(1) support <NAME>_COLUMNS
environment variable to specify output columns as an alternative to --output.

lsfd(1) now supports new UNIX.IPEER, PACKET.PROTOCOL.RAW and TUN.DEVNETNS
columns.

setpriv(1) now supports landlock via --landlock-access and --landlock-rule
options.


Changes between v2.41 and v2.42
-------------------------------

agetty:
    - Fix reading /run/issue.d/ again (by Fabian Vogt)
    - Process all data from ul_nl_process() (by Stanislav Brabec)
    - Implement netlink based IP processing (by Stanislav Brabec)
    - use standard path macros (by Karel Zak)
    - using configs lib for parsing issue files (by Stefan Schubert)
    - fix erasure of escape sequences and tab characters (by Karel Zak)
    - fix stdin conversion to tty name (by Karel Zak)

agetty,setterm:
    - (man) remove the mistakenly added -h and -V short options (by Benno Schulenberg)

AUTHORS:
    - add copyfilerange (by Karel Zak)
    - update Zhenwei Pi email (by zhenwei pi)

autotools:
    - use $PTHREAD_LIBS everywhere (by Karel Zak)
    - optionally add libpthread to uuid.pc (by Bernd Kuhls)
    - cleanup tests to use libcommon.la (by Karel Zak)
    - don't use wide-character ncurses if --disable-widechar (by Karel Zak)
    - add missing meson.build files (by Karel Zak)
    - Fix use of mq_open and mq_close (by Samuel Thibault)
    - remove tools/git-tp-sync-man (by Karel Zak)

bash-completion:
    - add getino completions (by Christian Goeschel Ndjomouo)
    - (lscpu) add --annotate option (by Christian Goeschel Ndjomouo)
    - (lslogins) fix typo in long option (by Christian Goeschel Ndjomouo)
    - (unshare) add missing --map-subids option (by Christian Goeschel Ndjomouo)
    - (mountpoint) add missing --show option (by Christian Goeschel Ndjomouo)
    - (mount) add missing --ro option (by Christian Goeschel Ndjomouo)
    - (lslogins) add missing long options (by Christian Goeschel Ndjomouo)
    - (lsclocks) add missing --no-discover-rtc option (by Christian Goeschel Ndjomouo)
    - (hwclock) add missing --ul-debug option (by Christian Goeschel Ndjomouo)
    - (flock) add missing long options (by Christian Goeschel Ndjomouo)
    - (nsenter) add missing --follow-context (by cgoesche)
    - (namei) add missing --context (by cgoesche)
    - (setpriv) add missing long options (by cgoesche)
    - (pg) add missing long options (by cgoesche)
    - (lastlog2) add missing --active (by cgoesche)
    - (whereis) add missing long options (by Christian Goeschel Ndjomouo)
    - (wdctl) add missing long options (by Christian Goeschel Ndjomouo)
    - (uuidd) add missing --cont-clock (by Christian Goeschel Ndjomouo)
    - (unshare) add missing long options (by Christian Goeschel Ndjomouo)
    - (swapon) add missing --options (by Christian Goeschel Ndjomouo)
    - (sfdisk) add missing long options (by Christian Goeschel Ndjomouo)
    - (setsid) add missing --fork (by Christian Goeschel Ndjomouo)
    - (scriptlive) add missing --echo (by Christian Goeschel Ndjomouo)
    - (renice) add missing --relative (by Christian Goeschel Ndjomouo)
    - (more) add missing --exit-on-eof (by Christian Goeschel Ndjomouo)
    - (mkswap) add missing long options (by Christian Goeschel Ndjomouo)
    - (mkfs.minix) add missing --lock (by Christian Goeschel Ndjomouo)
    - (mkfs.cramfs) add missing long options (by Christian Goeschel Ndjomouo)
    - (mkfs.bfs) add missing --lock (by Christian Goeschel Ndjomouo)
    - (lsmem) add missing --split (by Christian Goeschel Ndjomouo)
    - (lslogins) add missing --shell (by Christian Goeschel Ndjomouo)
    - (lscpu) add missing --hierarchic (by Christian Goeschel Ndjomouo)
    - (lsclocks) add missing --no-discover-dynamic (by Christian Goeschel Ndjomouo)
    - (lsblk) add missing long options (by Christian Goeschel Ndjomouo)
    - (losetup) add missing long options (by Christian Goeschel Ndjomouo)
    - (hwclock) add missing long options (by Christian Goeschel Ndjomouo)
    - (hardlink) add missing long options (by Christian Goeschel Ndjomouo)
    - (getopt) add missing --unknown (by Christian Goeschel Ndjomouo)
    - (fsck) add missing long options (by Christian Goeschel Ndjomouo)
    - (flock) add missing --verbose (by Christian Goeschel Ndjomouo)
    - (findmnt) add missing long options (by Christian Goeschel Ndjomouo)
    - (fincore) add missing --total (by Christian Goeschel Ndjomouo)
    - (fallocate) add missing --write-zeroes (by Christian Goeschel Ndjomouo)
    - (fadvise) add missing --fd (by Christian Goeschel Ndjomouo)
    - (column) add missing long options (by Christian Goeschel Ndjomouo)
    - (cfdisk) add missing --sector-size (by Christian Goeschel Ndjomouo)
    - (cal) add missing long options (by Christian Goeschel Ndjomouo)
    - (blockdev) add missing long options (by Christian Goeschel Ndjomouo)
    - (blkid) add missing --hint (by Christian Goeschel Ndjomouo)
    - (bits) add missing --binary (by Christian Goeschel Ndjomouo)
    - (mount) add missing options (by Christian Goeschel Ndjomouo)
    - (lslogins) add --list-columns option (by Christian Goeschel Ndjomouo)
    - (lslogins) add --json completion (by Christian Goeschel Ndjomouo)
    - dmesg remove redundant completion for --buffer-size (by Christian Goeschel Ndjomouo)
    - dmesg complete filenames for --kmsg-file (by Christian Goeschel Ndjomouo)
    - dmesg add missing long options (by Christian Goeschel Ndjomouo)
    - add lsfd (by Karel Zak)
    - add blkpr (by Karel Zak)
    - add bits to dist tarball (by Karel Zak)
    - (swapon) add --annotation option (by Christian Goeschel Ndjomouo)
    - add MICROCODE to $OPTS_ALL (by Christian Goeschel Ndjomouo)
    - (lsns) add -H/--list-columns options (by Christian Goeschel Ndjomouo)
    - (lscpu) add -H/--list-columns options (by Christian Goeschel Ndjomouo)
    - add fallback to filename expansion for umount (by Christian Goeschel Ndjomouo)
    - fix function name of enosys completion (by Koichi Murase)
    - add choom and coresched (by Karel Zak)
    - update autocompletion list to 'ntfs3' (by Johannes Schneider)
    - use "command ls" instead of "\ls" (by Koichi Murase)
    - prefix "command" to other external commands (by Koichi Murase)
    - prefer "builtin cd" to "cd" to avoid aliases (by Koichi Murase)
    - prefer "command lsblk" to "lsblk" to avoid aliases (by Koichi Murase)
    - (chrt) add completion for -e/--ext (by Shashank Balaji)
    - (setarch) show some options as the 1st arg (by Masatake YAMATO)

bits:
    - only build when cpu_set_t is available (by Alyssa Ross)
    - (man) normalize the markup and improve some layout (by Benno Schulenberg)

blkdev:
    - Correct zone report size calculation (by Leefancy)

blkdiscard:
    - (tests) add more long option tests (by Christian Goeschel Ndjomouo)

blkid:
    - add --garbage-collect test (by Christian Goeschel Ndjomouo)
    - (testcoverage) add more long option tests (by Christian Goeschel Ndjomouo)
    - move error checks before JSON output initialization (by Karel Zak)
    - Drop const from blkid_partitions_get_name() (by Daan De Meyer)
    - correct an erroneous error message (by Benno Schulenberg)

blkpr:
    - fix compilation [-Werror,-Wunused-function] (by Karel Zak)
    - Call gettext() for descriptions, clean up (by Karel Zak)
    - add read-reservation command (by Stefan Hajnoczi)
    - add read-keys command (by Stefan Hajnoczi)
    - prepare for _IOR() ioctls (by Stefan Hajnoczi)

blkzone:
    - remove unnecessary brackets (by Karel Zak)
    - add more checks when printing zone write_pointer (by Wilfred Mallawa)
    - make N/A string translatable (by Karel Zak)
    - don't show wptr when zones are full (by Wilfred Mallawa)
    - (man) reduce two overblown tables to legible proportions (by Benno Schulenberg)

build:
    - simplify checks for fallocate() and posix_fallocate() (by Thomas Weißschuh)

build(deps):
    - bump actions/cache from 4 to 5 (by dependabot[bot])
    - bump actions/upload-artifact from 5 to 6 (by dependabot[bot])
    - bump actions/checkout from 1 to 6 (by dependabot[bot])
    - bump actions/upload-artifact from 4 to 5 (by dependabot[bot])
    - bump github/codeql-action from 3 to 4 (by dependabot[bot])
    - bump actions/labeler from 5 to 6 (by dependabot[bot])
    - bump actions/checkout from 1 to 5 (by dependabot[bot])

build-sys:
    - add a target for tools/testcoverage.sh (by Christian Goeschel Ndjomouo)
    - (gcc) ignore -Wunused-but-set-variable for bison (by Christian Goeschel Ndjomouo)
    - make sure _PATH_SYSCONFDIR is defined (by Karel Zak)
    - update release dates (by Karel Zak)
    - keep the most recent version in NEWS (by Karel Zak)

cal:
    - add note about today highlight on -w (by Karel Zak)
    - improve header color printing (by Karel Zak)

cfdisk:
    - fix memory leak and possible NULL dereference [gcc-analyzer] (by Karel Zak)

chfn:
    - allow --help and --version without login.defs restrictions (by Karel Zak)
    - improve man page (by Christian Goeschel Ndjomouo)
    - make comment more accurate (by Christian Goeschel Ndjomouo)
    - fix minor grammar mistakes in comments (by Christian Goeschel Ndjomouo)
    - use true/false bool values for semantic clarity (by Christian Goeschel Ndjomouo)
    - use direct equality check for semantic clarity and readability (by Christian Goeschel Ndjomouo)
    - free memory before return from save_new_data() (by Christian Goeschel Ndjomouo)
    - use null character (0) for better readability (by Christian Goeschel Ndjomouo)
    - fix typos, wording, and punctuation inconsistencies (by Christian Goeschel Ndjomouo)
    - enable the use of the username or UID (by Christian Goeschel Ndjomouo)

chmem:
    - do not word a configuration failure as an instruction to the user (by Benno Schulenberg)
    - improve messages (by Karel Zak)
    - add chmem documentation for dynamic (de)configuration of memory (by Sumanth Korikkar)
    - add support for dynamic (de)configuration of hotplug memory (by Sumanth Korikkar)
    - Remove commit - chmem print warnings about failures always (by Sumanth Korikkar)
    - (man) add missing end-of-bold marker, and add missing OR bar (by Benno Schulenberg)
    - print warnings about failures always (not only with --verbose) (by Benno Schulenberg)

choom:
    - (testcoverage) add long options tests (by Christian Goeschel Ndjomouo)
    - (man) add the missing SYNOPSIS section header, and improve wording (by Benno Schulenberg)

chrt:
    - (man) fix note about --sched-period lower limit (by Jan Krieg)
    - (man,usage) put --pid first in synopses and examples, for clarity (by Benno Schulenberg)
    - (man) improve wording and markup of some examples (by Benno Schulenberg)
    - (man,usage) mark the priority value as optional in the synopses (by Benno Schulenberg)
    - produce better error message for missing priority with implied -r (by Benno Schulenberg)
    - Allow optional priority for non‑prio policies without --pid (by Madadi Vineeth Reddy)
    - do not try to interpret any other option as a PID either (by Benno Schulenberg)
    - simplify the other check for too few arguments (by Benno Schulenberg)
    - do not try to interpret the --pid option itself as a PID (by Benno Schulenberg)
    - with more than one argument, interpret first argument as priority (by Benno Schulenberg)
    - (man) mark "argument" as optional, and unabbreviate it in usage (by Benno Schulenberg)
    - (man) correct the short form of --ext, from -d to -e (by Benno Schulenberg)
    - Make priority optional for policies that don't use it (by Madadi Vineeth Reddy)
    - Only display current settings when no policy is specified (by Madadi Vineeth Reddy)
    - Make minor cleanups in chrt (by Madadi Vineeth Reddy)
    - (man) add SCHED_EXT (by Shashank Balaji)
    - add support for SCHED_EXT (by Shashank Balaji)

chsh:
    - extend usage message (by Tobias Stoeckmann)
    - use new xgetuserpw() instead of xgetpwnam() (by Christian Goeschel Ndjomouo)

ci:
    - add usage message consistency check to CI CODECHECK phase (by Christian Goeschel Ndjomouo)
    - add usage message consistency check to CI CHECK phase (by Christian Goeschel Ndjomouo)
    - roll back the version of checkout for "build (compat, ubuntu:18.04)" (by Masatake YAMATO)
    - add bash-completion consistency check to CODECHECK (by Karel Zak)
    - build on MIPS (by Thomas Weißschuh)
    - add OpenWRT subtarget to matrix name (by Thomas Weißschuh)
    - update gcc to version 14 (by Thomas Weißschuh)
    - update clang to version 20 (by Thomas Weißschuh)
    - bump uraimo/run-on-arch-action to v3 (by Frantisek Sumsal)
    - (reverted) temporarily switch the alt-arch job worker to Ubuntu 22.04 (by Frantisek Sumsal)

col:
    - use snprintf() instead of sprintf() (by Karel Zak)

colrm:
    - make two error messages actually say that something is wrong (by Benno Schulenberg)

column:
    - using switch-case replaces if-else (by WanBingjiang)
    - add JSON compact format output subtest. (by WanBingjiang)
    - add JSON LINES format output subtest. (by WanBingjiang)
    - introduce LIBSMARTCOLS_JSON environment argument (by WanBingjiang)
    - add bash-completion for table-header-as-columns (by WanBingjiang)
    - add option '--table-header-as-columns' for using first line as table columns names. (by WanBingjiang)
    - add --input-separator as an alias for --separator (by Karel Zak)
    - (usage) wrap two descriptions, to make them fit within 80 columns (by Benno Schulenberg)
    - (usage) correct the description of --wrap-separator (by Benno Schulenberg)
    - add --wrap-separator option for custom text wrapping (by Karel Zak)
    - add support for color scheme (by Karel Zak)
    - call gettext() on an error message only when it gets printed (by Benno Schulenberg)
    - add --color[=<when>] to control colorization (by Karel Zak)
    - add basic colors support (by Karel Zak)
    - (man) fix broken markup, and improve other markup and wordings (by Benno Schulenberg)
    - fix compiler warning for non-widechar compilation (by Karel Zak)
    - replace a mistaken word in an error message (by Benno Schulenberg)

column doc:
    - add missing attrubutes (by WanBingjiang)
    - fix incorrect attribute hidden (by WanBingjiang)

{configure.ac,meson.build}:
    - conditionally build {enosys,setpriv} if seccomp is present #3280 (by Thomas Devoogdt)

copyfilerange:
    - new command to call copy-file-range (by Dick Marinus)

coresched:
    - reduce excessive whitespace and verbosity in usage text (by Benno Schulenberg)

cpuset:
    - Use stride in cpulist_create (by Jesse Rosenstock)

disk-utils:
    - add attribute nonstring to bfs byte arrays (by Cristian Rodríguez)

dmesg:
    - add bounds checking to parse_kmsg_timestamp() (by Karel Zak)
    - Gracefully handle EPIPE errors (by Tobias Stoeckmann)
    - Register pager_close as exit handler (by Tobias Stoeckmann)
    - Keep error messages in parent's stderr (by Tobias Stoeckmann)
    - update prepare_buffer() comment (by Karel Zak)
    - improve buffer size error message (by Karel Zak)
    - Fix short memory allocation with 32 bit (by Tobias Stoeckmann)
    - Add release_buffer function (by Tobias Stoeckmann)
    - Split preparing and printing of buffer (by Tobias Stoeckmann)
    - Check if file is too large (by Tobias Stoeckmann)
    - Only check for newline if input exists (by Tobias Stoeckmann)
    - Check input length before calling strtol (by Tobias Stoeckmann)
    - fix const qualifier warnings in parse_callerid (by Karel Zak)
    - use snprintf() instead of sprintf() (by Karel Zak)

docs:
    - lsns(8) add missing a comma in SEE ALSO section (by Masatake YAMATO)
    - write about EditorConfig (by Masatake YAMATO)
    - update mount options for 'ntfs3' (by Johannes Schneider)
    - update mount type to 'ntfs3' (by Johannes Schneider)
    - stop the copyright verbiage from getting included in the POT file (by Benno Schulenberg)
    - make the "po4a:" line the first line, like in all other .adoc files (by Benno Schulenberg)
    - correct mistaken uses of "overwrite" to say "override" instead (by Benno Schulenberg)
    - correct misspellings of "may be" and mistaken uses of "overwritten" (by Benno Schulenberg)
    - add -h/--help and -V/--version to three man pages that lacked them (by Benno Schulenberg)
    - fix a few indentation issues (by Benno Schulenberg)
    - improve and harmonize the description of -H / --list-columns (by Benno Schulenberg)
    - rewrite the description of --bytes, to be clearer (by Benno Schulenberg)
    - cherry-pick 2.41-ReleaseNotes (by Karel Zak)

docs,usage:
    - harmonize description of --hyperlink, and add 2 missing ones (by Benno Schulenberg)

Documentation:
    - Fix "maybe be" typo (by Tobias Stoeckmann)

editorconfig:
    - add .sh setting (by Karel Zak)

eject:
    - fix const qualifier warning in read_speed (by Karel Zak)
    - (man) add the missing SYNOPSIS header (by Benno Schulenberg)

enosys:
    - fix const qualifier warning in parse_block (by Karel Zak)
    - add the missing arguments of -s and -i to the usage text (by Benno Schulenberg)

env:
    - ignore only invalid environment variables (by Tobias Stoeckmann)

exch:
    - cosmetic code changes (by Karel Zak)
    - fix compile error if renameat2 is not present (by Thomas Devoogdt)

fadvise:
    - add --fd to the help output (by Christian Goeschel Ndjomouo)

fallocate:
    - refactor --report-holes and --dig-holes output (by Karel Zak)
    - add --report-holes (by syokensyo)
    - require posix_fallocate() from libc (by Thomas Weißschuh)
    - drop syscall() fallback for fallocate() (by Thomas Weißschuh)
    - allow O_CREATE if mode is FALLOC_FL_WRITE_ZEROES (by Lukas Herbolt)
    - (man,usage) correct the alphabetical sorting of the options (by Benno Schulenberg)
    - (man) slightly improve the grammar of two sentences (by Benno Schulenberg)
    - redo four tweaks that were accidentally undone (by Benno Schulenberg)
    - update FALLOC_FL_WRITE_ZEROES (by Karel Zak)
    - add FALLOC_FL_WRITE_ZEROES support (by Zhang Yi)
    - rework incompatible options (by Antonio Russo)

fdformat:
    - use size_t and ssize_t (by Karel Zak)

fdisk:
    - (man) correct the markup + punctuation of two option descriptions (by Benno Schulenberg)
    - make SIGINT handler signal-safe (by Tobias Stoeckmann)
    - (manpage) add --bytes option description (by Christian Goeschel Ndjomouo)
    - fix possible memory leak (by Karel Zak)
    - (man) add note about partition size calculation (by Karel Zak)

fdisk,partx:
    - avoid strcasecmp() for ASCII-only strings (by Karel Zak)

fincore:
    - The previous exit did not call munmap, resulting in a memory mapping leak. (by fortunate-lee)
    - close the ftsp to prevent fd leak (by syokensyo)
    - do not fall back to mincore if cachestat fails with EPERM (by Thomas Weißschuh)
    - add option to show a grand total (by Matteo Croce)
    - add recursive directory scanning (by Matteo Croce)

findmnt:
    - fix misleading warning messages for ntfs3 (by Karel Zak)
    - (usage) add a needed equals sign before an optional argument (by Benno Schulenberg)
    - add missing newline in --raw, --pair and --list output formats (by Christian Goeschel Ndjomouo)
    - fix -k option parsing regression (by Karel Zak)
    - (man) remove duplicated option, and correct a description (by Benno Schulenberg)

fix:
    - use Py_REFCNT macro to work with free-threaded python (by Wouter Deconinck)

fix typo:
    - exciting -> existing (by Matteo Croce)

flock:
    - (manpage) fix typo in option description (by Christian Goeschel Ndjomouo)
    - resolve consistency issue in the usage message (by Christian Goeschel Ndjomouo)
    - fix incomplete -n option info in usage message (by Christian Goeschel Ndjomouo)
    - support locking with byte-range (by Masatake YAMATO)

fsck.cramfs:
    - fix off-by-one heap write in do_symlink() (by Karel Zak)
    - check buffer size for memcpy() (by Karel Zak)

fstrim:
    - use F_TYPE_EQUAL() macro for statfs.f_type comparison (by cgoesche)
    - mark only the mountpoint as placeholder, not options -A and -a (by Benno Schulenberg)

getino:
    - (manpage) improve grammar and wording (by Christian Goeschel Ndjomouo)
    - new tool to print the unique pidfd or namespace inode number (by Christian Goeschel Ndjomouo)

getopt:
    - (usage) make the description of -U fit within 80 columns (by Benno Schulenberg)
    - add member posixly_correct to struct getopt_control (by Christian Goeschel Ndjomouo)
    - add feature to ignore unknown options (by Christian Goeschel Ndjomouo)
    - clarify the use of '--long' instead of '--longoptions' in shell examples (by cgoesche)
    - document special symbols that should not be used as option characters (by cgoesche)

github:
    - revert actions/checkout for ubuntu 18.04 (by Karel Zak)

gitignore:
    - Ignore tests/diff/ and test/output/ (by Jesse Rosenstock)

hardlink:
    - (man) add note note about ULFILEEQ_DEBUG= (by Karel Zak)
    - (man,usage) sort the options mostly alphabetically (by Benno Schulenberg)
    - (usage) improve the descriptions of three options (by Benno Schulenberg)
    - (usage) remove mistaken period from two option descriptions (by Benno Schulenberg)
    - define more function as inline (by Karel Zak)
    - fix performance regression (inefficient signal evaluation) (by Karel Zak)
    - Use macro for verbose output (by Karel Zak)
    - fix typoed semicolon to colon in error message (by Benno Schulenberg)
    - replace a strange word in an error message (by Benno Schulenberg)

hexdump:
    - (man) document byte order dependency in multi-byte formats (by Karel Zak)
    - sanitize fiemap ioctl output (by Karel Zak)
    - add fetch_more_extents to retrieve all file extents (by WanBingjiang)
    - fixes Heap-buffer-overflow in rewrite_rules (by WanBingjiang)
    - add FIEMAP-based sparse file optimization (by WanBingjiang)
    - (man) put a list item on a single line, to avoid a warning (by Benno Schulenberg)
    - (man) normalize the synopsis, and shrink a list and two tables (by Benno Schulenberg)

hwclock:
    - (manpage) add --param-index description (by Christian Goeschel Ndjomouo)
    - mark non-standard long options to ignore in CI CHECK (by Christian Goeschel Ndjomouo)
    - skip RTC_PARAM_SET for --param-set with unchanged value (by Bastian Krause)
    - use snprintf() instead of sprintf() (by Karel Zak)
    - remove two comments about parameters that no longer exist (by Benno Schulenberg)
    - avoid dereferencing a pointer [coverity scan] (by Karel Zak)

hwclock-rtc:
    - fix verbose output when --param-set value is unchanged (by Jesse Gilles)

hwclock-rtc.c:
    - (reverted) try the 'new' rtc class first (by Rasmus Villemoes)

include:
    - rename mount-api-utils.h to mountutils.h (by Karel Zak)
    - (pidfd-utils.h) conditionally define pidfd inode support (by Christian Goeschel Ndjomouo)
    - (statfs_magic.h) add pidfs magic number (by Christian Goeschel Ndjomouo)
    - add helper routines for opening and validating pidfds (by Christian Goeschel Ndjomouo)
    - implement ARRAY_SIZE with compiler _Countof if supported (by Cristian Rodríguez)
    - use public domain for colors.{c,h} and xalloc.h (by Karel Zak)

include/cctype:
    - fix string comparison (by Karel Zak)

include/c.h:
    - add MAX_OF_UINT_TYPE macro to get max num of an uint type (by Christian Goeschel Ndjomouo)
    - add USAGE_LIST_COLUMNS_OPTION() macro (by Christian Goeschel Ndjomouo)

include/list:
    - add a macro for initializing list_head a declarative way (by Masatake YAMATO)

include/list,lsfd:
    - remove LIST_HEAD macro again (by Masatake YAMATO)

include/mount-api-utils:
    - update to recent kernel (by Karel Zak)
    - avoid using sys/mount.h (by Karel Zak)
    - include linux/unistd.h (by Thomas Weißschuh)
    - improve coding style (by Karel Zak)

include/mountutils:
    - remove duplicate inttypes.h include (by Karel Zak)

include/optutils:
    - improve err_exclusive_options() output (by Karel Zak)

include/path:
    - fix HAVE_STRUCT_STATX use (by Karel Zak)

include/pidfd-utils:
    - improve robustness (by Karel Zak)

include/strutils:
    - add missing header guard comment (by Christian Goeschel Ndjomouo)
    - add ul_strtou16() (by Karel Zak)
    - Add startswithpath() (by Karel Zak)

ipcrm:
    - (manpage) add --verbose description (by Christian Goeschel Ndjomouo)
    - in usage text, use two lines when option+arguments is very long (by Benno Schulenberg)
    - move a constant argument in order to gettextize the message (by Benno Schulenberg)

ipcs:
    - align the first group of options with later ones in the usage text (by Benno Schulenberg)

ipcutils, lsipc:
    - unabbreviate two words in some error messages (by Benno Schulenberg)

irqtop:
    - use standard 'always/never' arguments instead of 'enable/disable' (by Benno Schulenberg)
    - make the wording of an error message identical to that of another (by Benno Schulenberg)
    - improve several more option descriptions, and align them all (by Benno Schulenberg)
    - improve the description of --batch, and align it with others (by Benno Schulenberg)
    - use output string in a more robust way (by Karel Zak)
    - support json output format (by Joe Jin)
    - add max iteration support (by Joe Jin)
    - add batch mode support (by Joe Jin)

irqtop,lsirq:
    - use scols debug (by Karel Zak)
    - set up locale path, so messages get actually translated (by Benno Schulenberg)

jsonwrt:
    - rename ul_json_format_t to enum ul_json_format (by Karel Zak)
    - simplify ul_jsonwrt_empty() and add comments for COMPACT format (by WanBingjiang)
    - support Compact JSON format output (by WanBingjiang)

kill:
    - use uint64_t as type for kill_control->pidfd_ino (by Christian Goeschel Ndjomouo)
    - replace USE_KILL_WITH_PIDFD_INO ifdef with USE_PIDFD_INO_SUPPORT (by Christian Goeschel Ndjomouo)
    - use ul_get_valid_pidfd_or_err() to validate user provided pidfd inodes (by Christian Goeschel Ndjomouo)
    - the situation where fd is opened but not closed (by fortunate-lee)
    - (refactor) rename parameter to better reflect its purpose (by Masatake YAMATO)
    - add support for race-free process kills using pidfd inodes (by Christian Goeschel Ndjomouo)
    - comments fix grammar in parse_arguments() (by Naoki Wake)
    - usage fix wrapped indent in -l/--list description (by Naoki Wake)

kill.1.adoc:
    - update the description for -l/-L option (by Masatake YAMATO)

kill (-l/-L):
    - print one signal per line when stdout is not a TTY (by Masatake YAMATO)

last:
    - (man) reduce an inflated table to sane proportions (by Benno Schulenberg)
    - (man) correct the descriptions of --present and --since (by Benno Schulenberg)
    - don't use a tab character in the --help usage text (by Benno Schulenberg)

lastlog2:
    - besides -v, recognize also the standard -V for --version (by Benno Schulenberg)
    - (man) fix some broken markup, and lowercase option arguments (by Benno Schulenberg)

ldattach:
    - Allow changing the MTU for GSM0710 framing (by Seppo Takalo)
    - add ifndef BOTHER (by Karel Zak)

lib:
    - (strutils.c) fix unchecked lookahead in ul_parse_size() (by Christian Goeschel Ndjomouo)
    - (pidfd-utils) provide a more liberal variant of ul_get_valid_pidfd_or_err() (by Christian Goeschel Ndjomouo)
    - (pidutils) improve the return protocol (by Christian Goeschel Ndjomouo)
    - (pidutils) add a routine to parse pids and err() on failure (by Christian Goeschel Ndjomouo)
    - (pidutils) improve 'PID:inode' parsing logic (by Christian Goeschel Ndjomouo)
    - (pidfd-utils) minor correction in the ul_get_valid_pidfd_or_err() description (by Christian Goeschel Ndjomouo)
    - (pidfd-utils.c) set __unused__ in right way (by Karel Zak)
    - (procfs.c) remove extraneous return statement (by Christian Goeschel Ndjomouo)
    - (pidutils.c) use uint64_t instead of ino_t for seamless cross-compatibility (by Christian Goeschel Ndjomouo)
    - (pidfd-utils.c) remove extraneous _GNU_SOURCE feature test macro (by Christian Goeschel Ndjomouo)
    - (pidfd-utils) new helper function to retrieve pidfd inode number (by Christian Goeschel Ndjomouo)
    - (pidfd-utils.c) add a helper routine to check the pidfd fs type (by Christian Goeschel Ndjomouo)
    - introduce ul_default_shell() for consistent shell resolution (by Alessandro Ratti)
    - (pwdutils.c) new library routines to get a group/passwd struct by name or GID/UID (by Christian Goeschel Ndjomouo)
    - fix bad indentation in meson.build (by Christian Goeschel Ndjomouo)
    - add FSCONFIG_CMD_CREATE_EXCL (by Karel Zak)

libblkid:
    - fix integer overflows in HFS+ offset calculations (by Karel Zak)
    - fix integer overflow in linux_raid checksum size (by Karel Zak)
    - fix integer overflow in nvidia_raid size check (by Karel Zak)
    - iso9660 validate root directory to reduce false positives (by Karel Zak)
    - remove empty loop devices from cache when garbage collecting (by Christian Goeschel Ndjomouo)
    - (btrfs) use BTRFS_NR_SB_LOG_ZONES and rep->zones (by Karel Zak)
    - zfs fix unaligned memory access on SPARC (by Ameer Hamza)
    - (bcachefs) fix LABEL_SUB probing (by Nikita Ofitserov)
    - (bcachefs) add new bcachefs_sb_member fields (by Nikita Ofitserov)
    - (bcachefs) add members_v2 parsing support (by Nikita Ofitserov)
    - Keep NTFS name unmodified and mount driver independent (by Karel Zak)
    - fix const qualifier warning in blkid_parse_tag_string (by Karel Zak)
    - use snprintf() instead of sprintf() (by Karel Zak)
    - Fix probe_ioctl_tp assigning BLKGETDISKSEQ as physical sector size (by Sam Fink)
    - (ext) reduce false positive (by 胡玮文)
    - improve UUID_SUB= description (by Karel Zak)
    - Add scoutfs filesystem. (by Auke Kok)
    - Fix crash while parsing config with libeconf (by Stanislav Brabec)
    - befs fix underflow (by Milan Broz)
    - avoid strcasecmp() for ASCII-only strings (by Karel Zak)
    - ddf_read validate header checksum (by Thomas Weißschuh)
    - ddf_raid drop little-endian handling (by Thomas Weißschuh)
    - ddf_raid respect constness of buffer (by Thomas Weißschuh)

libblkid/libmount:
    - ntfs return filesystem type 'ntfs3' (by Johannes Schneider)

libblkid/src/topology/dm:
    - fix fscanf return value check to match expected number of parsed items (by Mingjie Shen)

lib/canonicalize:
    - use ul_ prefix (by Karel Zak)
    - introduce generic drop-permission caller (by Karel Zak)
    - refactor canonicalize_path() (by Karel Zak)
    - rename to ul_absolute_path() (by Karel Zak)

libc/crc32:
    - make fill value of excluded area configurable (by Thomas Weißschuh)

lib/color-names:
    - fix stupid bugs (by Karel Zak)
    - Fix color name canonicalization (by Karel Zak)

lib/colors:
    - call gettext() only when the argument of --color is invalid (by Benno Schulenberg)

libcommon:
    - added lib "configs" for parsing configuration files in the correct order (by Stefan Schubert)

lib/config:
    - fix file counter (by Karel Zak)
    - Make /run path configurable (by Karel Zak)

lib/configs:
    - simplify merge error checking (by Karel Zak)
    - eliminate counter variable (by Karel Zak)
    - add head parameter to configs_refer_filename() (by Karel Zak)
    - simplify variable names (by Karel Zak)
    - merge new_list_entry() and configs_add_filename() (by Karel Zak)
    - refactor directory list merging (by Karel Zak)
    - simplify suffix verification (by Karel Zak)
    - introduce config_mk_path() helper (by Karel Zak)
    - add test program for ul_configs_file_list() (by Karel Zak)
    - initialize FD to -1 (by Karel Zak)
    - improve readability (by Karel Zak)

lib/env, ...:
    - use getauxval(AT_SECURE) for SUID check (by Max Kellermann)

libfdisk:
    - remove duplicate code (by Karel Zak)
    - (dos) fix logical partition start (by Martin Jungblut Schreiner)
    - modernize ZFS GPT type description (by Martin Minkus)
    - (dos) fix off-by-one in maximum last sector calculation (by Karel Zak)
    - use snprintf() instead of sprintf() (by Karel Zak)
    - improve collision reporting (by Karel Zak)
    - (script) improve separator usage in named-fields dump (by Karel Zak)
    - (script) fix device name separator parsing (by Karel Zak)
    - avoid strcasecmp() for ASCII-only strings (by Karel Zak)

lib/fileeq:
    - Handle large files on 32 bit correctly (by Tobias Stoeckmann)
    - Prevent OOB with short read files (by Tobias Stoeckmann)
    - Extend debug message (by Tobias Stoeckmann)
    - Fix formatters (by Tobias Stoeckmann)
    - Fix typos (by Tobias Stoeckmann)

lib/fileutils:
    - add is_dotdir_dirent() (by Karel Zak)

liblastlog2:
    - refactor conditional assignments for better readability (by Karel Zak)
    - fix operator precedence in conditional assignments (by Karel Zak)
    - markup fixes for man pages (by Mario Blättermann)
    - (test) fix memory leak in failed test [coverity scan] (by Karel Zak)

lib/loopdev:
    - avoid null pointer dereferences [coverity] (by Karel Zak)
    - introduce loopcxt_get_device_nr() helper (by Karel Zak)
    - open loop control device read-only if possible (by Thomas Weißschuh)
    - clarify comment about device and backing file modes (by Thomas Weißschuh)
    - remove loopcxt_set_fd() (by Thomas Weißschuh)

lib, lscpu:
    - fix const qualifier discarded warnings in bsearch (by Karel Zak)

lib/mbsalign:
    - use snprintf() instead of sprintf() (by Karel Zak)

libmount:
    - move fstype_to_mounttype() to include/ (by Karel Zak)
    - add option to override fs-type with mount-type (by Karel Zak)
    - read from udev, add --disable-libmount-udev-support (by Karel Zak)
    - enhance readability of read_from_blkid() (by Karel Zak)
    - refactor mnt_cache_read_tags() (by Karel Zak)
    - refactor mnt_get_fstype() (by Karel Zak)
    - add pidfs magic number for fstype check (by Christian Goeschel Ndjomouo)
    - fix const qualifier warning in mnt_parse_mountinfo_line (by Karel Zak)
    - fix const qualifier warnings for C23 (by Karel Zak)
    - don't report fsconfig errors with "nofail" (by Karel Zak)
    - add MOVE_MOUNT_BENEATH support (by Karel Zak)
    - ifdef for fanotify support on older systems (by Karel Zak)
    - (monitor) add fanotify_next_fs() (by Karel Zak)
    - (monitor) add basic fanotify support (by Karel Zak)
    - (monitor) rename public API to "mountinfo" (by Karel Zak)
    - (monitor) clean up mountinfo function names (by Karel Zak)
    - add mnt_fs_is_{moved,attached,detached} functions (by Karel Zak)
    - (monitor)  cleanup userspace_add_watch() exiting (by Karel Zak)
    - (monitor) check for utab delete (by Karel Zak)
    - (monitor) optimize inotify utab watch (by Karel Zak)
    - (monitor) cleanup op_process_event() return codes (by Karel Zak)
    - (monitor) add next-fs API (by Karel Zak)
    - (monitor) epoll_wait code consolidation (by Karel Zak)
    - (monitor) require entry-specific functions (by Karel Zak)
    - (monitor) clean up internal names (by Karel Zak)
    - (monitor) support type-specific data (by Karel Zak)
    - (monitor) support additional monitor identifiers (by Karel Zak)
    - split monitor code to more files (by Karel Zak)
    - Add support for FSCONFIG_CMD_CREATE_EXCL (by Karel Zak)
    - don't update utab when moving /run (by Karel Zak)
    - (verity) use messages API for important errors (by Karel Zak)
    - (verity) use messages API for dlopen errors (by Karel Zak)
    - (verity) fix compiler warning (by Karel Zak)
    - (verity) fix deinitialization (by Karel Zak)
    - add function to remove escaped chars (by Karel Zak)
    - fix typo in comment (by Karel Zak)
    - use and add has_listmount() (by Karel Zak)
    - avoid calling memset() unnecessarily (by Karel Zak)
    - clean up statmount syscall-related functions (by Karel Zak)
    - (subdir) support detached open_tree() (>=6.15) (by Karel Zak)
    - (subdir) restrict for real mounts only (by Karel Zak)
    - (subdir) remove unused code (by Karel Zak)
    - avoid strcasecmp() for ASCII-only strings (by Karel Zak)
    - fix --no-canonicalize regression (by Karel Zak)
    - remove possible leak in mnt_context_guess_srcpath_fstype() [coverity scan] (by Karel Zak)
    - add support for STATMOUNT_SB_SOURCE (by Karel Zak)

Libmount:
    - Fix removal of "owner" option when executed as root (by Karel Zak)

lib/netlink:
    - set SOCK_CLOEXEC on netlink socket (by Karel Zak)

lib/pager:
    - Remove unused code (by Tobias Stoeckmann)
    - Use async-signal safe signal handler (by Tobias Stoeckmann)
    - Handle dup errors (by Tobias Stoeckmann)
    - Gracefully handle SIGPIPE errors (by Tobias Stoeckmann)
    - Drop pager_redirect (by Tobias Stoeckmann)
    - Rename caught_signal to pager_caught_signal (by Karel Zak)
    - Use original stderr in pager_close (by Tobias Stoeckmann)
    - Use pager_open/close for pager_redirect (by Tobias Stoeckmann)
    - Release resources on pager_open error (by Tobias Stoeckmann)
    - Clear potential stdout/stderr errors (by Tobias Stoeckmann)
    - Flush outputs in pager_close (by Tobias Stoeckmann)
    - Improve signal handling in pager_close (by Tobias Stoeckmann)
    - Call _exit in signal handler, not raise (by Tobias Stoeckmann)
    - Do not resolve directories with PATH (by Tobias Stoeckmann)
    - Set SIGCHLD to default handling (by Tobias Stoeckmann)
    - Fix typos (by Tobias Stoeckmann)
    - Simplify wait_for_pager (by Tobias Stoeckmann)
    - Merge wait_or_whine into wait_for_pager (by Tobias Stoeckmann)
    - The variable need_in is always 1 (by Tobias Stoeckmann)
    - Remove struct field `no_stdin` (by Tobias Stoeckmann)
    - Remove struct field preexec_cb (by Tobias Stoeckmann)
    - Remove unused define (by Tobias Stoeckmann)
    - Remove unused struct entry `err` (by Tobias Stoeckmann)
    - Remove unused struct field "out" (by Tobias Stoeckmann)

lib/path:
    - add NULL checks for path in statx and access (by Karel Zak)
    - Ensure consistent and robust path checks (by Karel Zak)
    - add wrapers for statx(2) (by Masatake YAMATO)
    - add __format__ attr to ul_path_v?statf() (by Masatake YAMATO)
    - (cosmetic) delete the empty line at the EOF (by Masatake YAMATO)
    - avoid double free() for cpusets (by Karel Zak)

lib/procfs:
    - remove duplicate statfs_magic.h include (by Karel Zak)

lib/shells:
    - fix indentation (by Karel Zak)

libsmartcols:
    - support JSON Lines format output (by WanBingjiang)
    - avoid cumulative width reduction during printing (by Alessandro Ratti)
    - small uri and annotation cleanup (by Karel Zak)
    - new scols_column_{refer,get}_annotation routines (by Christian Goeschel Ndjomouo)
    - add function to set/get header colors (by Karel Zak)
    - report cells data size on debug (by Karel Zak)
    - add scols_filter_has_holder() (by Karel Zak)

lib/strutils:
    - add helper function for --annotation option (by Christian Goeschel Ndjomouo)
    - add ul_optstr_get_value() (by Karel Zak)
    - add ul_ prefix to strrep() and strrem() functions (by Karel Zak)
    - add ul_ prefix to split() function (by Karel Zak)
    - add ul_ prefix to strappend() functions (by Karel Zak)
    - add ul_ prefix to strconcat() functions (by Karel Zak)
    - add ul_ prefix to startswith() and endswith() (by Karel Zak)
    - call gettext() only when argument of --hyperlink is invalid (by Benno Schulenberg)

lib/strv:
    - use ul_ prefix for strv functions (by Karel Zak)

libuuid:
    - reset initial cont-clock time on service start (by Michael Trapp)
    - fix timestamp overflow for pre-1970 dates (by Kiran Rangoon)
    - refactor gregorian_to_unix to populate timeval directly (by Kiran Rangoon)
    - simplify gregorian-to-unix offset calculation (by Kiran Rangoon)
    - fix uuid_time on macOS without attribute((alias)) (by Eugene Gershnik)

logger:
    - ignore libsystemd-dependent long opt in CI CHECK (by Christian Goeschel Ndjomouo)
    - fix const qualifier warnings for C23 (by Karel Zak)
    - fix buffer overflow when read stdin (by Karel Zak)
    - fix incorrect warning message when both --file and a message are specified (by Alexander Kappner)
    - drop pointless bitfields (by Karel Zak)
    - (man) improve --prio-prefix and --stderr description (by Karel Zak)

login:
    - improve comments for signal handling in fork_session() (by Karel Zak)
    - Fix signal race in child handling (by Tobias Stoeckmann)
    - use original FQDN for PAM_RHOST (by Karel Zak)
    - only print regular files for motd (by Tobias Stoeckmann)
    - remove signal handler before cleanup (by Tobias Stoeckmann)
    - Add UID to usage message (by Tobias Stoeckmann)
    - duplicate --shell argument to avoid nulling through explicit_bzero() (by Christian Goeschel Ndjomouo)
    - document -s and --shell on the man page (by Christian Goeschel Ndjomouo)
    - define shell to log in to with -s or --shell (by Christian Goeschel Ndjomouo)
    - use new xgetuserpw() instead of xgetpwnam() (by Christian Goeschel Ndjomouo)
    - add line break after timeout message (by Karel Zak)
    - fix minor grammar mistake in the manpage (by cgoesche)
    - (adoc) add a description about LOGIN_SHELL_FALLBACK (by WanBingjiang)
    - using an avaiable shell while logging in. (by WanBingjiang)
    - use logindefs_setenv_path() (by Karel Zak)
    - protect COLORTERM and NO_COLOR env. variables (by Karel Zak)

logindefs:
    - Add function to set PATH (by Karel Zak)

login-utils:
    - Use _PATH macros (by Tobias Stoeckmann)
    - Use /etc/passwd- as backup file (by Tobias Stoeckmann)
    - add UIDs to manual pages (by Tobias Stoeckmann)

login-utils/login:
    - Sync usage with manual page (by Tobias Stoeckmann)

login-utils, sys-utils:
    - use _PATH_BSHELL consistently (by Alessandro Ratti)

losetup:
    - snip --verbose from bash-completion, and 'v' from options string (by Benno Schulenberg)
    - (man) put the synopses in a better order, the name-giver first (by Benno Schulenberg)
    - remove the --verbose flag, as it doesn't actually do anything (by Benno Schulenberg)
    - sort 'O' correctly for the mutual-exclusive check to work (by Benno Schulenberg)
    - improve command line option processing (by Karel Zak)
    - improve --remove documentation (by Karel Zak)
    - make --remove a long-only option with mutual exclusivity (by Karel Zak)
    - add error feedback for --remove command (by Karel Zak)
    - Add the --remove/-R parameter to remove loop devices (by wguanghao)
    - rename function *_delete_* to *_detach_* (by wguanghao)

losetup,lscpu:
    - (man) add the missing -h/--help and -V/--version options (by Benno Schulenberg)

lostup:
    - report EACCES on loop-control (by Karel Zak)

lsblk:
    - improve error reporting for invalid device paths (by Sina Abroshan)
    - use ul_startswith() (by codefiles)
    - add support for LSBLK_COLUMNS environmental variable as an alternative to --output (by cgoesche)
    - (typo) rename list_colunms() to list_columns() (by cgoesche)
    - fix possible use-after-free (by Karel Zak)
    - fix memory leak [coverity scan] (by Karel Zak)
    - use md as fallback TYPE when md/level empty (by codefiles)
    - use ID_PART_ENTRY_SCHEME as fallback for PTTYPE (by Karel Zak)
    - (man) remove the incorrect spaces between the arguments of --ct (by Benno Schulenberg)
    - avoid strcasecmp() for ASCII-only strings (by Karel Zak)

lsclocks:
    - fix inconsistency in usage message (by Christian Goeschel Ndjomouo)
    - add missing --no-discover-rtc option info in usage message (by Christian Goeschel Ndjomouo)
    - add support for LSCLOCKS_COLUMNS environmental variable (by Christian Goeschel Ndjomouo)
    - stop using MAX_CLOCKS (by Thomas Weißschuh)
    - use MAX_CLOCKS, improve indention (by Karel Zak)
    - add auxiliary clocks (by Thomas Weißschuh)
    - (man) remove stray backslash, and correct short form of --time (by Benno Schulenberg)
    - (man) list supported clock types (by Thomas Weißschuh)

lscpu:
    - Implement options for dumping ARM implementer/model name tables (by Martin Storsjö)
    - remove duplicate ARM names, clean up names (by Karel Zak)
    - add --annotate info to man page (by Christian Goeschel Ndjomouo)
    - add column header annotations for -C and -e (by Christian Goeschel Ndjomouo)
    - Add a few missing Arm CPU identifiers (by Jonathan Thackray)
    - New Arm C1 parts (by Jeremy Linton)
    - Add NVIDIA Olympus arm64 core (by Matthew R. Ochs)
    - (man) add description of the --list-columns option (by Christian Goeschel Ndjomouo)
    - add MICROCODE output column (by Christian Goeschel Ndjomouo)
    - (man) document the LSCPU_{CACHES_}COLUMNS environment variables (by Christian Goeschel Ndjomouo)
    - add --list-columns option and declutter --help output (by Christian Goeschel Ndjomouo)
    - add support for LSCPU_{CACHES_}COLUMNS environment variables (by Christian Goeschel Ndjomouo)
    - add 'microcode' information to the CPU summary (by cgoesche)
    - use maximum CPU speed from DMI, avoid duplicate version string (by Karel Zak)
    - Fix loongarch op-mode output with recent kernel (by Xi Ruoyao)
    - fix possible buffer overflow in cpuinfo parser (by Karel Zak)
    - (man) don't refer to a missing section, and improve some wordings (by Benno Schulenberg)
    - RISC-V Print ISA information in summary (by Sunil V L)
    - New Arm part numbers (by Jeremy Linton)

lsfd:
    - fill SOCK.NETNS column for tuntap (by Masatake YAMATO)
    - load the information of the network namespace behind a tun device (by Masatake YAMATO)
    - (refactor) call ioctl(TUNGETDEVNETNS) from target_fd related methods (by Masatake YAMATO)
    - add stubs of target_fd related methods to cdev_class (by Masatake YAMATO)
    - fill SOCK.NETNS even when sock_diag netlink can't report sockets (by Masatake YAMATO)
    - add inspect_target_fd method to file_class (by Masatake YAMATO)
    - (refactor) make call_with_foreign_fd reusable (by Masatake YAMATO)
    - make pidfd for the target process available while collecting fds (by Masatake YAMATO)
    - (comment) update the description of sock_xinfo::netns_inode (by Masatake YAMATO)
    - (cosmetic) delete an empty line (by Masatake YAMATO)
    - add new association "pidfs" (by Masatake YAMATO)
    - (bugfix) do not reuse stat(2) buffer for files with identical names (by Masatake YAMATO)
    - fix dependency on errnos.h (by Masatake YAMATO)
    - make sure errors array is not empty [-Werror=type-limits] (by Karel Zak)
    - (refactor) move the error object related code to a new file (by Masatake YAMATO)
    - (refactor) remove redundant is_error member from struct file (by Masatake YAMATO)
    - (refactor) add a helper function making error file objects (by Masatake YAMATO)
    - remove __unused__ attr from parameters used actually (by Masatake YAMATO)
    - (cosmetic) adjust white spaces in column definitions (by Masatake YAMATO)
    - fill MNTID coulmn for exe, cwd, and rtd assocations (by Masatake YAMATO)
    - fill MNTID coulmn for shm and mem assocations (by Masatake YAMATO)
    - (refactor) add has_mnt_id helper macro (by Masatake YAMATO)
    - fix memory leak related to stat_error_class (by Masatake YAMATO)
    - fix const qualifier warning in strnrstr (by Karel Zak)
    - fix const qualifier warning in new_counter_spec (by Karel Zak)
    - add TUN.DEVNETNS column (by Masatake YAMATO)
    - fix bsearch macro usage with glibc C23 (by Cristian Rodríguez)
    - (doc) fix English in SOCK.NETNS description (by Masatake YAMATO)
    - (cleanup) add missing "break" in a case statement (by Masatake YAMATO)
    - (cleanup) return 0 instead of false (by Masatake YAMATO)
    - (refactor) introduce tundata struct (by Masatake YAMATO)
    - (bugfix) use PRIu32 for prining lport of netlink socket (by Masatake YAMATO)
    - use snprintf() instead of sprintf() (by Karel Zak)
    - refer to /proc/$pid/map_files if a mapped file is masked (by Masatake YAMATO)
    - revise the code disabling hyperlinks (by Masatake YAMATO)
    - decode protocol numbers of RAW and RAW6 sockets (by Masatake YAMATO)
    - add PACKET.PROTOCOL.RAW, a new column (by Masatake YAMATO)
    - improve grammar, and use angular brackets around placeholder word (by Benno Schulenberg)
    - (bug fix) scan the protocol field of /proc/net/packet as a hex number (by Masatake YAMATO)
    - fix the description for PACKET.PROTOCOL column (by Masatake YAMATO)
    - (man) fix a typo (by Masatake YAMATO)
    - add UNIX.IPEER column (by Masatake YAMATO)
    - fill ENDPOINTS column for UNIX one-way sockets (by Masatake YAMATO)
    - (refactor) add a helper function building ENDPOINTS strings for UNIX socket (by Masatake YAMATO)
    - add a dummy entry for UNIX socket having no peer to the IPC table (by Masatake YAMATO)
    - (man) fix a typo (by Masatake YAMATO)
    - initialize struct stat [coverity scan] (by Karel Zak)

lsfd/mkfds-foreign-sockets:
    - skip when lacking sock_diag ability (by Chen Qi)

lsfd,test_mkfds:
    - make linux/vm_sockets_diag.h optional (by Masatake YAMATO)

lsipc:
    - use snprintf() instead of sprintf() (by Karel Zak)
    - doesn't mount /dev/mqueue (by Prasanna Paithankar)

lsirq:
    - add support for reading data from given file (by Joe Jin)

lslocks:
    - (bugfix) don't set rawdata in COL_PID if rawdata is null (by Masatake YAMATO)
    - special-case PID for filtering (skip −1) (by Masatake YAMATO)
    - make SIZE filterable by normalizing to bytes (by Masatake YAMATO)
    - implement Q, --filter option (by Masatake YAMATO)
    - factor out code getting and setting the data from add_scols_line (by Masatake YAMATO)
    - (refactor) move proc_locks to struct lslocks (by Masatake YAMATO)
    - (refactor) move pid_locks in main to struct lslocks (by Masatake YAMATO)
    - (refactor) move "tab" file static variable to struct lslocks (by Masatake YAMATO)
    - (refactor) add struct lslocks representing the global context (by Masatake YAMATO)
    - (refactor) use global bytes in get_json_type_for_column() (by Masatake YAMATO)
    - (refactor) add a helper function refining value returned from get_lock (by Masatake YAMATO)
    - (refactor) don't use redundant callback functions (by Masatake YAMATO)
    - (refactor) specify list_head as type instead of abusing void* (by Masatake YAMATO)
    - (refactor) use separate function to initialize libscols_table (by Masatake YAMATO)
    - (refactor) remove an unused local variable (by Masatake YAMATO)
    - (refactor) use narrow variable scoping for loop counters (by Masatake YAMATO)
    - (comment) fix grammar (by Masatake YAMATO)
    - (man) add LSLOCKS_COLUMNS description in new ENVIRONMENT section (by Christian Goeschel Ndjomouo)
    - add support for LSLOCKS_COLUMNS environmental variable (by Christian Goeschel Ndjomouo)

lslogins:
    - (manpage) fix typo in option description (by Christian Goeschel Ndjomouo)
    - ignore special long options in CI CHECK (by Christian Goeschel Ndjomouo)
    - remove duplicate errno initialization (by Christian Goeschel Ndjomouo)
    - fix incomplete option info in usage message (by Christian Goeschel Ndjomouo)
    - (man) add --list-columns description (by Christian Goeschel Ndjomouo)
    - add -H and --list-columns option; declutter --help output (by Christian Goeschel Ndjomouo)
    - (man) add --json information (by Christian Goeschel Ndjomouo)
    - add JSON output format mode (by Christian Goeschel Ndjomouo)
    - fix typo (by Karel Zak)
    - remove possible memory leaks [coverity scan] (by Karel Zak)

lsmem:
    - fix missing zone info when memory blocks start at an index other than 0 (by Christian Goeschel Ndjomouo)
    - use xstrncpy() (by Karel Zak)
    - add doc for dynamic (de)configuration and memmap-on-memory support (by Sumanth Korikkar)
    - add support to display dynamic (de)configuration of memory (by Sumanth Korikkar)
    - display global memmap on memory parameter (by Sumanth Korikkar)
    - add support for LSMEM_COLUMNS environmental variable (by Christian Goeschel Ndjomouo)
    - increase the available width for the summary text labels (by Benno Schulenberg)

lsmem,chmem:
    - add configure/deconfigure bash completion options (by Sumanth Korikkar)

lsns:
    - make the synopsis more coherent (by Christian Goeschel Ndjomouo)
    - fix const qualifier warnings for C23 (by Karel Zak)
    - don't abort if /proc/self/ns/user is absent; probe other ns entries (by Masatake YAMATO)
    - fix --list-columns option (by Christian Goeschel Ndjomouo)
    - enhance compilation without USE_NS_GET_API (by Karel Zak)
    - fix undefined reference to add_namespace_for_nsfd #3483 (by Thomas Devoogdt)
    - make "-Q NETNSID ..." work even if NETNSID column is not enabled (by Masatake YAMATO)
    - show NETNSID for namespaces with no process running (by Masatake YAMATO)
    - (refactor) generalize the code for collecting netnsid information (by Masatake YAMATO)

man:
    - Fixed incorrect ipcrm options (by Prasanna Paithankar)
    - Replace RETURN VALUE with EXIT STATUS in section 1 (by Jesse Rosenstock)

man-common:
    - rename annotation.adoc to annotate.adoc (by Christian Goeschel Ndjomouo)

man pages:
    - consolidate libsmartcols environment variables (by Karel Zak)

meson:
    - fix non threaded toolchains (by Rosen Penev)
    - cleanup tests to use libcommon.la (by Karel Zak)
    - use curses dep for ncurses (by Rosen Penev)
    - fix a bug in posixipc_libs configuration (by Martin Valgur)
    - use .to_string() in configuration data check (by Thomas Weißschuh)
    - add feature for translated documentation (by Thomas Weißschuh)
    - remove tinfo dependency from 'more' (by Thomas Weißschuh)
    - fix manadocs for libsmartcols and libblkid (by Karel Zak)
    - fix po-man installation (by Karel Zak)
    - bring hexdump in line with others (by Christian Hesse)

misc:
    - never include wchar.h (by Karel Zak)

misc-utils/lastlog2:
    - Add option -a for listing active users only (by WanBingjiang)

mkfs.bfs:
    - fix memory leaks and weak code (by Karel Zak)

mkfs.cramfs:
    - avoid uninitialized value [coverity scan] (by Karel Zak)
    - (man) mark arguments of -N and -l in bold, not italics (by Benno Schulenberg)
    - vertically align the option descriptions of the usage text (by Benno Schulenberg)
    - reduce the synopsis to the standard, succinct form (by Benno Schulenberg)

more:
    - Use ul_strtou16() in a robust way (by Karel Zak)
    - temporarily ignore stdin when waiting for stderr (by Karel Zak)
    - Add MORE_SHELL_LINES environmental variable (by cgoesche)
    - fix broken ':!command' command key (by cgoesche)
    - fix implicit previous shell_line execution #3508 (by cgoesche)
    - Add MORESECURE and PAGERSECURE environment variables #3503 (by Christian Goeschel Ndjomouo)
    - improve help readability (by Karel Zak)
    - fix repeat command (by Karel Zak)
    - remove a duplicate call of setlocale() (by Benno Schulenberg)

mount:
    - (manpage) fix minor grammar mistakes (by Christian Goeschel Ndjomouo)
    - (man) add link to mount.ceph(8) (by Karel Zak)
    - (man) add hint for session= on iso9660 (by Karel Zak)
    - document --ro option on the man page (by Christian Goeschel Ndjomouo)
    - add missing --ro option info in usage message (by Christian Goeschel Ndjomouo)
    - add note about systemd and --all historical context (by Karel Zak)
    - improve --all documentation regarding swap areas (by Karel Zak)
    - add --beneath support (by Karel Zak)
    - (bash-completion) add --exclusive (by Karel Zak)
    - add --exclusive command line option (by Karel Zak)
    - check for stdout for fstab reload hint (by Karel Zak)
    - (man) add missing word (by Jakub Wilk)
    - (man) shorten an overlong line, and improve some markup (by Benno Schulenberg)
    - (man) fix some indentation issues, and improve a few wordings (by Benno Schulenberg)
    - (man) add info about info messages (by Karel Zak)

mountpoint:
    - use single libmount cache for all path resolutions (by Karel Zak)
    - add --show option to print mountpoint path (by Karel Zak)
    - use statmount() syscall on modern kernels (by Karel Zak)

namei:
    - ignore SELinux-specific long option in CI CHECK (by Christian Goeschel Ndjomouo)
    - fix const qualifier warning in readlink_to_namei (by Karel Zak)
    - reestablish --nosymlinks option's functionality (by Christian Goeschel Ndjomouo)

namespace.h:
    - fix compilation on Linux < 4.10 (by Thomas Devoogdt)

netaddrq:
    - Fix crash if there are no IP addresses (by Stanislav Brabec)

netlink process_addr():
    - Ignore UL_NL_SOFT_ERROR (by Stanislav Brabec)

newgrp:
    - provide --command info in output message (by Christian Goeschel Ndjomouo)

nologin:
    - ignore well-known shell command-line options in CI CHECK (by Christian Goeschel Ndjomouo)

nsenter:
    - use USE_NAMESPACE_ID_SUPPORT macro for nsid feature (by Karel Zak)
    - fix minor issues with namespace ID support (by Karel Zak)
    - Support specifying namespace by ID (by Xiao Liang)
    - (manpage) fix minor grammar mistake (by Christian Goeschel Ndjomouo)
    - support 'PID:inode' process address format (by Christian Goeschel Ndjomouo)
    - ignore SELinux-specific long option in CI CHECK (by Christian Goeschel Ndjomouo)
    - (man) improve descriptions for some options (by Martin Joerg)

nsenter,unshare:
    - (man) add the NS-related commands to SEE ALSO (by Masatake YAMATO)

pager:
    - remove stale pager_redirect() declaration (by Karel Zak)

partx:
    - fix const qualifier warning in get_max_partno (by Karel Zak)
    - mark the --list option as deprecated (by Christian Goeschel Ndjomouo)

pg:
    - Fix compiler warning (by Tobias Stoeckmann)

pidfd-utils:
    - move USE_PIDFD_INO_SUPPORT after syscall fallbacks (by Karel Zak)
    - define HAVE_PIDFD_* when syscall fallbacks are used (by Karel Zak)

pipesz:
    - use snprintf() instead of sprintf() (by Karel Zak)
    - report default size in --help, instead of referring the user (by Benno Schulenberg)
    - (man) improve the markup and some wordings (by Benno Schulenberg)

po:
    - merge changes (by Karel Zak)
    - update LINGUAS list (by Karel Zak)
    - add ar.po (from translationproject.org) (by Zayed Al-Saidi)
    - update uk.po (from translationproject.org) (by Yuri Chornoivan)
    - update sv.po (from translationproject.org) (by Daniel Nylander)
    - update sr.po (from translationproject.org) (by Мирослав Николић)
    - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
    - update pt.po (from translationproject.org) (by Pedro Albuquerque)
    - update pl.po (from translationproject.org) (by Jakub Bogusz)
    - update nl.po (from translationproject.org) (by Benno Schulenberg)
    - update ko.po (from translationproject.org) (by Seong-ho Cho)
    - update ja.po (from translationproject.org) (by YOSHIDA Hideki)
    - update hr.po (from translationproject.org) (by Božidar Putanec)
    - update fr.po (from translationproject.org) (by Frédéric Marchal)
    - update es.po (from translationproject.org) (by Antonio Ceballos Roa)
    - update de.po (from translationproject.org) (by Christian Kirbach)
    - update cs.po (from translationproject.org) (by Petr Písař)
    - update uk.po (from translationproject.org) (by Yuri Chornoivan)
    - update sr.po (from translationproject.org) (by Мирослав Николић)
    - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
    - update pt.po (from translationproject.org) (by Pedro Albuquerque)
    - update pl.po (from translationproject.org) (by Jakub Bogusz)
    - update nl.po (from translationproject.org) (by Benno Schulenberg)
    - update ja.po (from translationproject.org) (by YOSHIDA Hideki)
    - update hr.po (from translationproject.org) (by Božidar Putanec)
    - update fr.po (from translationproject.org) (by Frédéric Marchal)
    - update es.po (from translationproject.org) (by Antonio Ceballos Roa)
    - update de.po (from translationproject.org) (by Mario Blättermann)
    - update cs.po (from translationproject.org) (by Petr Písař)
    - update uk.po (from translationproject.org) (by Yuri Chornoivan)
    - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
    - update pl.po (from translationproject.org) (by Jakub Bogusz)
    - update nl.po (from translationproject.org) (by Benno Schulenberg)
    - update ko.po (from translationproject.org) (by Seong-ho Cho)
    - update hr.po (from translationproject.org) (by Božidar Putanec)
    - update fr.po (from translationproject.org) (by Frédéric Marchal)
    - update es.po (from translationproject.org) (by Antonio Ceballos Roa)
    - merge changes (by Karel Zak)
    - update hr.po (from translationproject.org) (by Božidar Putanec)
    - upadte LINGUAS file (by Karel Zak)

po-man:
    - merge changes (by Karel Zak)
    - merge changes (by Karel Zak)
    - add sv.po (from translationproject.org) (by Daniel Nylander)
    - add ar.po (from translationproject.org) (by Zayed Al-Saidi)
    - update uk.po (from translationproject.org) (by Yuri Chornoivan)
    - update sr.po (from translationproject.org) (by Мирослав Николић)
    - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
    - update pl.po (from translationproject.org) (by Michał Kułach)
    - update es.po (from translationproject.org) (by Antonio Ceballos Roa)
    - update de.po (from translationproject.org) (by Mario Blättermann)
    - merge changes (by Karel Zak)
    - update sr.po (from translationproject.org) (by Мирослав Николић)
    - update de.po (from translationproject.org) (by Mario Blättermann)
    - add hyperlink.adoc to po4a.cfg (by Karel Zak)
    - merge changes (by Karel Zak)
    - add pl.po (from translationproject.org) (by Michał Kułach)
    - update uk.po (from translationproject.org) (by Yuri Chornoivan)
    - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
    - update fr.po (from translationproject.org) (by Frédéric Marchal)
    - fix typos in configuration (by Karel Zak)

prlimit:
    - raise a nicer error message when modifying NOFILE (by Karel Zak)

procfs:
    - use F_TYPE_EQUAL() macro for statfs.f_type comparison (by cgoesche)
    - add a helper function to access /proc/$pid/personality (by Masatake YAMATO)

pwdutils:
    - fix grammar in comments (by Tobias Stoeckmann)

readprofile:
    - (manpage) add --no-auto option description (by Christian Goeschel Ndjomouo)
    - fix memory leak related to boot_uname_r_str() in usage() (by Christian Goeschel Ndjomouo)
    - (manpage) fix incorrect file name in --mapfile description (by Christian Goeschel Ndjomouo)

rename:
    - change "expression" to "substring" (by Haelwenn (lanodan) Monnier)

renice:
    - (man) reword several things, to be clearer, and improve some markup (by Benno Schulenberg)
    - in usage text, condense the oververbose description of option -n (by Benno Schulenberg)

rev:
    - add --zero option to --help output (by Christian Goeschel Ndjomouo)

rfkill:
    - Output in JSON format if -J is provided. (by Xing Guo)

rtcwake:
    - (man) reduce an inflated table to sane proportions (by Benno Schulenberg)

script:
    - (man,usage) correct the markup of the synopsis (by Benno Schulenberg)
    - support non-option argument as command (by WanBingjiang)

scriptlive:
    - (manpage) add --command option description (by Christian Goeschel Ndjomouo)
    - improve some descriptions, markup, and grammar in the manpage (by Benno Schulenberg)
    - reduce two usage synopses to one simple one (by Benno Schulenberg)

scriptreplay:
    - mark literal values in the man page in bold, not italic (by Benno Schulenberg)
    - reduce two usage synopses to one, and drop the -t from it (by Benno Schulenberg)
    - make Up/Down keys use a percentage instead of fixed amount (by Benno Schulenberg)
    - indicate that <divisor> is conditional on <typescript> (by Benno Schulenberg)

setarch:
    - (man) correct the markup of the synopsis and of two options (by Benno Schulenberg)
    - use strtopid_or_err() (by Karel Zak)
    - add -p/--pid option showing the personality of specified process (by Masatake YAMATO)

setpriv:
    - use AppArmor LSM-specific proc interface (by Karel Zak)
    - (man) Fix grammar (by Tobias Stoeckmann)
    - (man) fix typo (by Jakub Wilk)
    - (manpage) fix typo in option description (by Christian Goeschel Ndjomouo)
    - fix usage message inconsistency (by Christian Goeschel Ndjomouo)
    - improve landlock usage() output (by Karel Zak)
    - Add support for LANDLOCK_ACCESS_FS_IOCTL_DEV (by Günther Noack)
    - Improve getgroups() Portability (by Karel Zak)
    - protect COLORTERM and NO_COLOR env. variables (by Karel Zak)
    - follow /etc/login.defs for PATH (by Karel Zak)

setpwnam:
    - use getline instead of fgets (by Tobias Stoeckmann)
    - only unlock when actually locked (by Tobias Stoeckmann)
    - check if /etc/passwd was fully read (by Tobias Stoeckmann)

sfdisk:
    - (manpage) fix option description inconsistencies (by Christian Goeschel Ndjomouo)
    - (man) do not use the common 'include' for --help and --version (by Benno Schulenberg)
    - reject spurious arguments for --reorder/--backup-pt-sectors (by Thomas Weißschuh)

sfdisk.8.adoc:
    - Replace --help and --version with external entity (by Mario Blättermann)

shells.c:
    - call setusershell before getusershell (by WanBingjiang)

strutils:
    - move an error message to where it is used, and improve it (by Benno Schulenberg)

strutils.c:
    - ignore escape characters while parsing options. (by WanBingjiang)

style:
    - convert tabs to spaces in meson.build (by zhanghongyuan)
    - adapt function definitions to kernel style (by Christian Goeschel Ndjomouo)
    - fix coding style issues (by Christian Goeschel Ndjomouo)

su:
    - accept group name and GID in -g and -G options (by Christian Goeschel Ndjomouo)
    - pass arguments after <user> to shell (by cgoesche)
    - use logindefs_setenv_path() (by Karel Zak)
    - protect COLORTERM and NO_COLOR env. variables (by Karel Zak)
    - (man) fix duplicate asterisk (by Gaël PORTAY)

su-common:
    - ignore runuser(1) specific long option in CI CHECK (by Christian Goeschel Ndjomouo)

swapoff:
    - check  blkid_probe_lookup_value() return code [coverity scan] (by Karel Zak)
    - add comments for do_swapoff (by zt20xx)
    - clean up tag resolution (by Karel Zak)

swapon:
    - (man page) use "defaults" (plural) (by Chris Hofstaedtler)
    - use ANNOTATE_OPTION as enum name for --annotate (by Christian Goeschel Ndjomouo)
    - rename the new --annotation option to --annotate (by Benno Schulenberg)
    - (usage) make the help text fit within 80 columns again (by Benno Schulenberg)
    - document --annotation option on the man page (by Christian Goeschel Ndjomouo)
    - control column header tooltips with --annotation (by Christian Goeschel Ndjomouo)
    - annotate column header names with OSC8 hyperlinks (by Christian Goeschel Ndjomouo)
    - (man page) add details about fstab configuration (by Karel Zak)
    - improve a translator hint, and remove a pointless one (by Benno Schulenberg)
    - remove unnecessary variable usage (by Karel Zak)
    - make options --help and --version override --summary (by Benno Schulenberg)

sys-utils/chmem:
    - fix typo. (by WanBingjiang)

sys-utils/lscpu:
    - Change object type to SCOLS_JSON_STRING if data == "-" (by WanBingjiang)

taskset:
    - Accept 0 pid for current process (by Jesse Rosenstock)

terminal-colors.d:
    - (man) reduce two tables to succinct lists (by Benno Schulenberg)
    - support NO_COLOR (by Karel Zak)

test_mkfds:
    - disable ppoll multiplexer if sigset_t is not defined (by Masatake YAMATO)
    - remove local pidfd_open() fallback (by Karel Zak)

tests:
    - (lsfd::*) revise the way to use "$?" (by Masatake YAMATO)
    - (lsns::*) revise the way to use "$?" (by Masatake YAMATO)
    - add tests for column --table-header-as-columns (by Karel Zak)
    - (test_mkfds:netns) conditionally report EPERM when ioctl(SIOCGSKNS) fails (by Masatake YAMATO)
    - (test_mkfd::tcp-bare) new factory creating an unbound/unconnected TCP socket (by Masatake YAMATO)
    - search for all executable scripts in test subdirs (by Christian Goeschel Ndjomouo)
    - (waitpid) add tests for the pidfd inode format support (by Christian Goeschel Ndjomouo)
    - (waitpid) move waitpid tests to a dedicated subdir (by Christian Goeschel Ndjomouo)
    - (waitpid) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - use long options globally in test scripts (by Christian Goeschel Ndjomouo)
    - (setarch) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (script) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (rev) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (rename) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (mount) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (more) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (lsns) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (lsmem) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (lscpu) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (lsclocks) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (losetup) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (logger) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (ipcs) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (ionice) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (hexdump) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (getopt) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (findmnt) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (fdisk) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (fallocate) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (enosys) use long options instead, to improve test coverage report (by Christian Goeschel Ndjomouo)
    - (chfn) test all long options (by Christian Goeschel Ndjomouo)
    - (cal) use more long options to improve test coverage accuracy (by Christian Goeschel Ndjomouo)
    - (blkid) use more long options to improve test coverage accuracy (by Christian Goeschel Ndjomouo)
    - (blkdiscard) use long options to improve test coverage accuracy (by Christian Goeschel Ndjomouo)
    - (column) add more tests (by Christian Goeschel Ndjomouo)
    - (chrt) fix various shellcheck warnings (by Christian Goeschel Ndjomouo)
    - (flock) fix shellcheck warning (by Christian Goeschel Ndjomouo)
    - (uuidd) fix various shellcheck warnings (by Christian Goeschel Ndjomouo)
    - move schedutils tool test scripts to dedicated subdirs (by Christian Goeschel Ndjomouo)
    - move uuid* tool test scripts to dedicated subdirectories (by Christian Goeschel Ndjomouo)
    - move test scripts from tests/ts/misc to dedicated subdir (by Christian Goeschel Ndjomouo)
    - (chfn) ensure that invalid input is detected correctly (by Christian Goeschel Ndjomouo)
    - add a helper command, test_open_twice (by Masatake YAMATO)
    - simplify TS_DESC in fdisk/mbr-logical-ebr-gap (by Karel Zak)
    - (fdisk) make sure test_strerror avalable (by Karel Zak)
    - add tests for unshare --forward-signals (by Kiran Rangoon)
    - (lsfd::column-mntid) add a new case (by Masatake YAMATO)
    - (test_mkfds::mmap) add "shared" paramter (by Masatake YAMATO)
    - (refactor) add ts_skip_config, a new helper function (by Masatake YAMATO)
    - (lsfd::mkfds-mmap-maksed-file) revise the description (by Masatake YAMATO)
    - add getino tests (by Christian Goeschel Ndjomouo)
    - add regression test for repeated termreduce printing (by Alessandro Ratti)
    - add libsmartcols termreduce regression helper (by Alessandro Ratti)
    - fdisk add regression test for missing EBR gap between logical partitions (by Martin Jungblut Schreiner)
    - correct UUID timestamp test expectations (by Kiran Rangoon)
    - (lslocks) test -Q,--filter option (by Masatake YAMATO)
    - (test_mkfds::nop) new factory just printing pid (by Masatake YAMATO)
    - convert fallocate to use subtests (by Karel Zak)
    - (su) test GID argument in --group option (by Christian Goeschel Ndjomouo)
    - (lsfd::mkfds-cdev-tun,refactor) make the case extensible (by Masatake YAMATO)
    - (swaplabel) don't create test image with truncate(1) (by Thomas Weißschuh)
    - update cal color outputs (by Karel Zak)
    - update lsmem outputs (by Karel Zak)
    - (su) add more options tests (by cgoesche)
    - optstr test redundant commas (by Cole Robinson)
    - (configs) add sorting and masking test (by Karel Zak)
    - (configs) check for scandirat() (by Karel Zak)
    - (configs) add file listings to expected output (by Karel Zak)
    - add regression tests for ul_configs_file_list() (by Karel Zak)
    - (libmount) improve explicit loop read-write mount check (by Christian Goeschel Ndjomouo)
    - (lslogins) test --json output mode (by Christian Goeschel Ndjomouo)
    - (lsfd/mkfds-unix-dgram) skip if the unix diag netlink interface is not available (by Masatake YAMATO)
    - (lsfd-functions.sh) make lsfd_check_sockdiag usable in subtests (by Masatake YAMATO)
    - (lsfd/mkfds-unix-stream-requiring-sockdiag) revise the test description (by Masatake YAMATO)
    - (lsfd/column-source-btrfs) extract a minor number in a more reliable way (by Masatake YAMATO)
    - (lsmem) update expected/lscpu/* with 'ZONES' column (by Christian Goeschel Ndjomouo)
    - add canonicalize test (by Karel Zak)
    - add color names test (by Karel Zak)
    - update expected type to 'ntfs3' (by Johannes Schneider)
    - add chrt SCHED_EXT test (by Shashank Balaji)
    - update coresched tests (by Karel Zak)
    - mark lsns/filer as TS_KNOWN_FAIL (by Karel Zak)
    - (test_mkfds::mapped-packet-socket) add a new parameter, protocol (by Masatake YAMATO)
    - (lscpu) update RISC-V tests to add ISA line (by Karel Zak)
    - (lsfd::mkfds-unix-dgram, refactor) split the test into subtests (by Masatake YAMATO)
    - add ts_is_in_docker as a helper function (by Masatake YAMATO)
    - (lsns) verify NETNSID column for namespaces with no process running (by Masatake YAMATO)
    - update lsmem outputs (by Karel Zak)
    - (lsns/nsfs) consider the cases that lsns returns multiple paths (by Masatake YAMATO)
    - (lsns/nsfs) check test_sysinfo helper (by Masatake YAMATO)
    - improve test_sysinfo to check for NS_GET_NSTYPE usability (by Karel Zak)
    - check for ns-get*-ok (by Karel Zak)
    - (flock::range-lock) add a case testing --start/--length (by Masatake YAMATO)

tests/helpers/test_sigstate.c:
    - explicitly reset SIGINT to default action after trapping (by Hongxu Jia)

tests/ts/kill/decode:
    - avoid using shell built-in kill command (by Chen Qi)

test_sysinfo:
    - remove memory lea [coverity scan] (by Karel Zak)

textual:
    - rename list_colunms() to list_columns() and remove trailing whitespaces (by Christian Goeschel Ndjomouo)
    - harmonize the messages for invalid count and timeout values (by Benno Schulenberg)
    - harmonize the messages for an invalid size, length, and offset (by Benno Schulenberg)
    - harmonize the wording of the error message for an invalid PID (by Benno Schulenberg)
    - fix a mistruncated message, and fix a typo (by Benno Schulenberg)

tools:
    - git-version-bump, accept X.Y-devel version on master branch (by Karel Zak)
    - (get-options.sh) refine regex for unsupported programs to avoid false positives (by Christian Goeschel Ndjomouo)
    - expand relative paths provided by $top_srcdir for robustness (by Christian Goeschel Ndjomouo)
    - helper script to generate a test coverage report (by Christian Goeschel Ndjomouo)
    - (get-options.sh) ensure functionality for out-of-tree builds (by Christian Goeschel Ndjomouo)
    - verify the consistency of manpages for all programs (by Christian Goeschel Ndjomouo)
    - (get-options.sh) skip programs that do not use <struct option> (by Christian Goeschel Ndjomouo)
    - (get-options.sh) ignore long opt definitions marked with IGNORECHECK=yes (by Christian Goeschel Ndjomouo)
    - (checkusage.sh) verify the completeness of listed long options (by Christian Goeschel Ndjomouo)
    - (checkcompletion.sh) test the integrity of long options completion (by Christian Goeschel Ndjomouo)
    - new helper for extraction of program long options from source files (by cgoesche)
    - rewrite checkcompletion.sh to be source-based (by Karel Zak)
    - improve git-version-bump with validation and help (by Karel Zak)
    - improve git-version-next to always output version variables (by Karel Zak)
    - add git-version-next script release versioning (by Karel Zak)
    - add checktarball-meson.sh (by Karel Zak)
    - add SPDX-License-Identifier (by Karel Zak)
    - improve in-repo check (by Karel Zak)

tools/checkconfig:
    - strip C comments before macro extraction (by Karel Zak)

tools/git-grouped-log:
    - sort output (by Karel Zak)
    - add script to generated git log (by Karel Zak)

tools/git-tp-sync:
    - fix po/ update (by Karel Zak)
    - update also po-man (by Karel Zak)
    - fix checkout -f use (by Karel Zak)
    - require git (by Karel Zak)
    - merge changes to PO files (by Karel Zak)
    - support multiple directories (by Karel Zak)
    - reuse git ls-files calls (by Karel Zak)
    - add --dry-run and --help (by Karel Zak)
    - Compare Revisions (by Karel Zak)

tools/git-tp-sync-man:
    - remove obsolete script (by Karel Zak)

tools/git-version-bump:
    - add script to update hardcoded versions (by Karel Zak)

tools/git-version-gen:
    - accept -start in version (as -rc) (by Karel Zak)

tools/poman-translate:
    - fix to work outside on source dir (by Karel Zak)

treewide:
    - consistently use tabs for indentation where it is the rule (by Benno Schulenberg)
    - use is_dotdir_dirent() helper (by Karel Zak)
    - consolidate --list-columns option in usage() to USAGE_LIST_COLUMNS_OPTION() (by Christian Goeschel Ndjomouo)
    - replace postal address in license specifier with a terse URL (by Benno Schulenberg)
    - improve getauxval(AT_SECURE) usage (by Karel Zak)
    - add ul_ to parse_timestamp() function name (by Karel Zak)
    - add ul_ to parse_switch() function name (by Karel Zak)
    - add ul_ to parse_size() function name (by Karel Zak)
    - add ul_  to parse_range() function name (by Karel Zak)
    - fix optional arguments usage (by Karel Zak)
    - use strtopid_or_err() (by Masatake YAMATO)
    - avoid strcasecmp() for ASCII-only strings (by Karel Zak)

ts/kill/decode:
    - compare decoded output in an architecture-independent way (by Masatake YAMATO)
    - check the availability of "sed" (by Masatake YAMATO)
    - consider arch dependent signum/name association (by Masatake YAMATO)
    - use RTMIN from 'kill -L' instead of hardcoding 34 (by Chen Qi)

tunelp:
    - remove extraneous -T option (by Christian Goeschel Ndjomouo)

uclampset:
    - simplify the synopsis in the --help usage text (by Benno Schulenberg)

ul_nl_addr_dup():
    - Fix address comparison (by Stanislav Brabec)

umount:
    - consider helper return status for success message (by Christian Goeschel Ndjomouo)

unshare:
    - document --forward-signals in man page (by Kiran Rangoon)
    - implement signal forwarding when --forward-signals is used (by Kiran Rangoon)
    - add --forward-signals option to argument parser (by Kiran Rangoon)
    - (man) fix grammar (by Tobias Stoeckmann)
    - fix inconsistency in usage message (by Christian Goeschel Ndjomouo)
    - fix user namespace bind mounts (by Chris Webb)
    - remove get_mnt_ino() check in bind_ns_files_from_child() (by Chris Webb)
    - add --owner to set user namespace owner uid and gid (by Chris Webb)
    - use MAX_OF_UINT_TYPE instead of (type)-1 (by Christian Goeschel Ndjomouo)
    - use the new ul_get{grp,userpw}_str() routines (by Christian Goeschel Ndjomouo)
    - make the wording of a message identical to that of three others (by Benno Schulenberg)
    - fix typo in --map-groups=subids map name [coverity scan] (by Karel Zak)
    - make strings more robust (by Karel Zak)

uuidd:
    - use locked system user account if available (by Tobias Stoeckmann)
    - put an option and its description in a single message (by Benno Schulenberg)

uuidgen.1.adoc:
    - remove superfluous 'plus' (by Daniel Lublin)

various:
    - (man) list --help and --version last among the options (by Benno Schulenberg)

waitpid:
    - (manpage) document the support for the "PID:inode" addressing format (by Christian Goeschel Ndjomouo)
    - close fd after removal from epoll interest list (by Christian Goeschel Ndjomouo)
    - support 'PID:inode' process addressing format (by Christian Goeschel Ndjomouo)
    - refactor to improve maintainability (by Christian Goeschel Ndjomouo)

wdctl:
    - remove -d option leftover (by Munehisa Kamata)

whereis:
    - fix const qualifier warnings for C23 (by Karel Zak)

Wipefs:
    - improve --all descriptions for whole-disks (by Karel Zak)

zramctl:
    - (manpage) add --bytes option description (by Christian Goeschel Ndjomouo)
    - Add note about column descriptions (by Karel Zak)
    - ignore ENOENT when setting max_comp_streams (by Jiang XueQian)
    - fix MEM-USED column description (by Jérôme Poulin)
    - (man) mention the required arguments for -p and -r (by Benno Schulenberg)
    - restore normal description indentations in the usage text (by Benno Schulenberg)
    - wait for device being initialized and unlocked by udevd (by Yu Watanabe)

Misc:
    - Fix formatting in getino.1.adoc (by Mario Blättermann)
    - avoid repetitive code (by Arvin Schnell)
    - always use array with name in json output (by Arvin Schnell)
    - updated test case (by Arvin Schnell)
    - include device in json output and use json array when needed (by Arvin Schnell)
    - Fix various typos and markup in man pages (by Mario Blättermann)
    - Fix typo in flock.1.adoc (by Mario Blättermann)
    - Fix typos (by Tobias Stoeckmann)
    - runuser (by su: elaborate man page regarding TIOCSTI/TIOCLINUX ioctl command injection|finefoot)
    - Add man page section to (sys)calls (by Dick Marinus)
    - Fix typos in comments (by Tobias Stoeckmann)
    - Fix gettext macro calls (by Tobias Stoeckmann)
    - Add fuse.kio-fuse to list of pseudo file systems (by Oliver Schramm)
    - Fix memory leak in setpwnam() (by yao zhang)
    - Fix typos when "set up" is used as a verb (by Louis Sautier)
    - Fix the issue of fd resource leakage (by Leefancy)
    - Fix memory leak issue in read_Subid_range() (by fortunate-lee)
    - update .gitignore (by Karel Zak)
    - parsing /run/issue.d/* too (by Stefan Schubert)
    - New netlink library (by Stanislav Brabec)
    - Using fix issue dir path "/usr/lib" for agetty (by Stefan Schubert)
    - Fix another issue in login.1.adoc (by Mario Blättermann)
    - Fix markup in pam_lastlog2.8.adoc (by Mario Blättermann)
    - Fix markup in column.1.adoc (by Mario Blättermann)
    - Fix markup in mount.8.adoc (by Mario Blättermann)
    - Fix typo and markup in getopt.1.adoc (by Mario Blättermann)
    - Fix markup in lsfd.1.adoc (by Mario Blättermann)
    - Fix markup, grammar and spelling in scols-filter.5.adoc (by Mario Blättermann)
    - Fix login.1.adoc (by Mario Blättermann)
    - Fix markup in pam_lastlog2.8.adoc (by Mario Blättermann)
    - Fix markup in ll2_import_lastlog.3.adoc (by Mario Blättermann)
    - Fix markup in more.1.adoc (by Mario Blättermann)
    - Fix markup in column.1.adoc (by Mario Blättermann)
    - Fix markup in mesg.1.adoc (by Mario Blättermann)
    - Fix markup in unshare.1.adoc (by Mario Blättermann)
    - Fix markup in swapon.8.adoc (by Mario Blättermann)
    - Fix typos and markup in setpriv.1.adoc (by Mario Blättermann)
    - Fix markup in lsirq.1.adoc (by Mario Blättermann)
    - Fix markup in flock.1.adoc (by Mario Blättermann)
    - Fix markup in chmem.8.adoc (by Mario Blättermann)
    - Fix markup in lastlog2.8.adoc (by Mario Blättermann)
    - Fix markup in findmnt.8.adoc (by Mario Blättermann)
    - Fix markup in su.1.adoc (by Mario Blättermann)
    - Fix markup in login.1.adoc (by Mario Blättermann)
    - Fix markup in scols-filter.5.adoc (by Mario Blättermann)
    - Add reflink support for ZFS. (by Chester Gregg)
    - Add missing ;; to -m case (#1) (by Nate Drake)
    - Make scols_column_set_data_func docs visible (by FeRD (Frank Dana))
    - correct the full name of the GPL in various files (by Benno Schulenberg)
    - remove "Copyright (C) ...." notes from files that claim no copyright (by Benno Schulenberg)
    - remove two leftover license lines from colors.{c,h} (by Benno Schulenberg)
    - add option to force cachestat() usage (by Matteo Croce)
    - Update bufflen (by Mohamed Maatallah)
    - fix sectors typos (by formtapez)
    - Update setpwnam.c (by Mohamed Maatallah)
    - Do not call exit() on code ending in shared libraries (by Cristian Rodríguez)
    - fix and add parse_switch() test (by Karel Zak)
    - Do not use strerror on shared libraries (by Cristian Rodríguez)
    - Use the 'fallthrough' attribute (by Matteo Croce)
    - move XXH_FALLTHROUGH into a generic include file (by Matteo Croce)
    - Fix XXH_HAS_C_ATTRIBUTE check (by easyaspi314 (Devin))
    - Fix typo in blkdiscard docs (by pls-no-hack)
    - sys-utils/flock.c Fix a typo in flock.c (by Masanari Iida)
    - lib/fileeq.c Fix a typo in message. (by Masanari Iida)
    - Use ipc_stat::cgid for the column COL_CGID. (by Koutheir Attouchi)
    - use ul_default_shell() for interactive shell spawning (by Alessandro Ratti)


^ permalink raw reply

* Re: [ANNOUNCE] util-linux v2.42-rc1
From: Samuel Thibault @ 2026-02-27  0:28 UTC (permalink / raw)
  To: Karel Zak; +Cc: util-linux
In-Reply-To: <wid276gkq7tblvkfwc6kum4nacamstiigqjj5ux6j6zd4blz4l@jzq3sgfh6cj5>

[-- Attachment #1: Type: text/plain, Size: 92922 bytes --]

Hello,

Karel Zak, le jeu. 26 févr. 2026 13:53:23 +0100, a ecrit:
> 
> The util-linux release v2.42-rc1 is now available at
>  
>   http://www.kernel.org/pub/linux/utils/util-linux/v2.42/
>  
> Feedback and bug reports, as always, are welcomed.

Here is a fix for non-linux systems.

Thanks,
Samuel


> util-linux 2.42 Release Notes
> =============================
> 
> The NTFS mount type (kernel FS driver) can be changed by the compile option
> --with-ntfs-mounttype=, the default is ntfs3.
> 
> login(1) now uses the original FQDN (as specified by "-h <host>") to configure
> the PAM RHOST item. All previous versions used the hostname without domain.
> This may affect users who use login(1) for remote access (rlogin, rsh) and
> pam_access to define access rules. (Don't worry, if you still use rlogin then
> security is already irrelevant for you.)
> 
> login(1), if configured with LOGIN_SHELL_FALLBACK in login.defs, can fall back
> to another valid shell from /etc/shells if the user's configured shell is
> inaccessible due to administrative errors.
> 
> agetty reads issue file(s) in a way compatible with libeconf and systemd,
> hermetic-usr and drop-ins are now supported. For more details see
> https://uapi-group.org/specifications/specs/configuration_files_specification/
> 
> agetty uses netlink to get network interface information for issue file output.
> 
> The libsmartcols-based tools with JSON support can now produce additional JSON
> formats. The output format may be changed by LIBSMARTCOLS_JSON={lines,compact}
> environment variable.
> 
> column(1) now supports colors.
> 
> New command copyfilerange(1) to copy file ranges using the copy_file_range()
> syscall.
> 
> New command getino(1) to print the unique inode number associated with a
> process file descriptor or namespace for a given PID.
> 
> fadvise(1) now supports --fd to address a file by file descriptor rather than
> by path.
> 
> fallocate(1) now supports --report-holes to scan the file and report the
> distribution of holes.
> 
> A significant performance regression has been fixed in hardlink(1).
> 
> hardlink(1) now supports FIEMAP-based sparse file optimization.
> 
> kill(1), waitpid(1) and nsenter(1) now support the PID:INO convention to
> precisely address processes.
> 
> mount(8) now supports --beneath to atomically replace a filesystem at a
> mountpoint.
> 
> mount(8) now supports --exclusive to ensure that the filesystem is mounted as a
> unique instance and that the superblock is not reused by the kernel.
> 
> libmount now reads filesystem information from udevd (with fallback to classic
> libblkid-based detection). This feature can be disabled by
> --disable-libmount-udev-support.
> 
> setarch(8) now supports --pid to show the personality of a specified process.
> 
> The pager support for tools like "dmesg -H" has been improved to work better
> with signals.
> 
> losetup(8) now supports --remove to remove a loop device node from the system.
> 
> lsblk(8), lslocks(8), lsmem(1) and lsclocks(1) support <NAME>_COLUMNS
> environment variable to specify output columns as an alternative to --output.
> 
> lsfd(1) now supports new UNIX.IPEER, PACKET.PROTOCOL.RAW and TUN.DEVNETNS
> columns.
> 
> setpriv(1) now supports landlock via --landlock-access and --landlock-rule
> options.
> 
> 
> Changes between v2.41 and v2.42
> -------------------------------
> 
> agetty:
>     - Fix reading /run/issue.d/ again (by Fabian Vogt)
>     - Process all data from ul_nl_process() (by Stanislav Brabec)
>     - Implement netlink based IP processing (by Stanislav Brabec)
>     - use standard path macros (by Karel Zak)
>     - using configs lib for parsing issue files (by Stefan Schubert)
>     - fix erasure of escape sequences and tab characters (by Karel Zak)
>     - fix stdin conversion to tty name (by Karel Zak)
> 
> agetty,setterm:
>     - (man) remove the mistakenly added -h and -V short options (by Benno Schulenberg)
> 
> AUTHORS:
>     - add copyfilerange (by Karel Zak)
>     - update Zhenwei Pi email (by zhenwei pi)
> 
> autotools:
>     - use $PTHREAD_LIBS everywhere (by Karel Zak)
>     - optionally add libpthread to uuid.pc (by Bernd Kuhls)
>     - cleanup tests to use libcommon.la (by Karel Zak)
>     - don't use wide-character ncurses if --disable-widechar (by Karel Zak)
>     - add missing meson.build files (by Karel Zak)
>     - Fix use of mq_open and mq_close (by Samuel Thibault)
>     - remove tools/git-tp-sync-man (by Karel Zak)
> 
> bash-completion:
>     - add getino completions (by Christian Goeschel Ndjomouo)
>     - (lscpu) add --annotate option (by Christian Goeschel Ndjomouo)
>     - (lslogins) fix typo in long option (by Christian Goeschel Ndjomouo)
>     - (unshare) add missing --map-subids option (by Christian Goeschel Ndjomouo)
>     - (mountpoint) add missing --show option (by Christian Goeschel Ndjomouo)
>     - (mount) add missing --ro option (by Christian Goeschel Ndjomouo)
>     - (lslogins) add missing long options (by Christian Goeschel Ndjomouo)
>     - (lsclocks) add missing --no-discover-rtc option (by Christian Goeschel Ndjomouo)
>     - (hwclock) add missing --ul-debug option (by Christian Goeschel Ndjomouo)
>     - (flock) add missing long options (by Christian Goeschel Ndjomouo)
>     - (nsenter) add missing --follow-context (by cgoesche)
>     - (namei) add missing --context (by cgoesche)
>     - (setpriv) add missing long options (by cgoesche)
>     - (pg) add missing long options (by cgoesche)
>     - (lastlog2) add missing --active (by cgoesche)
>     - (whereis) add missing long options (by Christian Goeschel Ndjomouo)
>     - (wdctl) add missing long options (by Christian Goeschel Ndjomouo)
>     - (uuidd) add missing --cont-clock (by Christian Goeschel Ndjomouo)
>     - (unshare) add missing long options (by Christian Goeschel Ndjomouo)
>     - (swapon) add missing --options (by Christian Goeschel Ndjomouo)
>     - (sfdisk) add missing long options (by Christian Goeschel Ndjomouo)
>     - (setsid) add missing --fork (by Christian Goeschel Ndjomouo)
>     - (scriptlive) add missing --echo (by Christian Goeschel Ndjomouo)
>     - (renice) add missing --relative (by Christian Goeschel Ndjomouo)
>     - (more) add missing --exit-on-eof (by Christian Goeschel Ndjomouo)
>     - (mkswap) add missing long options (by Christian Goeschel Ndjomouo)
>     - (mkfs.minix) add missing --lock (by Christian Goeschel Ndjomouo)
>     - (mkfs.cramfs) add missing long options (by Christian Goeschel Ndjomouo)
>     - (mkfs.bfs) add missing --lock (by Christian Goeschel Ndjomouo)
>     - (lsmem) add missing --split (by Christian Goeschel Ndjomouo)
>     - (lslogins) add missing --shell (by Christian Goeschel Ndjomouo)
>     - (lscpu) add missing --hierarchic (by Christian Goeschel Ndjomouo)
>     - (lsclocks) add missing --no-discover-dynamic (by Christian Goeschel Ndjomouo)
>     - (lsblk) add missing long options (by Christian Goeschel Ndjomouo)
>     - (losetup) add missing long options (by Christian Goeschel Ndjomouo)
>     - (hwclock) add missing long options (by Christian Goeschel Ndjomouo)
>     - (hardlink) add missing long options (by Christian Goeschel Ndjomouo)
>     - (getopt) add missing --unknown (by Christian Goeschel Ndjomouo)
>     - (fsck) add missing long options (by Christian Goeschel Ndjomouo)
>     - (flock) add missing --verbose (by Christian Goeschel Ndjomouo)
>     - (findmnt) add missing long options (by Christian Goeschel Ndjomouo)
>     - (fincore) add missing --total (by Christian Goeschel Ndjomouo)
>     - (fallocate) add missing --write-zeroes (by Christian Goeschel Ndjomouo)
>     - (fadvise) add missing --fd (by Christian Goeschel Ndjomouo)
>     - (column) add missing long options (by Christian Goeschel Ndjomouo)
>     - (cfdisk) add missing --sector-size (by Christian Goeschel Ndjomouo)
>     - (cal) add missing long options (by Christian Goeschel Ndjomouo)
>     - (blockdev) add missing long options (by Christian Goeschel Ndjomouo)
>     - (blkid) add missing --hint (by Christian Goeschel Ndjomouo)
>     - (bits) add missing --binary (by Christian Goeschel Ndjomouo)
>     - (mount) add missing options (by Christian Goeschel Ndjomouo)
>     - (lslogins) add --list-columns option (by Christian Goeschel Ndjomouo)
>     - (lslogins) add --json completion (by Christian Goeschel Ndjomouo)
>     - dmesg remove redundant completion for --buffer-size (by Christian Goeschel Ndjomouo)
>     - dmesg complete filenames for --kmsg-file (by Christian Goeschel Ndjomouo)
>     - dmesg add missing long options (by Christian Goeschel Ndjomouo)
>     - add lsfd (by Karel Zak)
>     - add blkpr (by Karel Zak)
>     - add bits to dist tarball (by Karel Zak)
>     - (swapon) add --annotation option (by Christian Goeschel Ndjomouo)
>     - add MICROCODE to $OPTS_ALL (by Christian Goeschel Ndjomouo)
>     - (lsns) add -H/--list-columns options (by Christian Goeschel Ndjomouo)
>     - (lscpu) add -H/--list-columns options (by Christian Goeschel Ndjomouo)
>     - add fallback to filename expansion for umount (by Christian Goeschel Ndjomouo)
>     - fix function name of enosys completion (by Koichi Murase)
>     - add choom and coresched (by Karel Zak)
>     - update autocompletion list to 'ntfs3' (by Johannes Schneider)
>     - use "command ls" instead of "\ls" (by Koichi Murase)
>     - prefix "command" to other external commands (by Koichi Murase)
>     - prefer "builtin cd" to "cd" to avoid aliases (by Koichi Murase)
>     - prefer "command lsblk" to "lsblk" to avoid aliases (by Koichi Murase)
>     - (chrt) add completion for -e/--ext (by Shashank Balaji)
>     - (setarch) show some options as the 1st arg (by Masatake YAMATO)
> 
> bits:
>     - only build when cpu_set_t is available (by Alyssa Ross)
>     - (man) normalize the markup and improve some layout (by Benno Schulenberg)
> 
> blkdev:
>     - Correct zone report size calculation (by Leefancy)
> 
> blkdiscard:
>     - (tests) add more long option tests (by Christian Goeschel Ndjomouo)
> 
> blkid:
>     - add --garbage-collect test (by Christian Goeschel Ndjomouo)
>     - (testcoverage) add more long option tests (by Christian Goeschel Ndjomouo)
>     - move error checks before JSON output initialization (by Karel Zak)
>     - Drop const from blkid_partitions_get_name() (by Daan De Meyer)
>     - correct an erroneous error message (by Benno Schulenberg)
> 
> blkpr:
>     - fix compilation [-Werror,-Wunused-function] (by Karel Zak)
>     - Call gettext() for descriptions, clean up (by Karel Zak)
>     - add read-reservation command (by Stefan Hajnoczi)
>     - add read-keys command (by Stefan Hajnoczi)
>     - prepare for _IOR() ioctls (by Stefan Hajnoczi)
> 
> blkzone:
>     - remove unnecessary brackets (by Karel Zak)
>     - add more checks when printing zone write_pointer (by Wilfred Mallawa)
>     - make N/A string translatable (by Karel Zak)
>     - don't show wptr when zones are full (by Wilfred Mallawa)
>     - (man) reduce two overblown tables to legible proportions (by Benno Schulenberg)
> 
> build:
>     - simplify checks for fallocate() and posix_fallocate() (by Thomas Weißschuh)
> 
> build(deps):
>     - bump actions/cache from 4 to 5 (by dependabot[bot])
>     - bump actions/upload-artifact from 5 to 6 (by dependabot[bot])
>     - bump actions/checkout from 1 to 6 (by dependabot[bot])
>     - bump actions/upload-artifact from 4 to 5 (by dependabot[bot])
>     - bump github/codeql-action from 3 to 4 (by dependabot[bot])
>     - bump actions/labeler from 5 to 6 (by dependabot[bot])
>     - bump actions/checkout from 1 to 5 (by dependabot[bot])
> 
> build-sys:
>     - add a target for tools/testcoverage.sh (by Christian Goeschel Ndjomouo)
>     - (gcc) ignore -Wunused-but-set-variable for bison (by Christian Goeschel Ndjomouo)
>     - make sure _PATH_SYSCONFDIR is defined (by Karel Zak)
>     - update release dates (by Karel Zak)
>     - keep the most recent version in NEWS (by Karel Zak)
> 
> cal:
>     - add note about today highlight on -w (by Karel Zak)
>     - improve header color printing (by Karel Zak)
> 
> cfdisk:
>     - fix memory leak and possible NULL dereference [gcc-analyzer] (by Karel Zak)
> 
> chfn:
>     - allow --help and --version without login.defs restrictions (by Karel Zak)
>     - improve man page (by Christian Goeschel Ndjomouo)
>     - make comment more accurate (by Christian Goeschel Ndjomouo)
>     - fix minor grammar mistakes in comments (by Christian Goeschel Ndjomouo)
>     - use true/false bool values for semantic clarity (by Christian Goeschel Ndjomouo)
>     - use direct equality check for semantic clarity and readability (by Christian Goeschel Ndjomouo)
>     - free memory before return from save_new_data() (by Christian Goeschel Ndjomouo)
>     - use null character (0) for better readability (by Christian Goeschel Ndjomouo)
>     - fix typos, wording, and punctuation inconsistencies (by Christian Goeschel Ndjomouo)
>     - enable the use of the username or UID (by Christian Goeschel Ndjomouo)
> 
> chmem:
>     - do not word a configuration failure as an instruction to the user (by Benno Schulenberg)
>     - improve messages (by Karel Zak)
>     - add chmem documentation for dynamic (de)configuration of memory (by Sumanth Korikkar)
>     - add support for dynamic (de)configuration of hotplug memory (by Sumanth Korikkar)
>     - Remove commit - chmem print warnings about failures always (by Sumanth Korikkar)
>     - (man) add missing end-of-bold marker, and add missing OR bar (by Benno Schulenberg)
>     - print warnings about failures always (not only with --verbose) (by Benno Schulenberg)
> 
> choom:
>     - (testcoverage) add long options tests (by Christian Goeschel Ndjomouo)
>     - (man) add the missing SYNOPSIS section header, and improve wording (by Benno Schulenberg)
> 
> chrt:
>     - (man) fix note about --sched-period lower limit (by Jan Krieg)
>     - (man,usage) put --pid first in synopses and examples, for clarity (by Benno Schulenberg)
>     - (man) improve wording and markup of some examples (by Benno Schulenberg)
>     - (man,usage) mark the priority value as optional in the synopses (by Benno Schulenberg)
>     - produce better error message for missing priority with implied -r (by Benno Schulenberg)
>     - Allow optional priority for non‑prio policies without --pid (by Madadi Vineeth Reddy)
>     - do not try to interpret any other option as a PID either (by Benno Schulenberg)
>     - simplify the other check for too few arguments (by Benno Schulenberg)
>     - do not try to interpret the --pid option itself as a PID (by Benno Schulenberg)
>     - with more than one argument, interpret first argument as priority (by Benno Schulenberg)
>     - (man) mark "argument" as optional, and unabbreviate it in usage (by Benno Schulenberg)
>     - (man) correct the short form of --ext, from -d to -e (by Benno Schulenberg)
>     - Make priority optional for policies that don't use it (by Madadi Vineeth Reddy)
>     - Only display current settings when no policy is specified (by Madadi Vineeth Reddy)
>     - Make minor cleanups in chrt (by Madadi Vineeth Reddy)
>     - (man) add SCHED_EXT (by Shashank Balaji)
>     - add support for SCHED_EXT (by Shashank Balaji)
> 
> chsh:
>     - extend usage message (by Tobias Stoeckmann)
>     - use new xgetuserpw() instead of xgetpwnam() (by Christian Goeschel Ndjomouo)
> 
> ci:
>     - add usage message consistency check to CI CODECHECK phase (by Christian Goeschel Ndjomouo)
>     - add usage message consistency check to CI CHECK phase (by Christian Goeschel Ndjomouo)
>     - roll back the version of checkout for "build (compat, ubuntu:18.04)" (by Masatake YAMATO)
>     - add bash-completion consistency check to CODECHECK (by Karel Zak)
>     - build on MIPS (by Thomas Weißschuh)
>     - add OpenWRT subtarget to matrix name (by Thomas Weißschuh)
>     - update gcc to version 14 (by Thomas Weißschuh)
>     - update clang to version 20 (by Thomas Weißschuh)
>     - bump uraimo/run-on-arch-action to v3 (by Frantisek Sumsal)
>     - (reverted) temporarily switch the alt-arch job worker to Ubuntu 22.04 (by Frantisek Sumsal)
> 
> col:
>     - use snprintf() instead of sprintf() (by Karel Zak)
> 
> colrm:
>     - make two error messages actually say that something is wrong (by Benno Schulenberg)
> 
> column:
>     - using switch-case replaces if-else (by WanBingjiang)
>     - add JSON compact format output subtest. (by WanBingjiang)
>     - add JSON LINES format output subtest. (by WanBingjiang)
>     - introduce LIBSMARTCOLS_JSON environment argument (by WanBingjiang)
>     - add bash-completion for table-header-as-columns (by WanBingjiang)
>     - add option '--table-header-as-columns' for using first line as table columns names. (by WanBingjiang)
>     - add --input-separator as an alias for --separator (by Karel Zak)
>     - (usage) wrap two descriptions, to make them fit within 80 columns (by Benno Schulenberg)
>     - (usage) correct the description of --wrap-separator (by Benno Schulenberg)
>     - add --wrap-separator option for custom text wrapping (by Karel Zak)
>     - add support for color scheme (by Karel Zak)
>     - call gettext() on an error message only when it gets printed (by Benno Schulenberg)
>     - add --color[=<when>] to control colorization (by Karel Zak)
>     - add basic colors support (by Karel Zak)
>     - (man) fix broken markup, and improve other markup and wordings (by Benno Schulenberg)
>     - fix compiler warning for non-widechar compilation (by Karel Zak)
>     - replace a mistaken word in an error message (by Benno Schulenberg)
> 
> column doc:
>     - add missing attrubutes (by WanBingjiang)
>     - fix incorrect attribute hidden (by WanBingjiang)
> 
> {configure.ac,meson.build}:
>     - conditionally build {enosys,setpriv} if seccomp is present #3280 (by Thomas Devoogdt)
> 
> copyfilerange:
>     - new command to call copy-file-range (by Dick Marinus)
> 
> coresched:
>     - reduce excessive whitespace and verbosity in usage text (by Benno Schulenberg)
> 
> cpuset:
>     - Use stride in cpulist_create (by Jesse Rosenstock)
> 
> disk-utils:
>     - add attribute nonstring to bfs byte arrays (by Cristian Rodríguez)
> 
> dmesg:
>     - add bounds checking to parse_kmsg_timestamp() (by Karel Zak)
>     - Gracefully handle EPIPE errors (by Tobias Stoeckmann)
>     - Register pager_close as exit handler (by Tobias Stoeckmann)
>     - Keep error messages in parent's stderr (by Tobias Stoeckmann)
>     - update prepare_buffer() comment (by Karel Zak)
>     - improve buffer size error message (by Karel Zak)
>     - Fix short memory allocation with 32 bit (by Tobias Stoeckmann)
>     - Add release_buffer function (by Tobias Stoeckmann)
>     - Split preparing and printing of buffer (by Tobias Stoeckmann)
>     - Check if file is too large (by Tobias Stoeckmann)
>     - Only check for newline if input exists (by Tobias Stoeckmann)
>     - Check input length before calling strtol (by Tobias Stoeckmann)
>     - fix const qualifier warnings in parse_callerid (by Karel Zak)
>     - use snprintf() instead of sprintf() (by Karel Zak)
> 
> docs:
>     - lsns(8) add missing a comma in SEE ALSO section (by Masatake YAMATO)
>     - write about EditorConfig (by Masatake YAMATO)
>     - update mount options for 'ntfs3' (by Johannes Schneider)
>     - update mount type to 'ntfs3' (by Johannes Schneider)
>     - stop the copyright verbiage from getting included in the POT file (by Benno Schulenberg)
>     - make the "po4a:" line the first line, like in all other .adoc files (by Benno Schulenberg)
>     - correct mistaken uses of "overwrite" to say "override" instead (by Benno Schulenberg)
>     - correct misspellings of "may be" and mistaken uses of "overwritten" (by Benno Schulenberg)
>     - add -h/--help and -V/--version to three man pages that lacked them (by Benno Schulenberg)
>     - fix a few indentation issues (by Benno Schulenberg)
>     - improve and harmonize the description of -H / --list-columns (by Benno Schulenberg)
>     - rewrite the description of --bytes, to be clearer (by Benno Schulenberg)
>     - cherry-pick 2.41-ReleaseNotes (by Karel Zak)
> 
> docs,usage:
>     - harmonize description of --hyperlink, and add 2 missing ones (by Benno Schulenberg)
> 
> Documentation:
>     - Fix "maybe be" typo (by Tobias Stoeckmann)
> 
> editorconfig:
>     - add .sh setting (by Karel Zak)
> 
> eject:
>     - fix const qualifier warning in read_speed (by Karel Zak)
>     - (man) add the missing SYNOPSIS header (by Benno Schulenberg)
> 
> enosys:
>     - fix const qualifier warning in parse_block (by Karel Zak)
>     - add the missing arguments of -s and -i to the usage text (by Benno Schulenberg)
> 
> env:
>     - ignore only invalid environment variables (by Tobias Stoeckmann)
> 
> exch:
>     - cosmetic code changes (by Karel Zak)
>     - fix compile error if renameat2 is not present (by Thomas Devoogdt)
> 
> fadvise:
>     - add --fd to the help output (by Christian Goeschel Ndjomouo)
> 
> fallocate:
>     - refactor --report-holes and --dig-holes output (by Karel Zak)
>     - add --report-holes (by syokensyo)
>     - require posix_fallocate() from libc (by Thomas Weißschuh)
>     - drop syscall() fallback for fallocate() (by Thomas Weißschuh)
>     - allow O_CREATE if mode is FALLOC_FL_WRITE_ZEROES (by Lukas Herbolt)
>     - (man,usage) correct the alphabetical sorting of the options (by Benno Schulenberg)
>     - (man) slightly improve the grammar of two sentences (by Benno Schulenberg)
>     - redo four tweaks that were accidentally undone (by Benno Schulenberg)
>     - update FALLOC_FL_WRITE_ZEROES (by Karel Zak)
>     - add FALLOC_FL_WRITE_ZEROES support (by Zhang Yi)
>     - rework incompatible options (by Antonio Russo)
> 
> fdformat:
>     - use size_t and ssize_t (by Karel Zak)
> 
> fdisk:
>     - (man) correct the markup + punctuation of two option descriptions (by Benno Schulenberg)
>     - make SIGINT handler signal-safe (by Tobias Stoeckmann)
>     - (manpage) add --bytes option description (by Christian Goeschel Ndjomouo)
>     - fix possible memory leak (by Karel Zak)
>     - (man) add note about partition size calculation (by Karel Zak)
> 
> fdisk,partx:
>     - avoid strcasecmp() for ASCII-only strings (by Karel Zak)
> 
> fincore:
>     - The previous exit did not call munmap, resulting in a memory mapping leak. (by fortunate-lee)
>     - close the ftsp to prevent fd leak (by syokensyo)
>     - do not fall back to mincore if cachestat fails with EPERM (by Thomas Weißschuh)
>     - add option to show a grand total (by Matteo Croce)
>     - add recursive directory scanning (by Matteo Croce)
> 
> findmnt:
>     - fix misleading warning messages for ntfs3 (by Karel Zak)
>     - (usage) add a needed equals sign before an optional argument (by Benno Schulenberg)
>     - add missing newline in --raw, --pair and --list output formats (by Christian Goeschel Ndjomouo)
>     - fix -k option parsing regression (by Karel Zak)
>     - (man) remove duplicated option, and correct a description (by Benno Schulenberg)
> 
> fix:
>     - use Py_REFCNT macro to work with free-threaded python (by Wouter Deconinck)
> 
> fix typo:
>     - exciting -> existing (by Matteo Croce)
> 
> flock:
>     - (manpage) fix typo in option description (by Christian Goeschel Ndjomouo)
>     - resolve consistency issue in the usage message (by Christian Goeschel Ndjomouo)
>     - fix incomplete -n option info in usage message (by Christian Goeschel Ndjomouo)
>     - support locking with byte-range (by Masatake YAMATO)
> 
> fsck.cramfs:
>     - fix off-by-one heap write in do_symlink() (by Karel Zak)
>     - check buffer size for memcpy() (by Karel Zak)
> 
> fstrim:
>     - use F_TYPE_EQUAL() macro for statfs.f_type comparison (by cgoesche)
>     - mark only the mountpoint as placeholder, not options -A and -a (by Benno Schulenberg)
> 
> getino:
>     - (manpage) improve grammar and wording (by Christian Goeschel Ndjomouo)
>     - new tool to print the unique pidfd or namespace inode number (by Christian Goeschel Ndjomouo)
> 
> getopt:
>     - (usage) make the description of -U fit within 80 columns (by Benno Schulenberg)
>     - add member posixly_correct to struct getopt_control (by Christian Goeschel Ndjomouo)
>     - add feature to ignore unknown options (by Christian Goeschel Ndjomouo)
>     - clarify the use of '--long' instead of '--longoptions' in shell examples (by cgoesche)
>     - document special symbols that should not be used as option characters (by cgoesche)
> 
> github:
>     - revert actions/checkout for ubuntu 18.04 (by Karel Zak)
> 
> gitignore:
>     - Ignore tests/diff/ and test/output/ (by Jesse Rosenstock)
> 
> hardlink:
>     - (man) add note note about ULFILEEQ_DEBUG= (by Karel Zak)
>     - (man,usage) sort the options mostly alphabetically (by Benno Schulenberg)
>     - (usage) improve the descriptions of three options (by Benno Schulenberg)
>     - (usage) remove mistaken period from two option descriptions (by Benno Schulenberg)
>     - define more function as inline (by Karel Zak)
>     - fix performance regression (inefficient signal evaluation) (by Karel Zak)
>     - Use macro for verbose output (by Karel Zak)
>     - fix typoed semicolon to colon in error message (by Benno Schulenberg)
>     - replace a strange word in an error message (by Benno Schulenberg)
> 
> hexdump:
>     - (man) document byte order dependency in multi-byte formats (by Karel Zak)
>     - sanitize fiemap ioctl output (by Karel Zak)
>     - add fetch_more_extents to retrieve all file extents (by WanBingjiang)
>     - fixes Heap-buffer-overflow in rewrite_rules (by WanBingjiang)
>     - add FIEMAP-based sparse file optimization (by WanBingjiang)
>     - (man) put a list item on a single line, to avoid a warning (by Benno Schulenberg)
>     - (man) normalize the synopsis, and shrink a list and two tables (by Benno Schulenberg)
> 
> hwclock:
>     - (manpage) add --param-index description (by Christian Goeschel Ndjomouo)
>     - mark non-standard long options to ignore in CI CHECK (by Christian Goeschel Ndjomouo)
>     - skip RTC_PARAM_SET for --param-set with unchanged value (by Bastian Krause)
>     - use snprintf() instead of sprintf() (by Karel Zak)
>     - remove two comments about parameters that no longer exist (by Benno Schulenberg)
>     - avoid dereferencing a pointer [coverity scan] (by Karel Zak)
> 
> hwclock-rtc:
>     - fix verbose output when --param-set value is unchanged (by Jesse Gilles)
> 
> hwclock-rtc.c:
>     - (reverted) try the 'new' rtc class first (by Rasmus Villemoes)
> 
> include:
>     - rename mount-api-utils.h to mountutils.h (by Karel Zak)
>     - (pidfd-utils.h) conditionally define pidfd inode support (by Christian Goeschel Ndjomouo)
>     - (statfs_magic.h) add pidfs magic number (by Christian Goeschel Ndjomouo)
>     - add helper routines for opening and validating pidfds (by Christian Goeschel Ndjomouo)
>     - implement ARRAY_SIZE with compiler _Countof if supported (by Cristian Rodríguez)
>     - use public domain for colors.{c,h} and xalloc.h (by Karel Zak)
> 
> include/cctype:
>     - fix string comparison (by Karel Zak)
> 
> include/c.h:
>     - add MAX_OF_UINT_TYPE macro to get max num of an uint type (by Christian Goeschel Ndjomouo)
>     - add USAGE_LIST_COLUMNS_OPTION() macro (by Christian Goeschel Ndjomouo)
> 
> include/list:
>     - add a macro for initializing list_head a declarative way (by Masatake YAMATO)
> 
> include/list,lsfd:
>     - remove LIST_HEAD macro again (by Masatake YAMATO)
> 
> include/mount-api-utils:
>     - update to recent kernel (by Karel Zak)
>     - avoid using sys/mount.h (by Karel Zak)
>     - include linux/unistd.h (by Thomas Weißschuh)
>     - improve coding style (by Karel Zak)
> 
> include/mountutils:
>     - remove duplicate inttypes.h include (by Karel Zak)
> 
> include/optutils:
>     - improve err_exclusive_options() output (by Karel Zak)
> 
> include/path:
>     - fix HAVE_STRUCT_STATX use (by Karel Zak)
> 
> include/pidfd-utils:
>     - improve robustness (by Karel Zak)
> 
> include/strutils:
>     - add missing header guard comment (by Christian Goeschel Ndjomouo)
>     - add ul_strtou16() (by Karel Zak)
>     - Add startswithpath() (by Karel Zak)
> 
> ipcrm:
>     - (manpage) add --verbose description (by Christian Goeschel Ndjomouo)
>     - in usage text, use two lines when option+arguments is very long (by Benno Schulenberg)
>     - move a constant argument in order to gettextize the message (by Benno Schulenberg)
> 
> ipcs:
>     - align the first group of options with later ones in the usage text (by Benno Schulenberg)
> 
> ipcutils, lsipc:
>     - unabbreviate two words in some error messages (by Benno Schulenberg)
> 
> irqtop:
>     - use standard 'always/never' arguments instead of 'enable/disable' (by Benno Schulenberg)
>     - make the wording of an error message identical to that of another (by Benno Schulenberg)
>     - improve several more option descriptions, and align them all (by Benno Schulenberg)
>     - improve the description of --batch, and align it with others (by Benno Schulenberg)
>     - use output string in a more robust way (by Karel Zak)
>     - support json output format (by Joe Jin)
>     - add max iteration support (by Joe Jin)
>     - add batch mode support (by Joe Jin)
> 
> irqtop,lsirq:
>     - use scols debug (by Karel Zak)
>     - set up locale path, so messages get actually translated (by Benno Schulenberg)
> 
> jsonwrt:
>     - rename ul_json_format_t to enum ul_json_format (by Karel Zak)
>     - simplify ul_jsonwrt_empty() and add comments for COMPACT format (by WanBingjiang)
>     - support Compact JSON format output (by WanBingjiang)
> 
> kill:
>     - use uint64_t as type for kill_control->pidfd_ino (by Christian Goeschel Ndjomouo)
>     - replace USE_KILL_WITH_PIDFD_INO ifdef with USE_PIDFD_INO_SUPPORT (by Christian Goeschel Ndjomouo)
>     - use ul_get_valid_pidfd_or_err() to validate user provided pidfd inodes (by Christian Goeschel Ndjomouo)
>     - the situation where fd is opened but not closed (by fortunate-lee)
>     - (refactor) rename parameter to better reflect its purpose (by Masatake YAMATO)
>     - add support for race-free process kills using pidfd inodes (by Christian Goeschel Ndjomouo)
>     - comments fix grammar in parse_arguments() (by Naoki Wake)
>     - usage fix wrapped indent in -l/--list description (by Naoki Wake)
> 
> kill.1.adoc:
>     - update the description for -l/-L option (by Masatake YAMATO)
> 
> kill (-l/-L):
>     - print one signal per line when stdout is not a TTY (by Masatake YAMATO)
> 
> last:
>     - (man) reduce an inflated table to sane proportions (by Benno Schulenberg)
>     - (man) correct the descriptions of --present and --since (by Benno Schulenberg)
>     - don't use a tab character in the --help usage text (by Benno Schulenberg)
> 
> lastlog2:
>     - besides -v, recognize also the standard -V for --version (by Benno Schulenberg)
>     - (man) fix some broken markup, and lowercase option arguments (by Benno Schulenberg)
> 
> ldattach:
>     - Allow changing the MTU for GSM0710 framing (by Seppo Takalo)
>     - add ifndef BOTHER (by Karel Zak)
> 
> lib:
>     - (strutils.c) fix unchecked lookahead in ul_parse_size() (by Christian Goeschel Ndjomouo)
>     - (pidfd-utils) provide a more liberal variant of ul_get_valid_pidfd_or_err() (by Christian Goeschel Ndjomouo)
>     - (pidutils) improve the return protocol (by Christian Goeschel Ndjomouo)
>     - (pidutils) add a routine to parse pids and err() on failure (by Christian Goeschel Ndjomouo)
>     - (pidutils) improve 'PID:inode' parsing logic (by Christian Goeschel Ndjomouo)
>     - (pidfd-utils) minor correction in the ul_get_valid_pidfd_or_err() description (by Christian Goeschel Ndjomouo)
>     - (pidfd-utils.c) set __unused__ in right way (by Karel Zak)
>     - (procfs.c) remove extraneous return statement (by Christian Goeschel Ndjomouo)
>     - (pidutils.c) use uint64_t instead of ino_t for seamless cross-compatibility (by Christian Goeschel Ndjomouo)
>     - (pidfd-utils.c) remove extraneous _GNU_SOURCE feature test macro (by Christian Goeschel Ndjomouo)
>     - (pidfd-utils) new helper function to retrieve pidfd inode number (by Christian Goeschel Ndjomouo)
>     - (pidfd-utils.c) add a helper routine to check the pidfd fs type (by Christian Goeschel Ndjomouo)
>     - introduce ul_default_shell() for consistent shell resolution (by Alessandro Ratti)
>     - (pwdutils.c) new library routines to get a group/passwd struct by name or GID/UID (by Christian Goeschel Ndjomouo)
>     - fix bad indentation in meson.build (by Christian Goeschel Ndjomouo)
>     - add FSCONFIG_CMD_CREATE_EXCL (by Karel Zak)
> 
> libblkid:
>     - fix integer overflows in HFS+ offset calculations (by Karel Zak)
>     - fix integer overflow in linux_raid checksum size (by Karel Zak)
>     - fix integer overflow in nvidia_raid size check (by Karel Zak)
>     - iso9660 validate root directory to reduce false positives (by Karel Zak)
>     - remove empty loop devices from cache when garbage collecting (by Christian Goeschel Ndjomouo)
>     - (btrfs) use BTRFS_NR_SB_LOG_ZONES and rep->zones (by Karel Zak)
>     - zfs fix unaligned memory access on SPARC (by Ameer Hamza)
>     - (bcachefs) fix LABEL_SUB probing (by Nikita Ofitserov)
>     - (bcachefs) add new bcachefs_sb_member fields (by Nikita Ofitserov)
>     - (bcachefs) add members_v2 parsing support (by Nikita Ofitserov)
>     - Keep NTFS name unmodified and mount driver independent (by Karel Zak)
>     - fix const qualifier warning in blkid_parse_tag_string (by Karel Zak)
>     - use snprintf() instead of sprintf() (by Karel Zak)
>     - Fix probe_ioctl_tp assigning BLKGETDISKSEQ as physical sector size (by Sam Fink)
>     - (ext) reduce false positive (by 胡玮文)
>     - improve UUID_SUB= description (by Karel Zak)
>     - Add scoutfs filesystem. (by Auke Kok)
>     - Fix crash while parsing config with libeconf (by Stanislav Brabec)
>     - befs fix underflow (by Milan Broz)
>     - avoid strcasecmp() for ASCII-only strings (by Karel Zak)
>     - ddf_read validate header checksum (by Thomas Weißschuh)
>     - ddf_raid drop little-endian handling (by Thomas Weißschuh)
>     - ddf_raid respect constness of buffer (by Thomas Weißschuh)
> 
> libblkid/libmount:
>     - ntfs return filesystem type 'ntfs3' (by Johannes Schneider)
> 
> libblkid/src/topology/dm:
>     - fix fscanf return value check to match expected number of parsed items (by Mingjie Shen)
> 
> lib/canonicalize:
>     - use ul_ prefix (by Karel Zak)
>     - introduce generic drop-permission caller (by Karel Zak)
>     - refactor canonicalize_path() (by Karel Zak)
>     - rename to ul_absolute_path() (by Karel Zak)
> 
> libc/crc32:
>     - make fill value of excluded area configurable (by Thomas Weißschuh)
> 
> lib/color-names:
>     - fix stupid bugs (by Karel Zak)
>     - Fix color name canonicalization (by Karel Zak)
> 
> lib/colors:
>     - call gettext() only when the argument of --color is invalid (by Benno Schulenberg)
> 
> libcommon:
>     - added lib "configs" for parsing configuration files in the correct order (by Stefan Schubert)
> 
> lib/config:
>     - fix file counter (by Karel Zak)
>     - Make /run path configurable (by Karel Zak)
> 
> lib/configs:
>     - simplify merge error checking (by Karel Zak)
>     - eliminate counter variable (by Karel Zak)
>     - add head parameter to configs_refer_filename() (by Karel Zak)
>     - simplify variable names (by Karel Zak)
>     - merge new_list_entry() and configs_add_filename() (by Karel Zak)
>     - refactor directory list merging (by Karel Zak)
>     - simplify suffix verification (by Karel Zak)
>     - introduce config_mk_path() helper (by Karel Zak)
>     - add test program for ul_configs_file_list() (by Karel Zak)
>     - initialize FD to -1 (by Karel Zak)
>     - improve readability (by Karel Zak)
> 
> lib/env, ...:
>     - use getauxval(AT_SECURE) for SUID check (by Max Kellermann)
> 
> libfdisk:
>     - remove duplicate code (by Karel Zak)
>     - (dos) fix logical partition start (by Martin Jungblut Schreiner)
>     - modernize ZFS GPT type description (by Martin Minkus)
>     - (dos) fix off-by-one in maximum last sector calculation (by Karel Zak)
>     - use snprintf() instead of sprintf() (by Karel Zak)
>     - improve collision reporting (by Karel Zak)
>     - (script) improve separator usage in named-fields dump (by Karel Zak)
>     - (script) fix device name separator parsing (by Karel Zak)
>     - avoid strcasecmp() for ASCII-only strings (by Karel Zak)
> 
> lib/fileeq:
>     - Handle large files on 32 bit correctly (by Tobias Stoeckmann)
>     - Prevent OOB with short read files (by Tobias Stoeckmann)
>     - Extend debug message (by Tobias Stoeckmann)
>     - Fix formatters (by Tobias Stoeckmann)
>     - Fix typos (by Tobias Stoeckmann)
> 
> lib/fileutils:
>     - add is_dotdir_dirent() (by Karel Zak)
> 
> liblastlog2:
>     - refactor conditional assignments for better readability (by Karel Zak)
>     - fix operator precedence in conditional assignments (by Karel Zak)
>     - markup fixes for man pages (by Mario Blättermann)
>     - (test) fix memory leak in failed test [coverity scan] (by Karel Zak)
> 
> lib/loopdev:
>     - avoid null pointer dereferences [coverity] (by Karel Zak)
>     - introduce loopcxt_get_device_nr() helper (by Karel Zak)
>     - open loop control device read-only if possible (by Thomas Weißschuh)
>     - clarify comment about device and backing file modes (by Thomas Weißschuh)
>     - remove loopcxt_set_fd() (by Thomas Weißschuh)
> 
> lib, lscpu:
>     - fix const qualifier discarded warnings in bsearch (by Karel Zak)
> 
> lib/mbsalign:
>     - use snprintf() instead of sprintf() (by Karel Zak)
> 
> libmount:
>     - move fstype_to_mounttype() to include/ (by Karel Zak)
>     - add option to override fs-type with mount-type (by Karel Zak)
>     - read from udev, add --disable-libmount-udev-support (by Karel Zak)
>     - enhance readability of read_from_blkid() (by Karel Zak)
>     - refactor mnt_cache_read_tags() (by Karel Zak)
>     - refactor mnt_get_fstype() (by Karel Zak)
>     - add pidfs magic number for fstype check (by Christian Goeschel Ndjomouo)
>     - fix const qualifier warning in mnt_parse_mountinfo_line (by Karel Zak)
>     - fix const qualifier warnings for C23 (by Karel Zak)
>     - don't report fsconfig errors with "nofail" (by Karel Zak)
>     - add MOVE_MOUNT_BENEATH support (by Karel Zak)
>     - ifdef for fanotify support on older systems (by Karel Zak)
>     - (monitor) add fanotify_next_fs() (by Karel Zak)
>     - (monitor) add basic fanotify support (by Karel Zak)
>     - (monitor) rename public API to "mountinfo" (by Karel Zak)
>     - (monitor) clean up mountinfo function names (by Karel Zak)
>     - add mnt_fs_is_{moved,attached,detached} functions (by Karel Zak)
>     - (monitor)  cleanup userspace_add_watch() exiting (by Karel Zak)
>     - (monitor) check for utab delete (by Karel Zak)
>     - (monitor) optimize inotify utab watch (by Karel Zak)
>     - (monitor) cleanup op_process_event() return codes (by Karel Zak)
>     - (monitor) add next-fs API (by Karel Zak)
>     - (monitor) epoll_wait code consolidation (by Karel Zak)
>     - (monitor) require entry-specific functions (by Karel Zak)
>     - (monitor) clean up internal names (by Karel Zak)
>     - (monitor) support type-specific data (by Karel Zak)
>     - (monitor) support additional monitor identifiers (by Karel Zak)
>     - split monitor code to more files (by Karel Zak)
>     - Add support for FSCONFIG_CMD_CREATE_EXCL (by Karel Zak)
>     - don't update utab when moving /run (by Karel Zak)
>     - (verity) use messages API for important errors (by Karel Zak)
>     - (verity) use messages API for dlopen errors (by Karel Zak)
>     - (verity) fix compiler warning (by Karel Zak)
>     - (verity) fix deinitialization (by Karel Zak)
>     - add function to remove escaped chars (by Karel Zak)
>     - fix typo in comment (by Karel Zak)
>     - use and add has_listmount() (by Karel Zak)
>     - avoid calling memset() unnecessarily (by Karel Zak)
>     - clean up statmount syscall-related functions (by Karel Zak)
>     - (subdir) support detached open_tree() (>=6.15) (by Karel Zak)
>     - (subdir) restrict for real mounts only (by Karel Zak)
>     - (subdir) remove unused code (by Karel Zak)
>     - avoid strcasecmp() for ASCII-only strings (by Karel Zak)
>     - fix --no-canonicalize regression (by Karel Zak)
>     - remove possible leak in mnt_context_guess_srcpath_fstype() [coverity scan] (by Karel Zak)
>     - add support for STATMOUNT_SB_SOURCE (by Karel Zak)
> 
> Libmount:
>     - Fix removal of "owner" option when executed as root (by Karel Zak)
> 
> lib/netlink:
>     - set SOCK_CLOEXEC on netlink socket (by Karel Zak)
> 
> lib/pager:
>     - Remove unused code (by Tobias Stoeckmann)
>     - Use async-signal safe signal handler (by Tobias Stoeckmann)
>     - Handle dup errors (by Tobias Stoeckmann)
>     - Gracefully handle SIGPIPE errors (by Tobias Stoeckmann)
>     - Drop pager_redirect (by Tobias Stoeckmann)
>     - Rename caught_signal to pager_caught_signal (by Karel Zak)
>     - Use original stderr in pager_close (by Tobias Stoeckmann)
>     - Use pager_open/close for pager_redirect (by Tobias Stoeckmann)
>     - Release resources on pager_open error (by Tobias Stoeckmann)
>     - Clear potential stdout/stderr errors (by Tobias Stoeckmann)
>     - Flush outputs in pager_close (by Tobias Stoeckmann)
>     - Improve signal handling in pager_close (by Tobias Stoeckmann)
>     - Call _exit in signal handler, not raise (by Tobias Stoeckmann)
>     - Do not resolve directories with PATH (by Tobias Stoeckmann)
>     - Set SIGCHLD to default handling (by Tobias Stoeckmann)
>     - Fix typos (by Tobias Stoeckmann)
>     - Simplify wait_for_pager (by Tobias Stoeckmann)
>     - Merge wait_or_whine into wait_for_pager (by Tobias Stoeckmann)
>     - The variable need_in is always 1 (by Tobias Stoeckmann)
>     - Remove struct field `no_stdin` (by Tobias Stoeckmann)
>     - Remove struct field preexec_cb (by Tobias Stoeckmann)
>     - Remove unused define (by Tobias Stoeckmann)
>     - Remove unused struct entry `err` (by Tobias Stoeckmann)
>     - Remove unused struct field "out" (by Tobias Stoeckmann)
> 
> lib/path:
>     - add NULL checks for path in statx and access (by Karel Zak)
>     - Ensure consistent and robust path checks (by Karel Zak)
>     - add wrapers for statx(2) (by Masatake YAMATO)
>     - add __format__ attr to ul_path_v?statf() (by Masatake YAMATO)
>     - (cosmetic) delete the empty line at the EOF (by Masatake YAMATO)
>     - avoid double free() for cpusets (by Karel Zak)
> 
> lib/procfs:
>     - remove duplicate statfs_magic.h include (by Karel Zak)
> 
> lib/shells:
>     - fix indentation (by Karel Zak)
> 
> libsmartcols:
>     - support JSON Lines format output (by WanBingjiang)
>     - avoid cumulative width reduction during printing (by Alessandro Ratti)
>     - small uri and annotation cleanup (by Karel Zak)
>     - new scols_column_{refer,get}_annotation routines (by Christian Goeschel Ndjomouo)
>     - add function to set/get header colors (by Karel Zak)
>     - report cells data size on debug (by Karel Zak)
>     - add scols_filter_has_holder() (by Karel Zak)
> 
> lib/strutils:
>     - add helper function for --annotation option (by Christian Goeschel Ndjomouo)
>     - add ul_optstr_get_value() (by Karel Zak)
>     - add ul_ prefix to strrep() and strrem() functions (by Karel Zak)
>     - add ul_ prefix to split() function (by Karel Zak)
>     - add ul_ prefix to strappend() functions (by Karel Zak)
>     - add ul_ prefix to strconcat() functions (by Karel Zak)
>     - add ul_ prefix to startswith() and endswith() (by Karel Zak)
>     - call gettext() only when argument of --hyperlink is invalid (by Benno Schulenberg)
> 
> lib/strv:
>     - use ul_ prefix for strv functions (by Karel Zak)
> 
> libuuid:
>     - reset initial cont-clock time on service start (by Michael Trapp)
>     - fix timestamp overflow for pre-1970 dates (by Kiran Rangoon)
>     - refactor gregorian_to_unix to populate timeval directly (by Kiran Rangoon)
>     - simplify gregorian-to-unix offset calculation (by Kiran Rangoon)
>     - fix uuid_time on macOS without attribute((alias)) (by Eugene Gershnik)
> 
> logger:
>     - ignore libsystemd-dependent long opt in CI CHECK (by Christian Goeschel Ndjomouo)
>     - fix const qualifier warnings for C23 (by Karel Zak)
>     - fix buffer overflow when read stdin (by Karel Zak)
>     - fix incorrect warning message when both --file and a message are specified (by Alexander Kappner)
>     - drop pointless bitfields (by Karel Zak)
>     - (man) improve --prio-prefix and --stderr description (by Karel Zak)
> 
> login:
>     - improve comments for signal handling in fork_session() (by Karel Zak)
>     - Fix signal race in child handling (by Tobias Stoeckmann)
>     - use original FQDN for PAM_RHOST (by Karel Zak)
>     - only print regular files for motd (by Tobias Stoeckmann)
>     - remove signal handler before cleanup (by Tobias Stoeckmann)
>     - Add UID to usage message (by Tobias Stoeckmann)
>     - duplicate --shell argument to avoid nulling through explicit_bzero() (by Christian Goeschel Ndjomouo)
>     - document -s and --shell on the man page (by Christian Goeschel Ndjomouo)
>     - define shell to log in to with -s or --shell (by Christian Goeschel Ndjomouo)
>     - use new xgetuserpw() instead of xgetpwnam() (by Christian Goeschel Ndjomouo)
>     - add line break after timeout message (by Karel Zak)
>     - fix minor grammar mistake in the manpage (by cgoesche)
>     - (adoc) add a description about LOGIN_SHELL_FALLBACK (by WanBingjiang)
>     - using an avaiable shell while logging in. (by WanBingjiang)
>     - use logindefs_setenv_path() (by Karel Zak)
>     - protect COLORTERM and NO_COLOR env. variables (by Karel Zak)
> 
> logindefs:
>     - Add function to set PATH (by Karel Zak)
> 
> login-utils:
>     - Use _PATH macros (by Tobias Stoeckmann)
>     - Use /etc/passwd- as backup file (by Tobias Stoeckmann)
>     - add UIDs to manual pages (by Tobias Stoeckmann)
> 
> login-utils/login:
>     - Sync usage with manual page (by Tobias Stoeckmann)
> 
> login-utils, sys-utils:
>     - use _PATH_BSHELL consistently (by Alessandro Ratti)
> 
> losetup:
>     - snip --verbose from bash-completion, and 'v' from options string (by Benno Schulenberg)
>     - (man) put the synopses in a better order, the name-giver first (by Benno Schulenberg)
>     - remove the --verbose flag, as it doesn't actually do anything (by Benno Schulenberg)
>     - sort 'O' correctly for the mutual-exclusive check to work (by Benno Schulenberg)
>     - improve command line option processing (by Karel Zak)
>     - improve --remove documentation (by Karel Zak)
>     - make --remove a long-only option with mutual exclusivity (by Karel Zak)
>     - add error feedback for --remove command (by Karel Zak)
>     - Add the --remove/-R parameter to remove loop devices (by wguanghao)
>     - rename function *_delete_* to *_detach_* (by wguanghao)
> 
> losetup,lscpu:
>     - (man) add the missing -h/--help and -V/--version options (by Benno Schulenberg)
> 
> lostup:
>     - report EACCES on loop-control (by Karel Zak)
> 
> lsblk:
>     - improve error reporting for invalid device paths (by Sina Abroshan)
>     - use ul_startswith() (by codefiles)
>     - add support for LSBLK_COLUMNS environmental variable as an alternative to --output (by cgoesche)
>     - (typo) rename list_colunms() to list_columns() (by cgoesche)
>     - fix possible use-after-free (by Karel Zak)
>     - fix memory leak [coverity scan] (by Karel Zak)
>     - use md as fallback TYPE when md/level empty (by codefiles)
>     - use ID_PART_ENTRY_SCHEME as fallback for PTTYPE (by Karel Zak)
>     - (man) remove the incorrect spaces between the arguments of --ct (by Benno Schulenberg)
>     - avoid strcasecmp() for ASCII-only strings (by Karel Zak)
> 
> lsclocks:
>     - fix inconsistency in usage message (by Christian Goeschel Ndjomouo)
>     - add missing --no-discover-rtc option info in usage message (by Christian Goeschel Ndjomouo)
>     - add support for LSCLOCKS_COLUMNS environmental variable (by Christian Goeschel Ndjomouo)
>     - stop using MAX_CLOCKS (by Thomas Weißschuh)
>     - use MAX_CLOCKS, improve indention (by Karel Zak)
>     - add auxiliary clocks (by Thomas Weißschuh)
>     - (man) remove stray backslash, and correct short form of --time (by Benno Schulenberg)
>     - (man) list supported clock types (by Thomas Weißschuh)
> 
> lscpu:
>     - Implement options for dumping ARM implementer/model name tables (by Martin Storsjö)
>     - remove duplicate ARM names, clean up names (by Karel Zak)
>     - add --annotate info to man page (by Christian Goeschel Ndjomouo)
>     - add column header annotations for -C and -e (by Christian Goeschel Ndjomouo)
>     - Add a few missing Arm CPU identifiers (by Jonathan Thackray)
>     - New Arm C1 parts (by Jeremy Linton)
>     - Add NVIDIA Olympus arm64 core (by Matthew R. Ochs)
>     - (man) add description of the --list-columns option (by Christian Goeschel Ndjomouo)
>     - add MICROCODE output column (by Christian Goeschel Ndjomouo)
>     - (man) document the LSCPU_{CACHES_}COLUMNS environment variables (by Christian Goeschel Ndjomouo)
>     - add --list-columns option and declutter --help output (by Christian Goeschel Ndjomouo)
>     - add support for LSCPU_{CACHES_}COLUMNS environment variables (by Christian Goeschel Ndjomouo)
>     - add 'microcode' information to the CPU summary (by cgoesche)
>     - use maximum CPU speed from DMI, avoid duplicate version string (by Karel Zak)
>     - Fix loongarch op-mode output with recent kernel (by Xi Ruoyao)
>     - fix possible buffer overflow in cpuinfo parser (by Karel Zak)
>     - (man) don't refer to a missing section, and improve some wordings (by Benno Schulenberg)
>     - RISC-V Print ISA information in summary (by Sunil V L)
>     - New Arm part numbers (by Jeremy Linton)
> 
> lsfd:
>     - fill SOCK.NETNS column for tuntap (by Masatake YAMATO)
>     - load the information of the network namespace behind a tun device (by Masatake YAMATO)
>     - (refactor) call ioctl(TUNGETDEVNETNS) from target_fd related methods (by Masatake YAMATO)
>     - add stubs of target_fd related methods to cdev_class (by Masatake YAMATO)
>     - fill SOCK.NETNS even when sock_diag netlink can't report sockets (by Masatake YAMATO)
>     - add inspect_target_fd method to file_class (by Masatake YAMATO)
>     - (refactor) make call_with_foreign_fd reusable (by Masatake YAMATO)
>     - make pidfd for the target process available while collecting fds (by Masatake YAMATO)
>     - (comment) update the description of sock_xinfo::netns_inode (by Masatake YAMATO)
>     - (cosmetic) delete an empty line (by Masatake YAMATO)
>     - add new association "pidfs" (by Masatake YAMATO)
>     - (bugfix) do not reuse stat(2) buffer for files with identical names (by Masatake YAMATO)
>     - fix dependency on errnos.h (by Masatake YAMATO)
>     - make sure errors array is not empty [-Werror=type-limits] (by Karel Zak)
>     - (refactor) move the error object related code to a new file (by Masatake YAMATO)
>     - (refactor) remove redundant is_error member from struct file (by Masatake YAMATO)
>     - (refactor) add a helper function making error file objects (by Masatake YAMATO)
>     - remove __unused__ attr from parameters used actually (by Masatake YAMATO)
>     - (cosmetic) adjust white spaces in column definitions (by Masatake YAMATO)
>     - fill MNTID coulmn for exe, cwd, and rtd assocations (by Masatake YAMATO)
>     - fill MNTID coulmn for shm and mem assocations (by Masatake YAMATO)
>     - (refactor) add has_mnt_id helper macro (by Masatake YAMATO)
>     - fix memory leak related to stat_error_class (by Masatake YAMATO)
>     - fix const qualifier warning in strnrstr (by Karel Zak)
>     - fix const qualifier warning in new_counter_spec (by Karel Zak)
>     - add TUN.DEVNETNS column (by Masatake YAMATO)
>     - fix bsearch macro usage with glibc C23 (by Cristian Rodríguez)
>     - (doc) fix English in SOCK.NETNS description (by Masatake YAMATO)
>     - (cleanup) add missing "break" in a case statement (by Masatake YAMATO)
>     - (cleanup) return 0 instead of false (by Masatake YAMATO)
>     - (refactor) introduce tundata struct (by Masatake YAMATO)
>     - (bugfix) use PRIu32 for prining lport of netlink socket (by Masatake YAMATO)
>     - use snprintf() instead of sprintf() (by Karel Zak)
>     - refer to /proc/$pid/map_files if a mapped file is masked (by Masatake YAMATO)
>     - revise the code disabling hyperlinks (by Masatake YAMATO)
>     - decode protocol numbers of RAW and RAW6 sockets (by Masatake YAMATO)
>     - add PACKET.PROTOCOL.RAW, a new column (by Masatake YAMATO)
>     - improve grammar, and use angular brackets around placeholder word (by Benno Schulenberg)
>     - (bug fix) scan the protocol field of /proc/net/packet as a hex number (by Masatake YAMATO)
>     - fix the description for PACKET.PROTOCOL column (by Masatake YAMATO)
>     - (man) fix a typo (by Masatake YAMATO)
>     - add UNIX.IPEER column (by Masatake YAMATO)
>     - fill ENDPOINTS column for UNIX one-way sockets (by Masatake YAMATO)
>     - (refactor) add a helper function building ENDPOINTS strings for UNIX socket (by Masatake YAMATO)
>     - add a dummy entry for UNIX socket having no peer to the IPC table (by Masatake YAMATO)
>     - (man) fix a typo (by Masatake YAMATO)
>     - initialize struct stat [coverity scan] (by Karel Zak)
> 
> lsfd/mkfds-foreign-sockets:
>     - skip when lacking sock_diag ability (by Chen Qi)
> 
> lsfd,test_mkfds:
>     - make linux/vm_sockets_diag.h optional (by Masatake YAMATO)
> 
> lsipc:
>     - use snprintf() instead of sprintf() (by Karel Zak)
>     - doesn't mount /dev/mqueue (by Prasanna Paithankar)
> 
> lsirq:
>     - add support for reading data from given file (by Joe Jin)
> 
> lslocks:
>     - (bugfix) don't set rawdata in COL_PID if rawdata is null (by Masatake YAMATO)
>     - special-case PID for filtering (skip −1) (by Masatake YAMATO)
>     - make SIZE filterable by normalizing to bytes (by Masatake YAMATO)
>     - implement Q, --filter option (by Masatake YAMATO)
>     - factor out code getting and setting the data from add_scols_line (by Masatake YAMATO)
>     - (refactor) move proc_locks to struct lslocks (by Masatake YAMATO)
>     - (refactor) move pid_locks in main to struct lslocks (by Masatake YAMATO)
>     - (refactor) move "tab" file static variable to struct lslocks (by Masatake YAMATO)
>     - (refactor) add struct lslocks representing the global context (by Masatake YAMATO)
>     - (refactor) use global bytes in get_json_type_for_column() (by Masatake YAMATO)
>     - (refactor) add a helper function refining value returned from get_lock (by Masatake YAMATO)
>     - (refactor) don't use redundant callback functions (by Masatake YAMATO)
>     - (refactor) specify list_head as type instead of abusing void* (by Masatake YAMATO)
>     - (refactor) use separate function to initialize libscols_table (by Masatake YAMATO)
>     - (refactor) remove an unused local variable (by Masatake YAMATO)
>     - (refactor) use narrow variable scoping for loop counters (by Masatake YAMATO)
>     - (comment) fix grammar (by Masatake YAMATO)
>     - (man) add LSLOCKS_COLUMNS description in new ENVIRONMENT section (by Christian Goeschel Ndjomouo)
>     - add support for LSLOCKS_COLUMNS environmental variable (by Christian Goeschel Ndjomouo)
> 
> lslogins:
>     - (manpage) fix typo in option description (by Christian Goeschel Ndjomouo)
>     - ignore special long options in CI CHECK (by Christian Goeschel Ndjomouo)
>     - remove duplicate errno initialization (by Christian Goeschel Ndjomouo)
>     - fix incomplete option info in usage message (by Christian Goeschel Ndjomouo)
>     - (man) add --list-columns description (by Christian Goeschel Ndjomouo)
>     - add -H and --list-columns option; declutter --help output (by Christian Goeschel Ndjomouo)
>     - (man) add --json information (by Christian Goeschel Ndjomouo)
>     - add JSON output format mode (by Christian Goeschel Ndjomouo)
>     - fix typo (by Karel Zak)
>     - remove possible memory leaks [coverity scan] (by Karel Zak)
> 
> lsmem:
>     - fix missing zone info when memory blocks start at an index other than 0 (by Christian Goeschel Ndjomouo)
>     - use xstrncpy() (by Karel Zak)
>     - add doc for dynamic (de)configuration and memmap-on-memory support (by Sumanth Korikkar)
>     - add support to display dynamic (de)configuration of memory (by Sumanth Korikkar)
>     - display global memmap on memory parameter (by Sumanth Korikkar)
>     - add support for LSMEM_COLUMNS environmental variable (by Christian Goeschel Ndjomouo)
>     - increase the available width for the summary text labels (by Benno Schulenberg)
> 
> lsmem,chmem:
>     - add configure/deconfigure bash completion options (by Sumanth Korikkar)
> 
> lsns:
>     - make the synopsis more coherent (by Christian Goeschel Ndjomouo)
>     - fix const qualifier warnings for C23 (by Karel Zak)
>     - don't abort if /proc/self/ns/user is absent; probe other ns entries (by Masatake YAMATO)
>     - fix --list-columns option (by Christian Goeschel Ndjomouo)
>     - enhance compilation without USE_NS_GET_API (by Karel Zak)
>     - fix undefined reference to add_namespace_for_nsfd #3483 (by Thomas Devoogdt)
>     - make "-Q NETNSID ..." work even if NETNSID column is not enabled (by Masatake YAMATO)
>     - show NETNSID for namespaces with no process running (by Masatake YAMATO)
>     - (refactor) generalize the code for collecting netnsid information (by Masatake YAMATO)
> 
> man:
>     - Fixed incorrect ipcrm options (by Prasanna Paithankar)
>     - Replace RETURN VALUE with EXIT STATUS in section 1 (by Jesse Rosenstock)
> 
> man-common:
>     - rename annotation.adoc to annotate.adoc (by Christian Goeschel Ndjomouo)
> 
> man pages:
>     - consolidate libsmartcols environment variables (by Karel Zak)
> 
> meson:
>     - fix non threaded toolchains (by Rosen Penev)
>     - cleanup tests to use libcommon.la (by Karel Zak)
>     - use curses dep for ncurses (by Rosen Penev)
>     - fix a bug in posixipc_libs configuration (by Martin Valgur)
>     - use .to_string() in configuration data check (by Thomas Weißschuh)
>     - add feature for translated documentation (by Thomas Weißschuh)
>     - remove tinfo dependency from 'more' (by Thomas Weißschuh)
>     - fix manadocs for libsmartcols and libblkid (by Karel Zak)
>     - fix po-man installation (by Karel Zak)
>     - bring hexdump in line with others (by Christian Hesse)
> 
> misc:
>     - never include wchar.h (by Karel Zak)
> 
> misc-utils/lastlog2:
>     - Add option -a for listing active users only (by WanBingjiang)
> 
> mkfs.bfs:
>     - fix memory leaks and weak code (by Karel Zak)
> 
> mkfs.cramfs:
>     - avoid uninitialized value [coverity scan] (by Karel Zak)
>     - (man) mark arguments of -N and -l in bold, not italics (by Benno Schulenberg)
>     - vertically align the option descriptions of the usage text (by Benno Schulenberg)
>     - reduce the synopsis to the standard, succinct form (by Benno Schulenberg)
> 
> more:
>     - Use ul_strtou16() in a robust way (by Karel Zak)
>     - temporarily ignore stdin when waiting for stderr (by Karel Zak)
>     - Add MORE_SHELL_LINES environmental variable (by cgoesche)
>     - fix broken ':!command' command key (by cgoesche)
>     - fix implicit previous shell_line execution #3508 (by cgoesche)
>     - Add MORESECURE and PAGERSECURE environment variables #3503 (by Christian Goeschel Ndjomouo)
>     - improve help readability (by Karel Zak)
>     - fix repeat command (by Karel Zak)
>     - remove a duplicate call of setlocale() (by Benno Schulenberg)
> 
> mount:
>     - (manpage) fix minor grammar mistakes (by Christian Goeschel Ndjomouo)
>     - (man) add link to mount.ceph(8) (by Karel Zak)
>     - (man) add hint for session= on iso9660 (by Karel Zak)
>     - document --ro option on the man page (by Christian Goeschel Ndjomouo)
>     - add missing --ro option info in usage message (by Christian Goeschel Ndjomouo)
>     - add note about systemd and --all historical context (by Karel Zak)
>     - improve --all documentation regarding swap areas (by Karel Zak)
>     - add --beneath support (by Karel Zak)
>     - (bash-completion) add --exclusive (by Karel Zak)
>     - add --exclusive command line option (by Karel Zak)
>     - check for stdout for fstab reload hint (by Karel Zak)
>     - (man) add missing word (by Jakub Wilk)
>     - (man) shorten an overlong line, and improve some markup (by Benno Schulenberg)
>     - (man) fix some indentation issues, and improve a few wordings (by Benno Schulenberg)
>     - (man) add info about info messages (by Karel Zak)
> 
> mountpoint:
>     - use single libmount cache for all path resolutions (by Karel Zak)
>     - add --show option to print mountpoint path (by Karel Zak)
>     - use statmount() syscall on modern kernels (by Karel Zak)
> 
> namei:
>     - ignore SELinux-specific long option in CI CHECK (by Christian Goeschel Ndjomouo)
>     - fix const qualifier warning in readlink_to_namei (by Karel Zak)
>     - reestablish --nosymlinks option's functionality (by Christian Goeschel Ndjomouo)
> 
> namespace.h:
>     - fix compilation on Linux < 4.10 (by Thomas Devoogdt)
> 
> netaddrq:
>     - Fix crash if there are no IP addresses (by Stanislav Brabec)
> 
> netlink process_addr():
>     - Ignore UL_NL_SOFT_ERROR (by Stanislav Brabec)
> 
> newgrp:
>     - provide --command info in output message (by Christian Goeschel Ndjomouo)
> 
> nologin:
>     - ignore well-known shell command-line options in CI CHECK (by Christian Goeschel Ndjomouo)
> 
> nsenter:
>     - use USE_NAMESPACE_ID_SUPPORT macro for nsid feature (by Karel Zak)
>     - fix minor issues with namespace ID support (by Karel Zak)
>     - Support specifying namespace by ID (by Xiao Liang)
>     - (manpage) fix minor grammar mistake (by Christian Goeschel Ndjomouo)
>     - support 'PID:inode' process address format (by Christian Goeschel Ndjomouo)
>     - ignore SELinux-specific long option in CI CHECK (by Christian Goeschel Ndjomouo)
>     - (man) improve descriptions for some options (by Martin Joerg)
> 
> nsenter,unshare:
>     - (man) add the NS-related commands to SEE ALSO (by Masatake YAMATO)
> 
> pager:
>     - remove stale pager_redirect() declaration (by Karel Zak)
> 
> partx:
>     - fix const qualifier warning in get_max_partno (by Karel Zak)
>     - mark the --list option as deprecated (by Christian Goeschel Ndjomouo)
> 
> pg:
>     - Fix compiler warning (by Tobias Stoeckmann)
> 
> pidfd-utils:
>     - move USE_PIDFD_INO_SUPPORT after syscall fallbacks (by Karel Zak)
>     - define HAVE_PIDFD_* when syscall fallbacks are used (by Karel Zak)
> 
> pipesz:
>     - use snprintf() instead of sprintf() (by Karel Zak)
>     - report default size in --help, instead of referring the user (by Benno Schulenberg)
>     - (man) improve the markup and some wordings (by Benno Schulenberg)
> 
> po:
>     - merge changes (by Karel Zak)
>     - update LINGUAS list (by Karel Zak)
>     - add ar.po (from translationproject.org) (by Zayed Al-Saidi)
>     - update uk.po (from translationproject.org) (by Yuri Chornoivan)
>     - update sv.po (from translationproject.org) (by Daniel Nylander)
>     - update sr.po (from translationproject.org) (by Мирослав Николић)
>     - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
>     - update pt.po (from translationproject.org) (by Pedro Albuquerque)
>     - update pl.po (from translationproject.org) (by Jakub Bogusz)
>     - update nl.po (from translationproject.org) (by Benno Schulenberg)
>     - update ko.po (from translationproject.org) (by Seong-ho Cho)
>     - update ja.po (from translationproject.org) (by YOSHIDA Hideki)
>     - update hr.po (from translationproject.org) (by Božidar Putanec)
>     - update fr.po (from translationproject.org) (by Frédéric Marchal)
>     - update es.po (from translationproject.org) (by Antonio Ceballos Roa)
>     - update de.po (from translationproject.org) (by Christian Kirbach)
>     - update cs.po (from translationproject.org) (by Petr Písař)
>     - update uk.po (from translationproject.org) (by Yuri Chornoivan)
>     - update sr.po (from translationproject.org) (by Мирослав Николић)
>     - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
>     - update pt.po (from translationproject.org) (by Pedro Albuquerque)
>     - update pl.po (from translationproject.org) (by Jakub Bogusz)
>     - update nl.po (from translationproject.org) (by Benno Schulenberg)
>     - update ja.po (from translationproject.org) (by YOSHIDA Hideki)
>     - update hr.po (from translationproject.org) (by Božidar Putanec)
>     - update fr.po (from translationproject.org) (by Frédéric Marchal)
>     - update es.po (from translationproject.org) (by Antonio Ceballos Roa)
>     - update de.po (from translationproject.org) (by Mario Blättermann)
>     - update cs.po (from translationproject.org) (by Petr Písař)
>     - update uk.po (from translationproject.org) (by Yuri Chornoivan)
>     - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
>     - update pl.po (from translationproject.org) (by Jakub Bogusz)
>     - update nl.po (from translationproject.org) (by Benno Schulenberg)
>     - update ko.po (from translationproject.org) (by Seong-ho Cho)
>     - update hr.po (from translationproject.org) (by Božidar Putanec)
>     - update fr.po (from translationproject.org) (by Frédéric Marchal)
>     - update es.po (from translationproject.org) (by Antonio Ceballos Roa)
>     - merge changes (by Karel Zak)
>     - update hr.po (from translationproject.org) (by Božidar Putanec)
>     - upadte LINGUAS file (by Karel Zak)
> 
> po-man:
>     - merge changes (by Karel Zak)
>     - merge changes (by Karel Zak)
>     - add sv.po (from translationproject.org) (by Daniel Nylander)
>     - add ar.po (from translationproject.org) (by Zayed Al-Saidi)
>     - update uk.po (from translationproject.org) (by Yuri Chornoivan)
>     - update sr.po (from translationproject.org) (by Мирослав Николић)
>     - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
>     - update pl.po (from translationproject.org) (by Michał Kułach)
>     - update es.po (from translationproject.org) (by Antonio Ceballos Roa)
>     - update de.po (from translationproject.org) (by Mario Blättermann)
>     - merge changes (by Karel Zak)
>     - update sr.po (from translationproject.org) (by Мирослав Николић)
>     - update de.po (from translationproject.org) (by Mario Blättermann)
>     - add hyperlink.adoc to po4a.cfg (by Karel Zak)
>     - merge changes (by Karel Zak)
>     - add pl.po (from translationproject.org) (by Michał Kułach)
>     - update uk.po (from translationproject.org) (by Yuri Chornoivan)
>     - update ro.po (from translationproject.org) (by Remus-Gabriel Chelu)
>     - update fr.po (from translationproject.org) (by Frédéric Marchal)
>     - fix typos in configuration (by Karel Zak)
> 
> prlimit:
>     - raise a nicer error message when modifying NOFILE (by Karel Zak)
> 
> procfs:
>     - use F_TYPE_EQUAL() macro for statfs.f_type comparison (by cgoesche)
>     - add a helper function to access /proc/$pid/personality (by Masatake YAMATO)
> 
> pwdutils:
>     - fix grammar in comments (by Tobias Stoeckmann)
> 
> readprofile:
>     - (manpage) add --no-auto option description (by Christian Goeschel Ndjomouo)
>     - fix memory leak related to boot_uname_r_str() in usage() (by Christian Goeschel Ndjomouo)
>     - (manpage) fix incorrect file name in --mapfile description (by Christian Goeschel Ndjomouo)
> 
> rename:
>     - change "expression" to "substring" (by Haelwenn (lanodan) Monnier)
> 
> renice:
>     - (man) reword several things, to be clearer, and improve some markup (by Benno Schulenberg)
>     - in usage text, condense the oververbose description of option -n (by Benno Schulenberg)
> 
> rev:
>     - add --zero option to --help output (by Christian Goeschel Ndjomouo)
> 
> rfkill:
>     - Output in JSON format if -J is provided. (by Xing Guo)
> 
> rtcwake:
>     - (man) reduce an inflated table to sane proportions (by Benno Schulenberg)
> 
> script:
>     - (man,usage) correct the markup of the synopsis (by Benno Schulenberg)
>     - support non-option argument as command (by WanBingjiang)
> 
> scriptlive:
>     - (manpage) add --command option description (by Christian Goeschel Ndjomouo)
>     - improve some descriptions, markup, and grammar in the manpage (by Benno Schulenberg)
>     - reduce two usage synopses to one simple one (by Benno Schulenberg)
> 
> scriptreplay:
>     - mark literal values in the man page in bold, not italic (by Benno Schulenberg)
>     - reduce two usage synopses to one, and drop the -t from it (by Benno Schulenberg)
>     - make Up/Down keys use a percentage instead of fixed amount (by Benno Schulenberg)
>     - indicate that <divisor> is conditional on <typescript> (by Benno Schulenberg)
> 
> setarch:
>     - (man) correct the markup of the synopsis and of two options (by Benno Schulenberg)
>     - use strtopid_or_err() (by Karel Zak)
>     - add -p/--pid option showing the personality of specified process (by Masatake YAMATO)
> 
> setpriv:
>     - use AppArmor LSM-specific proc interface (by Karel Zak)
>     - (man) Fix grammar (by Tobias Stoeckmann)
>     - (man) fix typo (by Jakub Wilk)
>     - (manpage) fix typo in option description (by Christian Goeschel Ndjomouo)
>     - fix usage message inconsistency (by Christian Goeschel Ndjomouo)
>     - improve landlock usage() output (by Karel Zak)
>     - Add support for LANDLOCK_ACCESS_FS_IOCTL_DEV (by Günther Noack)
>     - Improve getgroups() Portability (by Karel Zak)
>     - protect COLORTERM and NO_COLOR env. variables (by Karel Zak)
>     - follow /etc/login.defs for PATH (by Karel Zak)
> 
> setpwnam:
>     - use getline instead of fgets (by Tobias Stoeckmann)
>     - only unlock when actually locked (by Tobias Stoeckmann)
>     - check if /etc/passwd was fully read (by Tobias Stoeckmann)
> 
> sfdisk:
>     - (manpage) fix option description inconsistencies (by Christian Goeschel Ndjomouo)
>     - (man) do not use the common 'include' for --help and --version (by Benno Schulenberg)
>     - reject spurious arguments for --reorder/--backup-pt-sectors (by Thomas Weißschuh)
> 
> sfdisk.8.adoc:
>     - Replace --help and --version with external entity (by Mario Blättermann)
> 
> shells.c:
>     - call setusershell before getusershell (by WanBingjiang)
> 
> strutils:
>     - move an error message to where it is used, and improve it (by Benno Schulenberg)
> 
> strutils.c:
>     - ignore escape characters while parsing options. (by WanBingjiang)
> 
> style:
>     - convert tabs to spaces in meson.build (by zhanghongyuan)
>     - adapt function definitions to kernel style (by Christian Goeschel Ndjomouo)
>     - fix coding style issues (by Christian Goeschel Ndjomouo)
> 
> su:
>     - accept group name and GID in -g and -G options (by Christian Goeschel Ndjomouo)
>     - pass arguments after <user> to shell (by cgoesche)
>     - use logindefs_setenv_path() (by Karel Zak)
>     - protect COLORTERM and NO_COLOR env. variables (by Karel Zak)
>     - (man) fix duplicate asterisk (by Gaël PORTAY)
> 
> su-common:
>     - ignore runuser(1) specific long option in CI CHECK (by Christian Goeschel Ndjomouo)
> 
> swapoff:
>     - check  blkid_probe_lookup_value() return code [coverity scan] (by Karel Zak)
>     - add comments for do_swapoff (by zt20xx)
>     - clean up tag resolution (by Karel Zak)
> 
> swapon:
>     - (man page) use "defaults" (plural) (by Chris Hofstaedtler)
>     - use ANNOTATE_OPTION as enum name for --annotate (by Christian Goeschel Ndjomouo)
>     - rename the new --annotation option to --annotate (by Benno Schulenberg)
>     - (usage) make the help text fit within 80 columns again (by Benno Schulenberg)
>     - document --annotation option on the man page (by Christian Goeschel Ndjomouo)
>     - control column header tooltips with --annotation (by Christian Goeschel Ndjomouo)
>     - annotate column header names with OSC8 hyperlinks (by Christian Goeschel Ndjomouo)
>     - (man page) add details about fstab configuration (by Karel Zak)
>     - improve a translator hint, and remove a pointless one (by Benno Schulenberg)
>     - remove unnecessary variable usage (by Karel Zak)
>     - make options --help and --version override --summary (by Benno Schulenberg)
> 
> sys-utils/chmem:
>     - fix typo. (by WanBingjiang)
> 
> sys-utils/lscpu:
>     - Change object type to SCOLS_JSON_STRING if data == "-" (by WanBingjiang)
> 
> taskset:
>     - Accept 0 pid for current process (by Jesse Rosenstock)
> 
> terminal-colors.d:
>     - (man) reduce two tables to succinct lists (by Benno Schulenberg)
>     - support NO_COLOR (by Karel Zak)
> 
> test_mkfds:
>     - disable ppoll multiplexer if sigset_t is not defined (by Masatake YAMATO)
>     - remove local pidfd_open() fallback (by Karel Zak)
> 
> tests:
>     - (lsfd::*) revise the way to use "$?" (by Masatake YAMATO)
>     - (lsns::*) revise the way to use "$?" (by Masatake YAMATO)
>     - add tests for column --table-header-as-columns (by Karel Zak)
>     - (test_mkfds:netns) conditionally report EPERM when ioctl(SIOCGSKNS) fails (by Masatake YAMATO)
>     - (test_mkfd::tcp-bare) new factory creating an unbound/unconnected TCP socket (by Masatake YAMATO)
>     - search for all executable scripts in test subdirs (by Christian Goeschel Ndjomouo)
>     - (waitpid) add tests for the pidfd inode format support (by Christian Goeschel Ndjomouo)
>     - (waitpid) move waitpid tests to a dedicated subdir (by Christian Goeschel Ndjomouo)
>     - (waitpid) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - use long options globally in test scripts (by Christian Goeschel Ndjomouo)
>     - (setarch) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (script) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (rev) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (rename) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (mount) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (more) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (lsns) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (lsmem) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (lscpu) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (lsclocks) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (losetup) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (logger) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (ipcs) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (ionice) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (hexdump) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (getopt) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (findmnt) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (fdisk) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (fallocate) use long options to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (enosys) use long options instead, to improve test coverage report (by Christian Goeschel Ndjomouo)
>     - (chfn) test all long options (by Christian Goeschel Ndjomouo)
>     - (cal) use more long options to improve test coverage accuracy (by Christian Goeschel Ndjomouo)
>     - (blkid) use more long options to improve test coverage accuracy (by Christian Goeschel Ndjomouo)
>     - (blkdiscard) use long options to improve test coverage accuracy (by Christian Goeschel Ndjomouo)
>     - (column) add more tests (by Christian Goeschel Ndjomouo)
>     - (chrt) fix various shellcheck warnings (by Christian Goeschel Ndjomouo)
>     - (flock) fix shellcheck warning (by Christian Goeschel Ndjomouo)
>     - (uuidd) fix various shellcheck warnings (by Christian Goeschel Ndjomouo)
>     - move schedutils tool test scripts to dedicated subdirs (by Christian Goeschel Ndjomouo)
>     - move uuid* tool test scripts to dedicated subdirectories (by Christian Goeschel Ndjomouo)
>     - move test scripts from tests/ts/misc to dedicated subdir (by Christian Goeschel Ndjomouo)
>     - (chfn) ensure that invalid input is detected correctly (by Christian Goeschel Ndjomouo)
>     - add a helper command, test_open_twice (by Masatake YAMATO)
>     - simplify TS_DESC in fdisk/mbr-logical-ebr-gap (by Karel Zak)
>     - (fdisk) make sure test_strerror avalable (by Karel Zak)
>     - add tests for unshare --forward-signals (by Kiran Rangoon)
>     - (lsfd::column-mntid) add a new case (by Masatake YAMATO)
>     - (test_mkfds::mmap) add "shared" paramter (by Masatake YAMATO)
>     - (refactor) add ts_skip_config, a new helper function (by Masatake YAMATO)
>     - (lsfd::mkfds-mmap-maksed-file) revise the description (by Masatake YAMATO)
>     - add getino tests (by Christian Goeschel Ndjomouo)
>     - add regression test for repeated termreduce printing (by Alessandro Ratti)
>     - add libsmartcols termreduce regression helper (by Alessandro Ratti)
>     - fdisk add regression test for missing EBR gap between logical partitions (by Martin Jungblut Schreiner)
>     - correct UUID timestamp test expectations (by Kiran Rangoon)
>     - (lslocks) test -Q,--filter option (by Masatake YAMATO)
>     - (test_mkfds::nop) new factory just printing pid (by Masatake YAMATO)
>     - convert fallocate to use subtests (by Karel Zak)
>     - (su) test GID argument in --group option (by Christian Goeschel Ndjomouo)
>     - (lsfd::mkfds-cdev-tun,refactor) make the case extensible (by Masatake YAMATO)
>     - (swaplabel) don't create test image with truncate(1) (by Thomas Weißschuh)
>     - update cal color outputs (by Karel Zak)
>     - update lsmem outputs (by Karel Zak)
>     - (su) add more options tests (by cgoesche)
>     - optstr test redundant commas (by Cole Robinson)
>     - (configs) add sorting and masking test (by Karel Zak)
>     - (configs) check for scandirat() (by Karel Zak)
>     - (configs) add file listings to expected output (by Karel Zak)
>     - add regression tests for ul_configs_file_list() (by Karel Zak)
>     - (libmount) improve explicit loop read-write mount check (by Christian Goeschel Ndjomouo)
>     - (lslogins) test --json output mode (by Christian Goeschel Ndjomouo)
>     - (lsfd/mkfds-unix-dgram) skip if the unix diag netlink interface is not available (by Masatake YAMATO)
>     - (lsfd-functions.sh) make lsfd_check_sockdiag usable in subtests (by Masatake YAMATO)
>     - (lsfd/mkfds-unix-stream-requiring-sockdiag) revise the test description (by Masatake YAMATO)
>     - (lsfd/column-source-btrfs) extract a minor number in a more reliable way (by Masatake YAMATO)
>     - (lsmem) update expected/lscpu/* with 'ZONES' column (by Christian Goeschel Ndjomouo)
>     - add canonicalize test (by Karel Zak)
>     - add color names test (by Karel Zak)
>     - update expected type to 'ntfs3' (by Johannes Schneider)
>     - add chrt SCHED_EXT test (by Shashank Balaji)
>     - update coresched tests (by Karel Zak)
>     - mark lsns/filer as TS_KNOWN_FAIL (by Karel Zak)
>     - (test_mkfds::mapped-packet-socket) add a new parameter, protocol (by Masatake YAMATO)
>     - (lscpu) update RISC-V tests to add ISA line (by Karel Zak)
>     - (lsfd::mkfds-unix-dgram, refactor) split the test into subtests (by Masatake YAMATO)
>     - add ts_is_in_docker as a helper function (by Masatake YAMATO)
>     - (lsns) verify NETNSID column for namespaces with no process running (by Masatake YAMATO)
>     - update lsmem outputs (by Karel Zak)
>     - (lsns/nsfs) consider the cases that lsns returns multiple paths (by Masatake YAMATO)
>     - (lsns/nsfs) check test_sysinfo helper (by Masatake YAMATO)
>     - improve test_sysinfo to check for NS_GET_NSTYPE usability (by Karel Zak)
>     - check for ns-get*-ok (by Karel Zak)
>     - (flock::range-lock) add a case testing --start/--length (by Masatake YAMATO)
> 
> tests/helpers/test_sigstate.c:
>     - explicitly reset SIGINT to default action after trapping (by Hongxu Jia)
> 
> tests/ts/kill/decode:
>     - avoid using shell built-in kill command (by Chen Qi)
> 
> test_sysinfo:
>     - remove memory lea [coverity scan] (by Karel Zak)
> 
> textual:
>     - rename list_colunms() to list_columns() and remove trailing whitespaces (by Christian Goeschel Ndjomouo)
>     - harmonize the messages for invalid count and timeout values (by Benno Schulenberg)
>     - harmonize the messages for an invalid size, length, and offset (by Benno Schulenberg)
>     - harmonize the wording of the error message for an invalid PID (by Benno Schulenberg)
>     - fix a mistruncated message, and fix a typo (by Benno Schulenberg)
> 
> tools:
>     - git-version-bump, accept X.Y-devel version on master branch (by Karel Zak)
>     - (get-options.sh) refine regex for unsupported programs to avoid false positives (by Christian Goeschel Ndjomouo)
>     - expand relative paths provided by $top_srcdir for robustness (by Christian Goeschel Ndjomouo)
>     - helper script to generate a test coverage report (by Christian Goeschel Ndjomouo)
>     - (get-options.sh) ensure functionality for out-of-tree builds (by Christian Goeschel Ndjomouo)
>     - verify the consistency of manpages for all programs (by Christian Goeschel Ndjomouo)
>     - (get-options.sh) skip programs that do not use <struct option> (by Christian Goeschel Ndjomouo)
>     - (get-options.sh) ignore long opt definitions marked with IGNORECHECK=yes (by Christian Goeschel Ndjomouo)
>     - (checkusage.sh) verify the completeness of listed long options (by Christian Goeschel Ndjomouo)
>     - (checkcompletion.sh) test the integrity of long options completion (by Christian Goeschel Ndjomouo)
>     - new helper for extraction of program long options from source files (by cgoesche)
>     - rewrite checkcompletion.sh to be source-based (by Karel Zak)
>     - improve git-version-bump with validation and help (by Karel Zak)
>     - improve git-version-next to always output version variables (by Karel Zak)
>     - add git-version-next script release versioning (by Karel Zak)
>     - add checktarball-meson.sh (by Karel Zak)
>     - add SPDX-License-Identifier (by Karel Zak)
>     - improve in-repo check (by Karel Zak)
> 
> tools/checkconfig:
>     - strip C comments before macro extraction (by Karel Zak)
> 
> tools/git-grouped-log:
>     - sort output (by Karel Zak)
>     - add script to generated git log (by Karel Zak)
> 
> tools/git-tp-sync:
>     - fix po/ update (by Karel Zak)
>     - update also po-man (by Karel Zak)
>     - fix checkout -f use (by Karel Zak)
>     - require git (by Karel Zak)
>     - merge changes to PO files (by Karel Zak)
>     - support multiple directories (by Karel Zak)
>     - reuse git ls-files calls (by Karel Zak)
>     - add --dry-run and --help (by Karel Zak)
>     - Compare Revisions (by Karel Zak)
> 
> tools/git-tp-sync-man:
>     - remove obsolete script (by Karel Zak)
> 
> tools/git-version-bump:
>     - add script to update hardcoded versions (by Karel Zak)
> 
> tools/git-version-gen:
>     - accept -start in version (as -rc) (by Karel Zak)
> 
> tools/poman-translate:
>     - fix to work outside on source dir (by Karel Zak)
> 
> treewide:
>     - consistently use tabs for indentation where it is the rule (by Benno Schulenberg)
>     - use is_dotdir_dirent() helper (by Karel Zak)
>     - consolidate --list-columns option in usage() to USAGE_LIST_COLUMNS_OPTION() (by Christian Goeschel Ndjomouo)
>     - replace postal address in license specifier with a terse URL (by Benno Schulenberg)
>     - improve getauxval(AT_SECURE) usage (by Karel Zak)
>     - add ul_ to parse_timestamp() function name (by Karel Zak)
>     - add ul_ to parse_switch() function name (by Karel Zak)
>     - add ul_ to parse_size() function name (by Karel Zak)
>     - add ul_  to parse_range() function name (by Karel Zak)
>     - fix optional arguments usage (by Karel Zak)
>     - use strtopid_or_err() (by Masatake YAMATO)
>     - avoid strcasecmp() for ASCII-only strings (by Karel Zak)
> 
> ts/kill/decode:
>     - compare decoded output in an architecture-independent way (by Masatake YAMATO)
>     - check the availability of "sed" (by Masatake YAMATO)
>     - consider arch dependent signum/name association (by Masatake YAMATO)
>     - use RTMIN from 'kill -L' instead of hardcoding 34 (by Chen Qi)
> 
> tunelp:
>     - remove extraneous -T option (by Christian Goeschel Ndjomouo)
> 
> uclampset:
>     - simplify the synopsis in the --help usage text (by Benno Schulenberg)
> 
> ul_nl_addr_dup():
>     - Fix address comparison (by Stanislav Brabec)
> 
> umount:
>     - consider helper return status for success message (by Christian Goeschel Ndjomouo)
> 
> unshare:
>     - document --forward-signals in man page (by Kiran Rangoon)
>     - implement signal forwarding when --forward-signals is used (by Kiran Rangoon)
>     - add --forward-signals option to argument parser (by Kiran Rangoon)
>     - (man) fix grammar (by Tobias Stoeckmann)
>     - fix inconsistency in usage message (by Christian Goeschel Ndjomouo)
>     - fix user namespace bind mounts (by Chris Webb)
>     - remove get_mnt_ino() check in bind_ns_files_from_child() (by Chris Webb)
>     - add --owner to set user namespace owner uid and gid (by Chris Webb)
>     - use MAX_OF_UINT_TYPE instead of (type)-1 (by Christian Goeschel Ndjomouo)
>     - use the new ul_get{grp,userpw}_str() routines (by Christian Goeschel Ndjomouo)
>     - make the wording of a message identical to that of three others (by Benno Schulenberg)
>     - fix typo in --map-groups=subids map name [coverity scan] (by Karel Zak)
>     - make strings more robust (by Karel Zak)
> 
> uuidd:
>     - use locked system user account if available (by Tobias Stoeckmann)
>     - put an option and its description in a single message (by Benno Schulenberg)
> 
> uuidgen.1.adoc:
>     - remove superfluous 'plus' (by Daniel Lublin)
> 
> various:
>     - (man) list --help and --version last among the options (by Benno Schulenberg)
> 
> waitpid:
>     - (manpage) document the support for the "PID:inode" addressing format (by Christian Goeschel Ndjomouo)
>     - close fd after removal from epoll interest list (by Christian Goeschel Ndjomouo)
>     - support 'PID:inode' process addressing format (by Christian Goeschel Ndjomouo)
>     - refactor to improve maintainability (by Christian Goeschel Ndjomouo)
> 
> wdctl:
>     - remove -d option leftover (by Munehisa Kamata)
> 
> whereis:
>     - fix const qualifier warnings for C23 (by Karel Zak)
> 
> Wipefs:
>     - improve --all descriptions for whole-disks (by Karel Zak)
> 
> zramctl:
>     - (manpage) add --bytes option description (by Christian Goeschel Ndjomouo)
>     - Add note about column descriptions (by Karel Zak)
>     - ignore ENOENT when setting max_comp_streams (by Jiang XueQian)
>     - fix MEM-USED column description (by Jérôme Poulin)
>     - (man) mention the required arguments for -p and -r (by Benno Schulenberg)
>     - restore normal description indentations in the usage text (by Benno Schulenberg)
>     - wait for device being initialized and unlocked by udevd (by Yu Watanabe)
> 
> Misc:
>     - Fix formatting in getino.1.adoc (by Mario Blättermann)
>     - avoid repetitive code (by Arvin Schnell)
>     - always use array with name in json output (by Arvin Schnell)
>     - updated test case (by Arvin Schnell)
>     - include device in json output and use json array when needed (by Arvin Schnell)
>     - Fix various typos and markup in man pages (by Mario Blättermann)
>     - Fix typo in flock.1.adoc (by Mario Blättermann)
>     - Fix typos (by Tobias Stoeckmann)
>     - runuser (by su: elaborate man page regarding TIOCSTI/TIOCLINUX ioctl command injection|finefoot)
>     - Add man page section to (sys)calls (by Dick Marinus)
>     - Fix typos in comments (by Tobias Stoeckmann)
>     - Fix gettext macro calls (by Tobias Stoeckmann)
>     - Add fuse.kio-fuse to list of pseudo file systems (by Oliver Schramm)
>     - Fix memory leak in setpwnam() (by yao zhang)
>     - Fix typos when "set up" is used as a verb (by Louis Sautier)
>     - Fix the issue of fd resource leakage (by Leefancy)
>     - Fix memory leak issue in read_Subid_range() (by fortunate-lee)
>     - update .gitignore (by Karel Zak)
>     - parsing /run/issue.d/* too (by Stefan Schubert)
>     - New netlink library (by Stanislav Brabec)
>     - Using fix issue dir path "/usr/lib" for agetty (by Stefan Schubert)
>     - Fix another issue in login.1.adoc (by Mario Blättermann)
>     - Fix markup in pam_lastlog2.8.adoc (by Mario Blättermann)
>     - Fix markup in column.1.adoc (by Mario Blättermann)
>     - Fix markup in mount.8.adoc (by Mario Blättermann)
>     - Fix typo and markup in getopt.1.adoc (by Mario Blättermann)
>     - Fix markup in lsfd.1.adoc (by Mario Blättermann)
>     - Fix markup, grammar and spelling in scols-filter.5.adoc (by Mario Blättermann)
>     - Fix login.1.adoc (by Mario Blättermann)
>     - Fix markup in pam_lastlog2.8.adoc (by Mario Blättermann)
>     - Fix markup in ll2_import_lastlog.3.adoc (by Mario Blättermann)
>     - Fix markup in more.1.adoc (by Mario Blättermann)
>     - Fix markup in column.1.adoc (by Mario Blättermann)
>     - Fix markup in mesg.1.adoc (by Mario Blättermann)
>     - Fix markup in unshare.1.adoc (by Mario Blättermann)
>     - Fix markup in swapon.8.adoc (by Mario Blättermann)
>     - Fix typos and markup in setpriv.1.adoc (by Mario Blättermann)
>     - Fix markup in lsirq.1.adoc (by Mario Blättermann)
>     - Fix markup in flock.1.adoc (by Mario Blättermann)
>     - Fix markup in chmem.8.adoc (by Mario Blättermann)
>     - Fix markup in lastlog2.8.adoc (by Mario Blättermann)
>     - Fix markup in findmnt.8.adoc (by Mario Blättermann)
>     - Fix markup in su.1.adoc (by Mario Blättermann)
>     - Fix markup in login.1.adoc (by Mario Blättermann)
>     - Fix markup in scols-filter.5.adoc (by Mario Blättermann)
>     - Add reflink support for ZFS. (by Chester Gregg)
>     - Add missing ;; to -m case (#1) (by Nate Drake)
>     - Make scols_column_set_data_func docs visible (by FeRD (Frank Dana))
>     - correct the full name of the GPL in various files (by Benno Schulenberg)
>     - remove "Copyright (C) ...." notes from files that claim no copyright (by Benno Schulenberg)
>     - remove two leftover license lines from colors.{c,h} (by Benno Schulenberg)
>     - add option to force cachestat() usage (by Matteo Croce)
>     - Update bufflen (by Mohamed Maatallah)
>     - fix sectors typos (by formtapez)
>     - Update setpwnam.c (by Mohamed Maatallah)
>     - Do not call exit() on code ending in shared libraries (by Cristian Rodríguez)
>     - fix and add parse_switch() test (by Karel Zak)
>     - Do not use strerror on shared libraries (by Cristian Rodríguez)
>     - Use the 'fallthrough' attribute (by Matteo Croce)
>     - move XXH_FALLTHROUGH into a generic include file (by Matteo Croce)
>     - Fix XXH_HAS_C_ATTRIBUTE check (by easyaspi314 (Devin))
>     - Fix typo in blkdiscard docs (by pls-no-hack)
>     - sys-utils/flock.c Fix a typo in flock.c (by Masanari Iida)
>     - lib/fileeq.c Fix a typo in message. (by Masanari Iida)
>     - Use ipc_stat::cgid for the column COL_CGID. (by Koutheir Attouchi)
>     - use ul_default_shell() for interactive shell spawning (by Alessandro Ratti)
> 
> 
> 

-- 
Samuel
> 	dvips -o $@ $<     
Faut faire gffe de pas te couper avec ton truc, t'as mis des ciseaux ($<)
partout :))
-+- Dom in Guide du linuxien pervers - "J'aime pas les Makefile !" -+-

[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 3410 bytes --]

Index: util-linux-2.42-rc1/lib/Makemodule.am
===================================================================
--- util-linux-2.42-rc1.orig/lib/Makemodule.am
+++ util-linux-2.42-rc1/lib/Makemodule.am
@@ -31,14 +31,13 @@ libcommon_la_SOURCES = \
 	lib/mbsalign.c \
 	lib/mbsedit.c\
 	lib/md5.c \
-	lib/netaddrq.c \
-	lib/netlink.c \
 	lib/pidutils.c \
 	lib/pidfd-utils.c \
 	lib/pwdutils.c \
 	lib/randutils.c \
 	lib/sha1.c \
 	lib/sha256.c \
+	lib/shells.c \
 	lib/signames.c \
 	lib/strutils.c \
 	lib/strv.c \
@@ -50,7 +49,8 @@ libcommon_la_SOURCES = \
 if LINUX
 libcommon_la_SOURCES += \
 	lib/linux_version.c \
-	lib/shells.c \
+	lib/netaddrq.c \
+	lib/netlink.c \
 	lib/loopdev.c
 endif
 
Index: util-linux-2.42-rc1/libblkid/src/cache.c
===================================================================
--- util-linux-2.42-rc1.orig/libblkid/src/cache.c
+++ util-linux-2.42-rc1/libblkid/src/cache.c
@@ -188,12 +188,14 @@ void blkid_gc_cache(blkid_cache cache)
 			DBG(CACHE, ul_debugobj(cache, "freeing non-existing %s", dev->bid_name));
 			blkid_free_dev(dev);
 			cache->bic_flags |= BLKID_BIC_FL_CHANGED;
+#ifdef __linux__
 		} else if (is_loopdev(dev->bid_name)
 					&& !loopdev_has_backing_file(dev->bid_name)) {
 			/* remove empty loop device from cache */
 			DBG(CACHE, ul_debugobj(cache, "freeing empty loop device %s", dev->bid_name));
 			blkid_free_dev(dev);
 			cache->bic_flags |= BLKID_BIC_FL_CHANGED;
+#endif
 		} else {
 			DBG(CACHE, ul_debug("Device %s exists", dev->bid_name));
 		}
Index: util-linux-2.42-rc1/term-utils/agetty.c
===================================================================
--- util-linux-2.42-rc1.orig/term-utils/agetty.c
+++ util-linux-2.42-rc1/term-utils/agetty.c
@@ -365,7 +365,9 @@ int main(int argc, char **argv)
 	};
 	struct issue issue = {
 		.mem = NULL,
+#ifdef AGETTY_RELOAD
 		.nl.fd = -1
+#endif
 	};
 	char *login_argv[LOGIN_ARGV_MAX + 1];
 	int login_argc = 0;
@@ -1639,10 +1641,12 @@ static int wait_for_term_input(struct is
 			FD_SET(inotify_fd, &rfds);
 			nfds = max(nfds, inotify_fd);
 		}
+#ifdef AGETTY_RELOAD
 		if (ie->nl.fd >= 0) {
 			FD_SET(ie->nl.fd, &rfds);
 			nfds = max(nfds, ie->nl.fd);
 		}
+#endif
 
 		/* If waiting fails, just fall through, presumably reading input will fail */
 		if (select(nfds + 1, &rfds, NULL, NULL, NULL) < 0)
@@ -1653,6 +1657,7 @@ static int wait_for_term_input(struct is
 
 		}
 
+#ifdef AGETTY_RELOAD
 		if (ie->nl.fd >= 0 && FD_ISSET(ie->nl.fd, &rfds)) {
 			int rc;
 
@@ -1670,6 +1675,7 @@ static int wait_for_term_input(struct is
 		} else if (inotify_fd >= 0 && FD_ISSET(inotify_fd, &rfds)) {
 			while (read(inotify_fd, buffer, sizeof (buffer)) > 0);
 		}
+#endif
 
 		return 0;
 	}
@@ -1976,7 +1982,12 @@ done:
  */
 static void show_issue(struct options *op)
 {
-	struct issue ie = { .output = NULL, .nl.fd = -1 };
+	struct issue ie = {
+		.output = NULL,
+#ifdef AGETTY_RELOAD
+		.nl.fd = -1
+#endif
+	};
 	struct termios tp;
 
 	memset(&tp, 0, sizeof(struct termios));
@@ -2589,6 +2600,7 @@ static void log_warn(const char *fmt, ..
 	va_end(ap);
 }
 
+#ifdef AGETTY_RELOAD
 static void print_iface_best(struct issue *ie,
 			     const char *ifname,
 			     uint8_t ifa_family)
@@ -2754,6 +2766,7 @@ static void dump_iface_all(struct issue
 	if (!first)
 		fputs("\n", ie->output);
 }
+#endif
 
 /*
  * parses \x{argument}, if not argument specified then returns NULL, the @fd

^ permalink raw reply

* [PATCH] findfs: (man) improve the markup, the layout, and the wording
From: Benno Schulenberg @ 2026-02-28 11:52 UTC (permalink / raw)
  To: util-linux

Mark NAME as a placeholder instead of a literal, and rename it to
TAGNAME to make it clearer what "tag" in the description refers to.

Indent the list of possible tags, to make it clearer where the
description continues.

Drop the angle brackets around placeholders -- those are used
in --help output, but in man pages it is just italics.

Also add a missing section header.

Signed-off-by: Benno Schulenberg <bensberg@telfort.nl>
---
 misc-utils/findfs.8.adoc | 36 ++++++++++++++++++++++--------------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/misc-utils/findfs.8.adoc b/misc-utils/findfs.8.adoc
index 8783cdc25..02d08f953 100644
--- a/misc-utils/findfs.8.adoc
+++ b/misc-utils/findfs.8.adoc
@@ -16,36 +16,44 @@ findfs - find a filesystem by label or UUID
 
 == SYNOPSIS
 
-*findfs* *NAME*=_value_
+*findfs* _TAGNAME_**=**_value_
 
 == DESCRIPTION
 
-*findfs* will search the block devices in the system looking for a filesystem or partition with specified tag. The currently supported tags are:
+*findfs* will search the block devices in the system for a filesystem or partition
+with the specified tag. The currently supported tags are:
 
-*LABEL*=_<label>_::
-Specifies filesystem label.
+____
+**LABEL=**_label_::
+Specifies a filesystem label.
 
-*UUID*=_<uuid>_::
-Specifies filesystem UUID.
+**UUID=**_uuid_::
+Specifies a filesystem UUID.
 
-*PARTUUID*=_<uuid>_::
-Specifies partition UUID. This partition identifier is supported for example for GUID Partition Table (GPT) partition tables.
+**PARTUUID=**_uuid_::
+Specifies a partition UUID. Partition identifiers are supported for example for GUID Partition Table (GPT) partition tables.
 
-*PARTLABEL*=_<label>_::
-Specifies partition label (name). The partition labels are supported for example for GUID Partition Table (GPT) or MAC partition tables.
+**PARTLABEL=**_label_::
+Specifies a partition label (name). Partition labels are supported for example for GPT and MAC partition tables.
+____
 
-If the filesystem or partition is found, the device name will be printed on stdout. If the input is not in the format of NAME=value, then the input will be copied to the output without any modification.
+If the filesystem or partition is found, the device name will be printed on stdout.
+If the input is not in the format of _TAGNAME_**=**_value_, then the input will be
+copied to the output without any modification.
 
-The complete overview about filesystems and partitions you can get for example by
+You can get a complete overview about the filesystems and partitions in the system
+with one of the following commands:
 
 ____
 *lsblk --fs*
 
-*partx --show <disk>*
+*partx --show* _disk_
 
 *blkid*
 ____
 
+== OPTIONS
+
 include::man-common/help-version.adoc[]
 
 == EXIT STATUS
@@ -53,7 +61,7 @@ include::man-common/help-version.adoc[]
 *0*::
 success
 *1*::
-label or uuid cannot be found
+label or UUID cannot be found
 *2*::
 usage error, wrong number of arguments or unknown option
 
-- 
2.53.0


^ permalink raw reply related

* Re: [PATCH] findfs: (man) improve the markup, the layout, and the wording
From: Nuno Silva @ 2026-02-28 13:03 UTC (permalink / raw)
  To: util-linux; +Cc: bensberg
In-Reply-To: <20260228115245.9553-1-bensberg@telfort.nl>

On 2026-02-28, Benno Schulenberg wrote:

> Mark NAME as a placeholder instead of a literal, and rename it to
> TAGNAME to make it clearer what "tag" in the description refers to.
>
> Indent the list of possible tags, to make it clearer where the
> description continues.
>
> Drop the angle brackets around placeholders -- those are used
> in --help output, but in man pages it is just italics.

My apologies if I'm missing some convention from util-linux itself, but:
from a quick check, it looks to me that italics is used for such
placeholders in IEEE 1003.1. Any chance this is or was a de facto
standard to denote placeholders? Or something done this way for
consistency (not that I've done a survey of how common this is)?

(Also see "Utility Operand" and "Utility Option with Option-Argument" in
the table at [1], at the end.)

[1] https://pubs.opengroup.org/onlinepubs/9799919799/frontmatter/typographics.html

> Also add a missing section header.
>
> Signed-off-by: Benno Schulenberg <bensberg@telfort.nl>
[...]

(diff snipped as what's above is IMHO sufficient context for my reply)
-- 
Nuno Silva


^ permalink raw reply

* Re: [ANNOUNCE] util-linux v2.42-rc1
From: Chris Hofstaedtler @ 2026-03-01  8:40 UTC (permalink / raw)
  To: Sumanth Korikkar, debian-loongarch
  Cc: linux-kernel, linux-fsdevel, util-linux, Karel Zak
In-Reply-To: <wid276gkq7tblvkfwc6kum4nacamstiigqjj5ux6j6zd4blz4l@jzq3sgfh6cj5>

Hi Sumanth, looong64 porters,

* Karel Zak <kzak@redhat.com> [260226 14:53]:
>The util-linux release v2.42-rc1 is now available at
>  http://www.kernel.org/pub/linux/utils/util-linux/v2.42/
[..]
>lsmem:
>    - display global memmap on memory parameter (by Sumanth Korikkar)

It appears the test for this is run on looong64 and fails there (failing the
entire build), at least in the Debian build infra.
https://buildd.debian.org/status/fetch.php?pkg=util-linux&arch=loong64&ver=2.42%7Erc1-1&stamp=1772312955&raw=0

See below for log output excerpts.

Thanks,
Chris


log snippets:

================= O/E diff ===================
--- /build/reproducible-path/util-linux-2.42~rc1/tests/output/lsmem/lsmem-s390-zvm-6g	2026-02-28 21:08:31.577617951 +0000
+++ /build/reproducible-path/util-linux-2.42~rc1/tests/expected/lsmem/lsmem-s390-zvm-6g	2026-02-18 11:33:47.804188659 +0000
@@ -17,6 +17,7 @@
  Memory block size:                256M
  Total online memory:              4.8G
  Total offline memory:             1.3G
+Memmap on memory parameter:         no
  
  ---
  
@@ -27,6 +28,7 @@
  Memory block size:                256M
  Total online memory:              4.8G
  Total offline memory:             1.3G
+Memmap on memory parameter:         no
  
  ---
  
@@ -40,6 +42,7 @@
  Memory block size:                256M
  Total online memory:              4.8G
  Total offline memory:             1.3G
+Memmap on memory parameter:         no
  
  ---
  
@@ -73,6 +76,7 @@
  Memory block size:                256M
  Total online memory:              4.8G
  Total offline memory:             1.3G
+Memmap on memory parameter:         no
  
  ---
  
@@ -216,6 +220,7 @@
  Memory block size:                256M
  Total online memory:              4.8G
  Total offline memory:             1.3G
+Memmap on memory parameter:         no
  
  ---
  
@@ -237,6 +242,7 @@
  Memory block size:                256M
  Total online memory:              4.8G
  Total offline memory:             1.3G
+Memmap on memory parameter:         no
  
  ---
  
@@ -256,3 +262,4 @@
  Memory block size:                256M
  Total online memory:              4.8G
  Total offline memory:             1.3G
+Memmap on memory parameter:         no
==============================================

...

--- /build/reproducible-path/util-linux-2.42~rc1/tests/expected/lsmem/lsmem-x86_64-16g	2026-02-18 11:33:47.804978102 +0000
+++ /build/reproducible-path/util-linux-2.42~rc1/tests/output/lsmem/lsmem-x86_64-16g	2026-02-28 21:08:31.887234145 +0000
@@ -37,7 +37,6 @@
  Memory block size:                128M
  Total online memory:               16G
  Total offline memory:               0B
-Memmap on memory parameter:         no
  
  ---
  
@@ -49,7 +48,6 @@
  Memory block size:                128M
  Total online memory:               16G
  Total offline memory:               0B
-Memmap on memory parameter:         no
  
  ---
  
@@ -61,7 +59,6 @@
  Memory block size:                128M
  Total online memory:               16G
  Total offline memory:               0B
-Memmap on memory parameter:         no
  
  ---
  
@@ -199,7 +196,6 @@
  Memory block size:                128M
  Total online memory:               16G
  Total offline memory:               0B
-Memmap on memory parameter:         no
  
  ---
  
@@ -523,7 +519,6 @@
  Memory block size:                128M
  Total online memory:               16G
  Total offline memory:               0B
-Memmap on memory parameter:         no
  
  ---
  
@@ -563,7 +558,6 @@
  Memory block size:                128M
  Total online memory:               16G
  Total offline memory:               0B
-Memmap on memory parameter:         no
  
  ---
  
@@ -603,4 +597,3 @@
  Memory block size:                128M
  Total online memory:               16G
  Total offline memory:               0B
-Memmap on memory parameter:         no
}}}-diff

  FAILED (lsmem/lsmem-x86_64-16g)
========= script: /build/reproducible-path/util-linux-2.42~rc1/tests/ts/lsmem/lsmem =================


^ permalink raw reply

* Re: [PATCH] findfs: (man) improve the markup, the layout, and the wording
From: Benno Schulenberg @ 2026-03-01 11:25 UTC (permalink / raw)
  To: util-linux; +Cc: Nuno Silva
In-Reply-To: <10nup2p$o2$1@ciao.gmane.io>


[-- Attachment #1.1: Type: text/plain, Size: 654 bytes --]


Op 28-02-2026 om 14:03 schreef Nuno Silva:
> On 2026-02-28, Benno Schulenberg wrote:
>> Drop the angle brackets around placeholders -- those are used
>> in --help output, but in man pages it is just italics.
> 
> My apologies if I'm missing some convention from util-linux itself,

Have a look at some other util-linux man pages.  They all use just
italics for placeholders (normally displayed as underline).

> from a quick check, it looks to me that italics is used for such
> placeholders in IEEE 1003.1.

And italics is exactly what this patch uses for placeholders.  (Not
angle brackets -- those are for --help texts.)


Benno


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 840 bytes --]

^ permalink raw reply

* Re: [PATCH] findfs: (man) improve the markup, the layout, and the wording
From: Nuno Silva @ 2026-03-01 11:56 UTC (permalink / raw)
  To: Benno Schulenberg, util-linux
In-Reply-To: <1922449f-ac4f-4362-92ed-0176243e11ac@telfort.nl>

On 01/03/26 11:25, Benno Schulenberg wrote:
> 
> Op 28-02-2026 om 14:03 schreef Nuno Silva:
>> On 2026-02-28, Benno Schulenberg wrote:
>>> Drop the angle brackets around placeholders -- those are used
>>> in --help output, but in man pages it is just italics.
>>
>> My apologies if I'm missing some convention from util-linux itself,
> 
> Have a look at some other util-linux man pages.  They all use just
> italics for placeholders (normally displayed as underline).
> 
>> from a quick check, it looks to me that italics is used for such
>> placeholders in IEEE 1003.1.
> 
> And italics is exactly what this patch uses for placeholders.  (Not
> angle brackets -- those are for --help texts.)

Oh, sorry - I now realize I misunderstood the original e-mail. It is 
embarassing; I should have double-checked things, namely the syntax 
(which I overlooked in part because I *still* need to configure Gnus - 
where I usually read this list - not to eat some of the characters when 
applying formatting...).

That'd have probably made the meaning obvious. Instead, not being 
acquainted with the syntax, I wrongly intepreted the commit message as 
you meaning angle brackets would be removed because they mean/generate 
italic.


-- 
Apologies again,
Nuno Silva


^ permalink raw reply

* [PATCH] terminal-colors.d: (man) do not show 'type' as an optional part
From: Benno Schulenberg @ 2026-03-01 16:45 UTC (permalink / raw)
  To: util-linux

That is: remove the square brackets from around 'type' in the synopsis.

Also, do not give the impression that a leading dot by itself is fine
before the 'type'.  That is: a dot is required only when 'name' and/or
'@term' is present.

Also, do not colorize the square brackets as if they were part of the
placeholders.  (And use ++double plus++ passthroughs for the opening
square brackets, to prevent asciidoctor from misinterpreting them.)

Indent the list of file types, for clarity.

And correct or improve some wordings, and remove an inconvenient
blank line in an example.

Signed-off-by: Benno Schulenberg <bensberg@telfort.nl>
---
 lib/terminal-colors.d.5.adoc | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)

diff --git a/lib/terminal-colors.d.5.adoc b/lib/terminal-colors.d.5.adoc
index 40ed8b966..9704fe413 100644
--- a/lib/terminal-colors.d.5.adoc
+++ b/lib/terminal-colors.d.5.adoc
@@ -21,7 +21,7 @@ terminal-colors.d - configure output colorization for various utilities
 
 == SYNOPSIS
 
-/etc/terminal-colors.d/_[[name][@term].][type]_
+*/etc/terminal-colors.d/*++[++_name_**.**|++[++_name_]**@**_term_**.**]_type_
 
 == DESCRIPTION
 
@@ -32,14 +32,14 @@ The _name_ is a utility name. The name is optional and when none is specified th
 The _term_ is a terminal identifier (the *TERM* environment variable). The terminal identifier is optional and when none is specified then the file is used for all unspecified terminals.
 
 The _type_ is a file type. Supported file types are:
-
+____
 *disable*::
 Turns off output colorization for all compatible utilities. See also the NO_COLOR environment variable below.
 *enable*::
 Turns on output colorization; any matching *disable* files are ignored.
-
 *scheme*::
 Specifies colors used for output. The file format may be specific to the utility, the default format is described below.
+____
 
 If there are more files that match for a utility, then the file with the more specific filename wins. For example, the filename "@xterm.scheme" has less priority than "dmesg@xterm.scheme". The lowest priority are those files without a utility name and terminal identifier (e.g., "disable").
 
@@ -56,15 +56,15 @@ The _name_ is a logical name for the color sequence (for example: *error*).
 The names are specific to the utilities. For more details always see
 the *COLORS* section in the man page for the utility.
 
-The _color-sequence_ is a color name, ASCII color sequences, or escape sequences.
+The _color-sequence_ can be a color name, an ANSI color sequence, or an escape sequence.
 
 === Color names
 
-black, blink, blue, bold, brown, cyan, darkgray, gray, green, halfbright, lightblue, lightcyan, lightgray, lightgreen, lightmagenta, lightred, magenta, red, reset, reverse, and yellow.
+Valid color names are: black, blink, blue, bold, brown, cyan, darkgray, gray, green, halfbright, lightblue, lightcyan, lightgray, lightgreen, lightmagenta, lightred, magenta, red, reset, reverse, and yellow.
 
 === ANSI color sequences
 
-The color sequences are composed of sequences of numbers separated by semicolons. The most common codes are:
+An ANSI color sequence is composed of sequences of numbers separated by semicolons. The most common codes are:
 ____
      0   to restore default color
      1   for brighter colors
@@ -94,7 +94,7 @@ For example, to use a red background for alert messages in the output of *dmesg*
 
 === Escape sequences
 
-An escape sequence is necessary to enter a space, backslash, caret, or any
+An escape sequence is needed to enter a space, backslash, caret, or any
 control character anywhere in a string, as well as a hash mark as the first
 character. These C-style backslash-escapes can be used:
 
@@ -137,31 +137,27 @@ _$HOME/.config/terminal-colors.d_
 
 _/etc/terminal-colors.d_
 
-== EXAMPLE
+== EXAMPLES
 
 Disable colors for all compatible utilities:
-
 ____
 *touch /etc/terminal-colors.d/disable*
 ____
 
 Disable colors for all compatible utils on a vt100 terminal:
-
 ____
 *touch /etc/terminal-colors.d/@vt100.disable*
 ____
 
 Disable colors for all compatible utils except *dmesg*(1):
-
 ____
-*touch /etc/terminal-colors.d/disable*
-
+*touch /etc/terminal-colors.d/disable* +
 *touch /etc/terminal-colors.d/dmesg.enable*
 ____
 
 == COMPATIBILITY
 
-The *terminal-colors.d* functionality is currently supported by all util-linux utilities which provides colorized output. For more details always see the *COLORS* section in the man page for the utility.
+The *terminal-colors.d* functionality is currently supported by all util-linux utilities which provide colorized output. For more details always see the *COLORS* section in the man page for the utility.
 
 include::man-common/bugreports.adoc[]
 
-- 
2.53.0


^ permalink raw reply related

* Re: [ANNOUNCE] util-linux v2.42-rc1
From: Sumanth Korikkar @ 2026-03-02  9:16 UTC (permalink / raw)
  To: Chris Hofstaedtler
  Cc: debian-loongarch, linux-kernel, linux-fsdevel, util-linux,
	Karel Zak
In-Reply-To: <aaP6atFYpVqulTO1@zeha.at>

Hi Chris,

> Hi Sumanth, looong64 porters,
> 
> * Karel Zak <kzak@redhat.com> [260226 14:53]:
> > The util-linux release v2.42-rc1 is now available at
> >  http://www.kernel.org/pub/linux/utils/util-linux/v2.42/
> [..]
> > lsmem:
> >    - display global memmap on memory parameter (by Sumanth Korikkar)
> 
> It appears the test for this is run on looong64 and fails there (failing the
> entire build), at least in the Debian build infra.
> https://buildd.debian.org/status/fetch.php?pkg=util-linux&arch=loong64&ver=2.42%7Erc1-1&stamp=1772312955&raw=0
> 
> See below for log output excerpts.
> 
> Thanks,
> Chris
> 
> 
> log snippets:
> 
> ================= O/E diff ===================
> --- /build/reproducible-path/util-linux-2.42~rc1/tests/output/lsmem/lsmem-s390-zvm-6g	2026-02-28 21:08:31.577617951 +0000
> +++ /build/reproducible-path/util-linux-2.42~rc1/tests/expected/lsmem/lsmem-s390-zvm-6g	2026-02-18 11:33:47.804188659 +0000
> @@ -17,6 +17,7 @@
>  Memory block size:                256M
>  Total online memory:              4.8G
>  Total offline memory:             1.3G
> +Memmap on memory parameter:         no

The ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE feature is currently not enabled on
loong64.

The lsmem tool displays the setting found in
/sys/module/memory_hotplug/parameters/memmap_on_memory.  If this path
does not exist, lsmem will not show the parameter. As a result, the test
fails.

To resolve this, the test should first verify whether the file
/sys/module/memory_hotplug/parameters/memmap_on_memory exists. If it is
missing, the test should skip the output related to the "Memmap
on memory parameter". I will check how the test logic can be updated and
give it a try.

Thanks & Regards,
Sumanth


^ permalink raw reply

* Re: [ANNOUNCE] util-linux v2.42-rc1
From: Sumanth Korikkar @ 2026-03-02 15:59 UTC (permalink / raw)
  To: Chris Hofstaedtler
  Cc: debian-loongarch, linux-kernel, linux-fsdevel, util-linux,
	Karel Zak
In-Reply-To: <aaVVg4PhVKkdL2C5@li-2b55cdcc-350b-11b2-a85c-a78bff51fc11.ibm.com>

On Mon, Mar 02, 2026 at 10:16:53AM +0100, Sumanth Korikkar wrote:
> Hi Chris,
> 
> > Hi Sumanth, looong64 porters,
> > 
> > * Karel Zak <kzak@redhat.com> [260226 14:53]:
> > > The util-linux release v2.42-rc1 is now available at
> > >  http://www.kernel.org/pub/linux/utils/util-linux/v2.42/
> > [..]
> > > lsmem:
> > >    - display global memmap on memory parameter (by Sumanth Korikkar)
> > 
> > It appears the test for this is run on looong64 and fails there (failing the
> > entire build), at least in the Debian build infra.
> > https://buildd.debian.org/status/fetch.php?pkg=util-linux&arch=loong64&ver=2.42%7Erc1-1&stamp=1772312955&raw=0
> > 
> > See below for log output excerpts.
> > 
> > Thanks,
> > Chris
> > 
> > 
> > log snippets:
> > 
> > ================= O/E diff ===================
> > --- /build/reproducible-path/util-linux-2.42~rc1/tests/output/lsmem/lsmem-s390-zvm-6g	2026-02-28 21:08:31.577617951 +0000
> > +++ /build/reproducible-path/util-linux-2.42~rc1/tests/expected/lsmem/lsmem-s390-zvm-6g	2026-02-18 11:33:47.804188659 +0000
> > @@ -17,6 +17,7 @@
> >  Memory block size:                256M
> >  Total online memory:              4.8G
> >  Total offline memory:             1.3G
> > +Memmap on memory parameter:         no
> 
> The ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE feature is currently not enabled on
> loong64.
> 
> The lsmem tool displays the setting found in
> /sys/module/memory_hotplug/parameters/memmap_on_memory.  If this path
> does not exist, lsmem will not show the parameter. As a result, the test
> fails.
> 
> To resolve this, the test should first verify whether the file
> /sys/module/memory_hotplug/parameters/memmap_on_memory exists. If it is
> missing, the test should skip the output related to the "Memmap
> on memory parameter". I will check how the test logic can be updated and
> give it a try.

Hi Chris,

Could you please try the following?

Thanks

From e47cae41f00bdcc3663088b1324a89b67ee9c5df Mon Sep 17 00:00:00 2001
From: Sumanth Korikkar <sumanthk@linux.ibm.com>
Date: Mon, 2 Mar 2026 16:52:46 +0100
Subject: [PATCH] lsmem: correct memmap-on-memory test output

* The "Memmap on memory parameter" line may show "yes", "no",
  or may not appear at all if the feature is not supported.
  Because this changes between systems, stop checking this line
  in the tests.

* When --sysroot is used, do not read /sys/firmware/memory
  (used on s390). This makes sure lsmem reads only the memory
  directories inside the given sysroot, so the directory list
  is correct.

Signed-off-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
---
 sys-utils/lsmem.c                      | 2 +-
 tests/expected/lsmem/lsmem-s390-zvm-6g | 7 -------
 tests/expected/lsmem/lsmem-x86_64-16g  | 7 -------
 tests/ts/lsmem/lsmem                   | 2 ++
 4 files changed, 3 insertions(+), 15 deletions(-)

diff --git a/sys-utils/lsmem.c b/sys-utils/lsmem.c
index c68f2317c..65b141c51 100644
--- a/sys-utils/lsmem.c
+++ b/sys-utils/lsmem.c
@@ -806,7 +806,7 @@ int main(int argc, char **argv)
 		err(EXIT_FAILURE, _("failed to initialize %s handler"), _PATH_SYS_MEMORY);
 	lsmem->sysmemconfig = ul_new_path(_PATH_SYS_MEMCONFIG);
 	/* Always check for the existence of /sys/firmware/memory/memory0 first */
-	if (ul_path_access(lsmem->sysmemconfig, F_OK, "memory0") == 0)
+	if (!prefix && ul_path_access(lsmem->sysmemconfig, F_OK, "memory0") == 0)
 		lsmem->have_memconfig = 1;
 	if (!lsmem->sysmemconfig)
 		err(EXIT_FAILURE, _("failed to initialized %s handler"), _PATH_SYS_MEMCONFIG);
diff --git a/tests/expected/lsmem/lsmem-s390-zvm-6g b/tests/expected/lsmem/lsmem-s390-zvm-6g
index fe3892f6e..40dcfe982 100644
--- a/tests/expected/lsmem/lsmem-s390-zvm-6g
+++ b/tests/expected/lsmem/lsmem-s390-zvm-6g
@@ -17,7 +17,6 @@ RANGE                                  SIZE   STATE REMOVABLE BLOCK
 Memory block size:                256M
 Total online memory:              4.8G
 Total offline memory:             1.3G
-Memmap on memory parameter:         no
 
 ---
 
@@ -28,7 +27,6 @@ RANGE                                 SIZE
 Memory block size:                256M
 Total online memory:              4.8G
 Total offline memory:             1.3G
-Memmap on memory parameter:         no
 
 ---
 
@@ -42,7 +40,6 @@ RANGE                                  SIZE   STATE
 Memory block size:                256M
 Total online memory:              4.8G
 Total offline memory:             1.3G
-Memmap on memory parameter:         no
 
 ---
 
@@ -76,7 +73,6 @@ RANGE                                  SIZE   STATE REMOVABLE BLOCK NODE
 Memory block size:                256M
 Total online memory:              4.8G
 Total offline memory:             1.3G
-Memmap on memory parameter:         no
 
 ---
 
@@ -220,7 +216,6 @@ RANGE                                  SIZE   STATE REMOVABLE BLOCK          ZON
 Memory block size:                256M
 Total online memory:              4.8G
 Total offline memory:             1.3G
-Memmap on memory parameter:         no
 
 ---
 
@@ -242,7 +237,6 @@ RANGE                                  SIZE   STATE REMOVABLE BLOCK NODE
 Memory block size:                256M
 Total online memory:              4.8G
 Total offline memory:             1.3G
-Memmap on memory parameter:         no
 
 ---
 
@@ -262,4 +256,3 @@ RANGE                                  SIZE   STATE REMOVABLE BLOCK
 Memory block size:                256M
 Total online memory:              4.8G
 Total offline memory:             1.3G
-Memmap on memory parameter:         no
diff --git a/tests/expected/lsmem/lsmem-x86_64-16g b/tests/expected/lsmem/lsmem-x86_64-16g
index d3232470c..52975be9b 100644
--- a/tests/expected/lsmem/lsmem-x86_64-16g
+++ b/tests/expected/lsmem/lsmem-x86_64-16g
@@ -37,7 +37,6 @@ RANGE                                  SIZE  STATE REMOVABLE   BLOCK
 Memory block size:                128M
 Total online memory:               16G
 Total offline memory:               0B
-Memmap on memory parameter:         no
 
 ---
 
@@ -49,7 +48,6 @@ RANGE                                 SIZE
 Memory block size:                128M
 Total online memory:               16G
 Total offline memory:               0B
-Memmap on memory parameter:         no
 
 ---
 
@@ -61,7 +59,6 @@ RANGE                                 SIZE  STATE
 Memory block size:                128M
 Total online memory:               16G
 Total offline memory:               0B
-Memmap on memory parameter:         no
 
 ---
 
@@ -199,7 +196,6 @@ RANGE                                  SIZE  STATE REMOVABLE BLOCK NODE  ZONES
 Memory block size:                128M
 Total online memory:               16G
 Total offline memory:               0B
-Memmap on memory parameter:         no
 
 ---
 
@@ -523,7 +519,6 @@ RANGE                                  SIZE  STATE REMOVABLE   BLOCK  ZONES
 Memory block size:                128M
 Total online memory:               16G
 Total offline memory:               0B
-Memmap on memory parameter:         no
 
 ---
 
@@ -563,7 +558,6 @@ RANGE                                  SIZE  STATE REMOVABLE   BLOCK NODE  ZONES
 Memory block size:                128M
 Total online memory:               16G
 Total offline memory:               0B
-Memmap on memory parameter:         no
 
 ---
 
@@ -603,4 +597,3 @@ RANGE                                  SIZE  STATE REMOVABLE   BLOCK
 Memory block size:                128M
 Total online memory:               16G
 Total offline memory:               0B
-Memmap on memory parameter:         no
diff --git a/tests/ts/lsmem/lsmem b/tests/ts/lsmem/lsmem
index 179f0ef15..057a30fd5 100755
--- a/tests/ts/lsmem/lsmem
+++ b/tests/ts/lsmem/lsmem
@@ -34,6 +34,8 @@ function do_lsmem {
         echo "\$ lsmem $opts" >>${TS_OUTPUT}
         ${TS_CMD_LSMEM} $opts --sysroot "${dumpdir}/${name}" >> $TS_OUTPUT 2>> $TS_ERRLOG
 
+	sed -i '/^Memmap on memory parameter:/d' ${TS_OUTPUT}
+
 }
 
 for dump in $(ls $TS_SELF/dumps/*.tar.bz2 | sort); do
-- 
2.53.0


^ permalink raw reply related

* [PATCH] pam_lastlog2: add -lpam to Makemodule.am
From: Morgan @ 2026-03-02 19:08 UTC (permalink / raw)
  To: util-linux

From c8e620c6bcd044786c59f822810fc973090dbfa2 Mon Sep 17 00:00:00 2001
From: Morgan Jones <me@numin.it>
Date: Mon, 2 Mar 2026 11:03:39 -0800
Subject: [PATCH] pam_lastlog2: add -lpam to Makemodule.am

If we don't add this, we don't actually link with PAM; compare the
before and after of `lib/security/pam_lastlog2.so`.

```
Dynamic section at offset 0x2ce8 contains 31 entries:
 Tag        Type                         Name/Value
0x0000000000000001 (NEEDED)             Shared library: [liblastlog2.so.2]
0x0000000000000001 (NEEDED)             Shared library: [libsqlite3.so]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x000000000000000e (SONAME)             Library soname: [pam_lastlog2.so]
```

```
Dynamic section at offset 0x2cd8 contains 32 entries:
 Tag        Type                         Name/Value
0x0000000000000001 (NEEDED)             Shared library: [libpam.so.0]
0x0000000000000001 (NEEDED)             Shared library: [liblastlog2.so.2]
0x0000000000000001 (NEEDED)             Shared library: [libsqlite3.so]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x000000000000000e (SONAME)             Library soname: [pam_lastlog2.so]
```

This causes issues like https://github.com/NixOS/nixpkgs/issues/493934
where the library has trouble linking with PAM symbols because it is not
linked.

Signed-off-by: Morgan Jones <me@numin.it>
---
pam_lastlog2/src/Makemodule.am | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pam_lastlog2/src/Makemodule.am b/pam_lastlog2/src/Makemodule.am
index 40d597c58..629930853 100644
--- a/pam_lastlog2/src/Makemodule.am
+++ b/pam_lastlog2/src/Makemodule.am
@@ -13,7 +13,7 @@ pam_lastlog2_la_CFLAGS = \

pam_lastlog2_la_LIBADD = liblastlog2.la

-pam_lastlog2_la_LDFLAGS = $(SOLIB_LDFLAGS) -module -avoid-version -shared
+pam_lastlog2_la_LDFLAGS = $(SOLIB_LDFLAGS) -lpam -module -avoid-version -shared
if HAVE_VSCRIPT
pam_lastlog2_la_LDFLAGS +=
$(VSCRIPT_LDFLAGS),$(top_srcdir)/pam_lastlog2/src/pam_lastlog2.sym
endif
--
2.50.1

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox