summaryrefslogtreecommitdiffstats
path: root/debian/patches/upstream
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/upstream')
-rw-r--r--debian/patches/upstream/Fix-misplaced-else-in-mnt_update_already_done.patch28
-rw-r--r--debian/patches/upstream/agetty-Don-t-override-TERM-passed-by-the-user.patch31
-rw-r--r--debian/patches/upstream/findmnt-always-zero-terminate-SOURCES-data.patch46
-rw-r--r--debian/patches/upstream/findmnt-revise-the-code-for-I-and-D-option.patch160
-rw-r--r--debian/patches/upstream/libblkid-Fix-segfault-when-blkid.conf-doesn-t-exist.patch75
-rw-r--r--debian/patches/upstream/libblkid-topology-ioctl-correctly-handle-kernel-types.patch89
-rw-r--r--debian/patches/upstream/libblkid-topology-ioctl-simplify-ioctl-handling.patch117
-rw-r--r--debian/patches/upstream/libmount-Fix-access-check-for-utab-in-context.patch39
-rw-r--r--debian/patches/upstream/libmount-fix-comment-typo-for-mnt_fs_get_comment.patch23
-rw-r--r--debian/patches/upstream/libsmartcols-reset-wrap-after-calculation.patch88
-rw-r--r--debian/patches/upstream/lsblk-simplify-SOURCES-code.patch61
-rw-r--r--debian/patches/upstream/lslocks-don-t-abort-gathering-per-process-information-eve.patch77
-rw-r--r--debian/patches/upstream/lslocks-remove-a-unused-local-variable.patch37
-rw-r--r--debian/patches/upstream/lsns-fix-netns-use.patch33
-rw-r--r--debian/patches/upstream/lsns-report-with-warnx-if-a-namespace-related-ioctl-fails.patch27
-rw-r--r--debian/patches/upstream/lsns-tolerate-lsns_ioctl-fd-NS_GET_-PARENT-USERNS-failing.patch49
-rw-r--r--debian/patches/upstream/pam_lastlog2-link-against-liblastlog.patch32
17 files changed, 1012 insertions, 0 deletions
diff --git a/debian/patches/upstream/Fix-misplaced-else-in-mnt_update_already_done.patch b/debian/patches/upstream/Fix-misplaced-else-in-mnt_update_already_done.patch
new file mode 100644
index 0000000..eca8867
--- /dev/null
+++ b/debian/patches/upstream/Fix-misplaced-else-in-mnt_update_already_done.patch
@@ -0,0 +1,28 @@
+From: Gavin Lloyd <gavinhungry@gmail.com>
+Date: Tue, 9 Apr 2024 17:38:02 -0700
+Subject: Fix misplaced else in mnt_update_already_done
+
+See 477401f0de
+
+(cherry picked from commit 6b316e0c9f1feb61bef3bb14b1356be8fbefcc17)
+---
+ libmount/src/tab_update.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/libmount/src/tab_update.c b/libmount/src/tab_update.c
+index 87512af..d44d190 100644
+--- a/libmount/src/tab_update.c
++++ b/libmount/src/tab_update.c
+@@ -982,9 +982,9 @@ int mnt_update_already_done(struct libmnt_update *upd)
+ if (mnt_optstr_get_missing(fs->user_optstr, upd->fs->user_optstr, NULL) == 0) {
+ upd->missing_options = 1;
+ DBG(UPDATE, ul_debugobj(upd, " missing options detected"));
+- }
+- } else
+- rc = 1;
++ } else
++ rc = 1;
++ }
+
+ } else if (upd->target) {
+ /* umount */
diff --git a/debian/patches/upstream/agetty-Don-t-override-TERM-passed-by-the-user.patch b/debian/patches/upstream/agetty-Don-t-override-TERM-passed-by-the-user.patch
new file mode 100644
index 0000000..11df871
--- /dev/null
+++ b/debian/patches/upstream/agetty-Don-t-override-TERM-passed-by-the-user.patch
@@ -0,0 +1,31 @@
+From: Daan De Meyer <daan.j.demeyer@gmail.com>
+Date: Fri, 19 Apr 2024 20:07:47 +0200
+Subject: agetty: Don't override TERM passed by the user
+
+Before 4869b259d68f65ea88df625ce8df9c0177d55a01, any TERM passed
+on the agetty command line would be used instead of the default TERM.
+After 4869b259d68f65ea88df625ce8df9c0177d55a01, the default TERM is
+used unconditionally.
+
+Fix the regression by checking if the user passed a custom TERM.
+
+Fixes: 4869b259d68f65ea88df625ce8df9c0177d55a01
+(cherry picked from commit af354e92111769d57e43eb4f1825c0d99c894ddb)
+---
+ term-utils/agetty.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/term-utils/agetty.c b/term-utils/agetty.c
+index 0fc6f15..0b9eb8b 100644
+--- a/term-utils/agetty.c
++++ b/term-utils/agetty.c
+@@ -1196,7 +1196,8 @@ static void open_tty(const char *tty, struct termios *tp, struct options *op)
+ #endif
+ }
+
+- op->term = get_terminal_default_type(op->tty, !(op->flags & F_VCONSOLE));
++ if (!op->term)
++ op->term = get_terminal_default_type(op->tty, !(op->flags & F_VCONSOLE));
+ if (!op->term)
+ log_err(_("failed to allocate memory: %m"));
+
diff --git a/debian/patches/upstream/findmnt-always-zero-terminate-SOURCES-data.patch b/debian/patches/upstream/findmnt-always-zero-terminate-SOURCES-data.patch
new file mode 100644
index 0000000..b173277
--- /dev/null
+++ b/debian/patches/upstream/findmnt-always-zero-terminate-SOURCES-data.patch
@@ -0,0 +1,46 @@
+From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= <thomas@t-8ch.de>
+Date: Sun, 21 Apr 2024 20:00:31 +0200
+Subject: findmnt: always zero-terminate SOURCES data
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+libsmartcols expects it's data fields to be zero terminated.
+See the call to strlen() in scols_column_greatest_wrap().
+ul_buffer however does not guarantee that termination,
+ul_buffer_append_strings() discard the zero-termination.
+
+Always zero-terminate in get_data_col_sources() and drop the now
+unnecessary variable "i".
+
+Closes: https://github.com/util-linux/util-linux/issues/2980
+Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
+(cherry picked from commit 6594679e9af805075c282da35b1b2a8d767e403b)
+---
+ misc-utils/findmnt.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c
+index 2e4d59e..f40b137 100644
+--- a/misc-utils/findmnt.c
++++ b/misc-utils/findmnt.c
+@@ -552,7 +552,6 @@ static char *get_vfs_attr(struct libmnt_fs *fs, int sizetype)
+ static char *get_data_col_sources(struct libmnt_fs *fs, int evaluate, size_t *datasiz)
+ {
+ const char *tag = NULL, *p = NULL;
+- int i = 0;
+ const char *device = NULL;
+ char *val = NULL;
+ blkid_dev_iterate iter;
+@@ -602,10 +601,8 @@ static char *get_data_col_sources(struct libmnt_fs *fs, int evaluate, size_t *da
+ dev = blkid_verify(blk_cache, dev);
+ if (!dev)
+ continue;
+- if (i != 0)
+- ul_buffer_append_data(&buf, "\0", 1);
+ ul_buffer_append_string(&buf, blkid_dev_devname(dev));
+- i++;
++ ul_buffer_append_data(&buf, "\0", 1);
+ }
+ blkid_dev_iterate_end(iter);
+ free(val);
diff --git a/debian/patches/upstream/findmnt-revise-the-code-for-I-and-D-option.patch b/debian/patches/upstream/findmnt-revise-the-code-for-I-and-D-option.patch
new file mode 100644
index 0000000..7ec4aaf
--- /dev/null
+++ b/debian/patches/upstream/findmnt-revise-the-code-for-I-and-D-option.patch
@@ -0,0 +1,160 @@
+From: Masatake YAMATO <yamato@redhat.com>
+Date: Fri, 5 Apr 2024 22:40:36 +0900
+Subject: findmnt: revise the code for -I and -D option
+
+Fixes #2913.
+
+3dd79293b5b655da9d913dedd8facb08959a7826 added -I option.
+However, the code used bit flags (FL_DF and FL_DF_INODES) wrongly;
+the code broke the output of -D option.
+
+Signed-off-by: Masatake YAMATO <yamato@redhat.com>
+(cherry picked from commit aa0c45e8686df509c169121473d2cfb4fe18c3ea)
+---
+ misc-utils/findmnt.c | 28 ++++++++----------
+ misc-utils/findmnt.h | 2 +-
+ tests/expected/findmnt/df-options | 4 +++
+ tests/ts/findmnt/df-options | 62 +++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 80 insertions(+), 16 deletions(-)
+ create mode 100644 tests/expected/findmnt/df-options
+ create mode 100755 tests/ts/findmnt/df-options
+
+diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c
+index cc397da..2e4d59e 100644
+--- a/misc-utils/findmnt.c
++++ b/misc-utils/findmnt.c
+@@ -1636,7 +1636,7 @@ int main(int argc, char *argv[])
+ break;
+ case 'I':
+ flags &= ~FL_TREE;
+- flags |= FL_DF_INODES;
++ flags |= (FL_DF_INODES | FL_DF);
+ break;
+ case 'i':
+ flags |= FL_INVERT;
+@@ -1775,22 +1775,20 @@ int main(int argc, char *argv[])
+ if (collist)
+ list_colunms(); /* print end exit */
+
+- if (!ncolumns && (flags & FL_DF_INODES)) {
++ if (!ncolumns && (flags & FL_DF)) {
+ add_column(columns, ncolumns++, COL_SOURCE);
+ add_column(columns, ncolumns++, COL_FSTYPE);
+- add_column(columns, ncolumns++, COL_INO_TOTAL);
+- add_column(columns, ncolumns++, COL_INO_USED);
+- add_column(columns, ncolumns++, COL_INO_AVAIL);
+- add_column(columns, ncolumns++, COL_INO_USEPERC);
+- add_column(columns, ncolumns++, COL_TARGET);
+- }
+- else if (!ncolumns && (flags & FL_DF)) {
+- add_column(columns, ncolumns++, COL_SOURCE);
+- add_column(columns, ncolumns++, COL_FSTYPE);
+- add_column(columns, ncolumns++, COL_SIZE);
+- add_column(columns, ncolumns++, COL_USED);
+- add_column(columns, ncolumns++, COL_AVAIL);
+- add_column(columns, ncolumns++, COL_USEPERC);
++ if (flags & FL_DF_INODES) {
++ add_column(columns, ncolumns++, COL_INO_TOTAL);
++ add_column(columns, ncolumns++, COL_INO_USED);
++ add_column(columns, ncolumns++, COL_INO_AVAIL);
++ add_column(columns, ncolumns++, COL_INO_USEPERC);
++ } else {
++ add_column(columns, ncolumns++, COL_SIZE);
++ add_column(columns, ncolumns++, COL_USED);
++ add_column(columns, ncolumns++, COL_AVAIL);
++ add_column(columns, ncolumns++, COL_USEPERC);
++ }
+ add_column(columns, ncolumns++, COL_TARGET);
+ }
+
+diff --git a/misc-utils/findmnt.h b/misc-utils/findmnt.h
+index 5c69450..85ab68d 100644
+--- a/misc-utils/findmnt.h
++++ b/misc-utils/findmnt.h
+@@ -24,7 +24,7 @@ enum {
+ FL_SHADOWED = (1 << 20),
+ FL_DELETED = (1 << 21),
+ FL_SHELLVAR = (1 << 22),
+- FL_DF_INODES = (1 << 23) | FL_DF,
++ FL_DF_INODES = (1 << 23),
+
+ /* basic table settings */
+ FL_ASCII = (1 << 25),
+diff --git a/tests/expected/findmnt/df-options b/tests/expected/findmnt/df-options
+new file mode 100644
+index 0000000..3f0f509
+--- /dev/null
++++ b/tests/expected/findmnt/df-options
+@@ -0,0 +1,4 @@
++-D: OK
++-I: OK
++--df: OK
++--dfi: OK
+diff --git a/tests/ts/findmnt/df-options b/tests/ts/findmnt/df-options
+new file mode 100755
+index 0000000..58208b9
+--- /dev/null
++++ b/tests/ts/findmnt/df-options
+@@ -0,0 +1,62 @@
++#!/bin/bash
++
++# This file is part of util-linux.
++#
++# This file is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This file is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++
++TS_TOPDIR="${0%/*}/../.."
++TS_DESC="the columns enabled with -D and -I options"
++
++. "$TS_TOPDIR"/functions.sh
++ts_init "$*"
++
++ts_check_test_command "$TS_CMD_FINDMNT"
++ts_check_prog "head"
++
++ts_cd "$TS_OUTDIR"
++
++D_expectation="SOURCE FSTYPE SIZE USED AVAIL USE% TARGET"
++I_expectation="SOURCE FSTYPE INO.TOTAL INO.USED INO.AVAIL INO.USE% TARGET"
++{
++ if [[ $($TS_CMD_FINDMNT --raw -D | head -1) == "$D_expectation" ]]; then
++ echo "-D: OK"
++ else
++ echo "-D: ERROR"
++ $TS_CMD_FINDMNT --raw -D
++ echo $?
++ fi
++
++ if [[ $($TS_CMD_FINDMNT --raw -I | head -1) == "$I_expectation" ]]; then
++ echo "-I: OK"
++ else
++ echo "-I: ERROR"
++ $TS_CMD_FINDMNT --raw -I
++ echo $?
++ fi
++
++ if [[ $($TS_CMD_FINDMNT --raw --df | head -1) == "$D_expectation" ]]; then
++ echo "--df: OK"
++ else
++ echo "--df: ERROR"
++ $TS_CMD_FINDMNT --raw --df
++ echo $?
++ fi
++
++ if [[ $($TS_CMD_FINDMNT --raw --dfi | head -1) == "$I_expectation" ]]; then
++ echo "--dfi: OK"
++ else
++ echo "--dfi: ERROR"
++ $TS_CMD_FINDMNT --raw --dfi
++ echo $?
++ fi
++} >> "$TS_OUTPUT" 2>> "$TS_ERRLOG"
++
++ts_finalize
diff --git a/debian/patches/upstream/libblkid-Fix-segfault-when-blkid.conf-doesn-t-exist.patch b/debian/patches/upstream/libblkid-Fix-segfault-when-blkid.conf-doesn-t-exist.patch
new file mode 100644
index 0000000..0e6490c
--- /dev/null
+++ b/debian/patches/upstream/libblkid-Fix-segfault-when-blkid.conf-doesn-t-exist.patch
@@ -0,0 +1,75 @@
+From: Karel Zak <kzak@redhat.com>
+Date: Mon, 1 Apr 2024 12:14:50 +0200
+Subject: libblkid: Fix segfault when blkid.conf doesn't exist
+
+* Move 'line' and 'uevent' to the beginning of the LIBECONF code.
+* Remove unwanted space between function name and arguments.
+* Check for 'line' pointer before dereferencing.
+
+References: https://github.com/util-linux/util-linux/pull/2883
+Signed-off-by: Karel Zak <kzak@redhat.com>
+(cherry picked from commit 7e357241b413a01c37b0b4d064bc0a47e3259361)
+---
+ libblkid/src/config.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/libblkid/src/config.c b/libblkid/src/config.c
+index 7b8b04f..66c1864 100644
+--- a/libblkid/src/config.c
++++ b/libblkid/src/config.c
+@@ -153,6 +153,8 @@ struct blkid_config *blkid_read_config(const char *filename)
+ #else /* !HAVE_LIBECONF */
+
+ static econf_file *file = NULL;
++ char *line = NULL;
++ bool uevent = false;
+ econf_err error;
+
+ if (filename) {
+@@ -187,7 +189,6 @@ struct blkid_config *blkid_read_config(const char *filename)
+ }
+ }
+
+- bool uevent = false;
+ if ((error = econf_getBoolValue(file, NULL, "SEND_UEVENT", &uevent))) {
+ if (error != ECONF_NOKEY) {
+ DBG(CONFIG, ul_debug("couldn't fetch SEND_UEVENT corrently: %s", econf_errString(error)));
+@@ -209,7 +210,6 @@ struct blkid_config *blkid_read_config(const char *filename)
+ }
+ }
+
+- char *line = NULL;
+ if ((error = econf_getStringValue(file, NULL, "EVALUATE", &line))) {
+ conf->nevals = 0;
+ if (error != ECONF_NOKEY) {
+@@ -219,7 +219,7 @@ struct blkid_config *blkid_read_config(const char *filename)
+ DBG(CONFIG, ul_debug("key CACHE_FILE not found, using built-in default "));
+ }
+ } else {
+- if (*line && parse_evaluate(conf, line) == -1)
++ if (line && *line && parse_evaluate(conf, line) == -1)
+ goto err;
+ }
+
+@@ -238,8 +238,8 @@ dflt:
+ if (f)
+ fclose(f);
+ #else
+- econf_free (file);
+- free (line);
++ econf_free(file);
++ free(line);
+ #endif
+ return conf;
+ err:
+@@ -248,8 +248,8 @@ err:
+ #ifndef HAVE_LIBECONF
+ fclose(f);
+ #else
+- econf_free (file);
+- free (line);
++ econf_free(file);
++ free(line);
+ #endif
+ return NULL;
+ }
diff --git a/debian/patches/upstream/libblkid-topology-ioctl-correctly-handle-kernel-types.patch b/debian/patches/upstream/libblkid-topology-ioctl-correctly-handle-kernel-types.patch
new file mode 100644
index 0000000..8f28f7f
--- /dev/null
+++ b/debian/patches/upstream/libblkid-topology-ioctl-correctly-handle-kernel-types.patch
@@ -0,0 +1,89 @@
+From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= <thomas@t-8ch.de>
+Date: Tue, 2 Apr 2024 18:55:29 +0200
+Subject: libblkid: topology/ioctl: correctly handle kernel types
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+Commit 5d71d711d07a ("libblkid: topolicy/ioctl: use union for multiple data types")
+incorrectly assumed that set_ulong and set_int refer to the type
+returned by the kernel. Instead the different function pointer names
+refer to the types of the function pointers.
+However all ioctls, except for the later added BLKGETDISKSEQ, return
+32bit integers.
+This made libblkid also interpret the upper 32bits too, leading to
+garbage values.
+
+Introduce a new member 'kernel_size' to also handle the 64bit
+BLKGETDISKSEQ.
+
+Drop data.ul as it is no actually used.
+
+Closes #2904
+Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
+(cherry picked from commit a10081a52c48a5232db30d8e0a7a7570cc8163ae)
+---
+ libblkid/src/topology/ioctl.c | 29 +++++++++++++++++++----------
+ 1 file changed, 19 insertions(+), 10 deletions(-)
+
+diff --git a/libblkid/src/topology/ioctl.c b/libblkid/src/topology/ioctl.c
+index 3560a2f..4be20e8 100644
+--- a/libblkid/src/topology/ioctl.c
++++ b/libblkid/src/topology/ioctl.c
+@@ -24,6 +24,7 @@
+ static const struct topology_val {
+
+ long ioc;
++ size_t kernel_size;
+
+ /* functions to set probing result */
+ int (*set_ulong)(blkid_probe, unsigned long);
+@@ -31,11 +32,16 @@ static const struct topology_val {
+ int (*set_u64)(blkid_probe, uint64_t);
+
+ } topology_vals[] = {
+- { BLKALIGNOFF, NULL, blkid_topology_set_alignment_offset },
+- { BLKIOMIN, blkid_topology_set_minimum_io_size },
+- { BLKIOOPT, blkid_topology_set_optimal_io_size },
+- { BLKPBSZGET, blkid_topology_set_physical_sector_size },
+- { BLKGETDISKSEQ, .set_u64 = blkid_topology_set_diskseq },
++ { BLKALIGNOFF, sizeof(int),
++ .set_int = blkid_topology_set_alignment_offset },
++ { BLKIOMIN, sizeof(int),
++ .set_ulong = blkid_topology_set_minimum_io_size },
++ { BLKIOOPT, sizeof(int),
++ .set_ulong = blkid_topology_set_optimal_io_size },
++ { BLKPBSZGET, sizeof(int),
++ .set_ulong = blkid_topology_set_physical_sector_size },
++ { BLKGETDISKSEQ, sizeof(uint64_t),
++ .set_u64 = blkid_topology_set_diskseq },
+ /* we read BLKSSZGET in topology.c */
+ };
+
+@@ -48,18 +54,21 @@ static int probe_ioctl_tp(blkid_probe pr,
+ const struct topology_val *val = &topology_vals[i];
+ int rc = 1;
+ union {
+- unsigned long ul;
+- int i;
++ int s32;
+ uint64_t u64;
+- } data;
++ } data = { 0 };
+
+ if (ioctl(pr->fd, val->ioc, &data) == -1)
+ goto nothing;
+
++ /* Convert from kernel to libblkid type */
++ if (val->kernel_size == 4)
++ data.u64 = data.s32;
++
+ if (val->set_int)
+- rc = val->set_int(pr, data.i);
++ rc = val->set_int(pr, data.u64);
+ else if (val->set_ulong)
+- rc = val->set_ulong(pr, data.ul);
++ rc = val->set_ulong(pr, data.u64);
+ else
+ rc = val->set_u64(pr, data.u64);
+
diff --git a/debian/patches/upstream/libblkid-topology-ioctl-simplify-ioctl-handling.patch b/debian/patches/upstream/libblkid-topology-ioctl-simplify-ioctl-handling.patch
new file mode 100644
index 0000000..7dac8b2
--- /dev/null
+++ b/debian/patches/upstream/libblkid-topology-ioctl-simplify-ioctl-handling.patch
@@ -0,0 +1,117 @@
+From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= <thomas@t-8ch.de>
+Date: Thu, 4 Apr 2024 07:24:58 +0200
+Subject: libblkid: topology/ioctl: simplify ioctl handling
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+Coverity complains about the data copy within the union.
+Instead unroll the loop which is less code and easier to follow.
+
+Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
+(cherry picked from commit 2ab95860db0b7423906911b8b9e9f231332c2c11)
+---
+ libblkid/src/topology/ioctl.c | 85 ++++++++++++++-----------------------------
+ 1 file changed, 27 insertions(+), 58 deletions(-)
+
+diff --git a/libblkid/src/topology/ioctl.c b/libblkid/src/topology/ioctl.c
+index 4be20e8..7b15c9e 100644
+--- a/libblkid/src/topology/ioctl.c
++++ b/libblkid/src/topology/ioctl.c
+@@ -18,69 +18,38 @@
+
+ #include "topology.h"
+
+-/*
+- * ioctl topology values
+- */
+-static const struct topology_val {
+-
+- long ioc;
+- size_t kernel_size;
+-
+- /* functions to set probing result */
+- int (*set_ulong)(blkid_probe, unsigned long);
+- int (*set_int)(blkid_probe, int);
+- int (*set_u64)(blkid_probe, uint64_t);
+-
+-} topology_vals[] = {
+- { BLKALIGNOFF, sizeof(int),
+- .set_int = blkid_topology_set_alignment_offset },
+- { BLKIOMIN, sizeof(int),
+- .set_ulong = blkid_topology_set_minimum_io_size },
+- { BLKIOOPT, sizeof(int),
+- .set_ulong = blkid_topology_set_optimal_io_size },
+- { BLKPBSZGET, sizeof(int),
+- .set_ulong = blkid_topology_set_physical_sector_size },
+- { BLKGETDISKSEQ, sizeof(uint64_t),
+- .set_u64 = blkid_topology_set_diskseq },
+- /* we read BLKSSZGET in topology.c */
+-};
+-
+ static int probe_ioctl_tp(blkid_probe pr,
+ const struct blkid_idmag *mag __attribute__((__unused__)))
+ {
+- size_t i;
+-
+- for (i = 0; i < ARRAY_SIZE(topology_vals); i++) {
+- const struct topology_val *val = &topology_vals[i];
+- int rc = 1;
+- union {
+- int s32;
+- uint64_t u64;
+- } data = { 0 };
+-
+- if (ioctl(pr->fd, val->ioc, &data) == -1)
+- goto nothing;
+-
+- /* Convert from kernel to libblkid type */
+- if (val->kernel_size == 4)
+- data.u64 = data.s32;
+-
+- if (val->set_int)
+- rc = val->set_int(pr, data.u64);
+- else if (val->set_ulong)
+- rc = val->set_ulong(pr, data.u64);
+- else
+- rc = val->set_u64(pr, data.u64);
+-
+- if (rc)
+- goto err;
+- }
++ uint64_t u64;
++ int s32;
++
++ if (ioctl(pr->fd, BLKALIGNOFF, &s32) == -1)
++ return 1;
++ if (blkid_topology_set_alignment_offset(pr, s32))
++ return -1;
++
++ if (ioctl(pr->fd, BLKIOMIN, &s32) == -1)
++ return 1;
++ if (blkid_topology_set_minimum_io_size(pr, s32))
++ return -1;
++
++ if (ioctl(pr->fd, BLKIOOPT, &s32) == -1)
++ return 1;
++ if (blkid_topology_set_optimal_io_size(pr, s32))
++ return -1;
++
++ if (ioctl(pr->fd, BLKPBSZGET, &s32) == -1)
++ return 1;
++ if (blkid_topology_set_physical_sector_size(pr, s32))
++ return -1;
++
++ if (ioctl(pr->fd, BLKGETDISKSEQ, &u64) == -1)
++ return 1;
++ if (blkid_topology_set_physical_sector_size(pr, u64))
++ return -1;
+
+ return 0;
+-nothing:
+- return 1;
+-err:
+- return -1;
+ }
+
+ const struct blkid_idinfo ioctl_tp_idinfo =
diff --git a/debian/patches/upstream/libmount-Fix-access-check-for-utab-in-context.patch b/debian/patches/upstream/libmount-Fix-access-check-for-utab-in-context.patch
new file mode 100644
index 0000000..a305ec8
--- /dev/null
+++ b/debian/patches/upstream/libmount-Fix-access-check-for-utab-in-context.patch
@@ -0,0 +1,39 @@
+From: Karel Zak <kzak@redhat.com>
+Date: Mon, 22 Apr 2024 13:09:04 +0200
+Subject: libmount: Fix access check for utab in context
+
+The function mnt_has_regular_utab() properly detects that the utab is
+not writable, but this is ignored by the high-level context API. As a
+result, the library later attempts to update the file and ends up with
+a warning in mount(8):
+
+ $ mkdir sys
+ $ unshare --map-root-user --mount
+ $ mount --rbind /sys sys
+ $ umount --lazy sys; echo $?
+ umount: /home/user/sys: filesystem was unmounted, but failed to update userspace mount table.
+ 16
+
+In this case, the utab should be ignored.
+
+Fixes: https://github.com/util-linux/util-linux/issues/2981
+Signed-off-by: Karel Zak <kzak@redhat.com>
+(cherry picked from commit 97f7bfc0fdf74b6a6e220ba9d2f620386e660b29)
+---
+ libmount/src/context.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/libmount/src/context.c b/libmount/src/context.c
+index 952287a..5206c1d 100644
+--- a/libmount/src/context.c
++++ b/libmount/src/context.c
+@@ -367,8 +367,7 @@ const char *mnt_context_get_writable_tabpath(struct libmnt_context *cxt)
+ {
+ assert(cxt);
+
+- context_init_paths(cxt, 1);
+- return cxt->utab_path;
++ return mnt_context_utab_writable(cxt) ? cxt->utab_path : NULL;
+ }
+
+
diff --git a/debian/patches/upstream/libmount-fix-comment-typo-for-mnt_fs_get_comment.patch b/debian/patches/upstream/libmount-fix-comment-typo-for-mnt_fs_get_comment.patch
new file mode 100644
index 0000000..27f8867
--- /dev/null
+++ b/debian/patches/upstream/libmount-fix-comment-typo-for-mnt_fs_get_comment.patch
@@ -0,0 +1,23 @@
+From: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
+Date: Mon, 22 Apr 2024 14:01:25 +0800
+Subject: libmount: fix comment typo for mnt_fs_get_comment()
+
+Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
+(cherry picked from commit c630dbc38f7cd1f838e65e2c43d8375bce1ec20f)
+---
+ libmount/src/fs.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libmount/src/fs.c b/libmount/src/fs.c
+index 79e32a1..26f2c69 100644
+--- a/libmount/src/fs.c
++++ b/libmount/src/fs.c
+@@ -1454,7 +1454,7 @@ int mnt_fs_get_attribute(struct libmnt_fs *fs, const char *name,
+ * mnt_fs_get_comment:
+ * @fs: fstab/mtab/mountinfo entry pointer
+ *
+- * Returns: 0 on success, 1 when not found the @name or negative number in case of error.
++ * Returns: comment string
+ */
+ const char *mnt_fs_get_comment(struct libmnt_fs *fs)
+ {
diff --git a/debian/patches/upstream/libsmartcols-reset-wrap-after-calculation.patch b/debian/patches/upstream/libsmartcols-reset-wrap-after-calculation.patch
new file mode 100644
index 0000000..0f27560
--- /dev/null
+++ b/debian/patches/upstream/libsmartcols-reset-wrap-after-calculation.patch
@@ -0,0 +1,88 @@
+From: Karel Zak <kzak@redhat.com>
+Date: Tue, 16 Apr 2024 10:49:31 +0200
+Subject: libsmartcols: reset wrap after calculation
+
+Fixes: https://github.com/util-linux/util-linux/issues/2956
+Signed-off-by: Karel Zak <kzak@redhat.com>
+(cherry picked from commit 62f64717ec134b10c5a670403c2d8c43b608e671)
+---
+ libsmartcols/src/calculate.c | 7 +++++--
+ libsmartcols/src/print.c | 20 +++++++++++++-------
+ 2 files changed, 18 insertions(+), 9 deletions(-)
+
+diff --git a/libsmartcols/src/calculate.c b/libsmartcols/src/calculate.c
+index 84198da..deabb07 100644
+--- a/libsmartcols/src/calculate.c
++++ b/libsmartcols/src/calculate.c
+@@ -413,10 +413,8 @@ int __scols_calculate(struct libscols_table *tb, struct ul_buffer *buf)
+ size_t colsepsz;
+ int sorted = 0;
+
+-
+ DBG(TAB, ul_debugobj(tb, "-----calculate-(termwidth=%zu)-----", tb->termwidth));
+ tb->is_dummy_print = 1;
+-
+ colsepsz = scols_table_is_noencoding(tb) ?
+ mbs_width(colsep(tb)) :
+ mbs_safe_width(colsep(tb));
+@@ -430,6 +428,11 @@ int __scols_calculate(struct libscols_table *tb, struct ul_buffer *buf)
+ while (scols_table_next_column(tb, &itr, &cl) == 0) {
+ int is_last;
+
++ memset(&cl->wstat, 0, sizeof(cl->wstat));
++ cl->width = 0;
++ cl->width_treeart = 0;
++ scols_column_reset_wrap(cl);
++
+ if (scols_column_is_hidden(cl))
+ continue;
+
+diff --git a/libsmartcols/src/print.c b/libsmartcols/src/print.c
+index 88ab5a2..ab279e3 100644
+--- a/libsmartcols/src/print.c
++++ b/libsmartcols/src/print.c
+@@ -764,11 +764,11 @@ notree:
+ }
+ }
+
++done:
+ /* reset wrapping after greatest chunk calculation */
+ if (cal && scols_column_is_wrap(cl))
+ scols_column_reset_wrap(cl);
+
+-done:
+ DBG(COL, ul_debugobj(cl, "__cursor_to_buffer rc=%d", rc));
+ return rc;
+ }
+@@ -802,8 +802,12 @@ static int print_line(struct libscols_table *tb,
+ rc = __cursor_to_buffer(tb, buf, 0);
+ if (!rc)
+ rc = print_data(tb, buf);
+- if (!rc && scols_column_has_pending_wrap(cl))
+- pending = 1;
++ if (!rc) {
++ if (scols_column_has_pending_wrap(cl))
++ pending = 1;
++ else
++ scols_column_reset_wrap(cl);
++ }
+ scols_table_reset_cursor(tb);
+ }
+ fputs_color_line_close(tb);
+@@ -827,10 +831,12 @@ static int print_line(struct libscols_table *tb,
+ rc = __cursor_to_buffer(tb, buf, 0);
+ if (!rc)
+ rc = print_pending_data(tb, buf);
+- if (!rc && scols_column_has_pending_wrap(cl))
+- pending = 1;
+- if (!rc && !pending)
+- scols_column_reset_wrap(cl);
++ if (!rc) {
++ if (scols_column_has_pending_wrap(cl))
++ pending = 1;
++ else
++ scols_column_reset_wrap(cl);
++ }
+ } else
+ print_empty_cell(tb, cl, ln, NULL, ul_buffer_get_bufsiz(buf));
+ scols_table_reset_cursor(tb);
diff --git a/debian/patches/upstream/lsblk-simplify-SOURCES-code.patch b/debian/patches/upstream/lsblk-simplify-SOURCES-code.patch
new file mode 100644
index 0000000..e7cde87
--- /dev/null
+++ b/debian/patches/upstream/lsblk-simplify-SOURCES-code.patch
@@ -0,0 +1,61 @@
+From: Karel Zak <kzak@redhat.com>
+Date: Mon, 22 Apr 2024 11:51:56 +0200
+Subject: lsblk: simplify SOURCES code
+
+This complicated implementation originated from an early version of
+zero-separated items for libsmartcols. It is no longer necessary.
+
+References: https://github.com/util-linux/util-linux/pull/2983
+Signed-off-by: Karel Zak <kzak@redhat.com>
+(cherry picked from commit af4c7dac191abadc33aae75916583c890cd2ebc3)
+---
+ libsmartcols/src/column.c | 2 +-
+ misc-utils/lsblk.c | 8 +++-----
+ 2 files changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/libsmartcols/src/column.c b/libsmartcols/src/column.c
+index 5700bac..586a485 100644
+--- a/libsmartcols/src/column.c
++++ b/libsmartcols/src/column.c
+@@ -470,7 +470,7 @@ char *scols_wrapnl_nextchunk(const struct libscols_column *cl __attribute__((unu
+ * This is built-in function for scols_column_set_wrapfunc(). This function
+ * walk string separated by \0.
+ *
+- * For example for data "AAA\0BBB\0CCC" the next chunk is "BBB".
++ * For example for data "AAA\0BBB\0CCC\0" the next chunk is "BBB".
+ *
+ * Returns: next chunk
+ *
+diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c
+index 30bd2ed..15d9b19 100644
+--- a/misc-utils/lsblk.c
++++ b/misc-utils/lsblk.c
+@@ -935,8 +935,7 @@ static char *device_get_data(
+ ul_buffer_append_string(&buf, "[SWAP]");
+ else
+ ul_buffer_append_string(&buf, mnt_fs_get_target(fs));
+- if (i + 1 < n)
+- ul_buffer_append_data(&buf, "\0", 1);
++ ul_buffer_append_data(&buf, "\0", 1);
+ }
+ str = ul_buffer_get_data(&buf, datasiz, NULL);
+ break;
+@@ -953,8 +952,7 @@ static char *device_get_data(
+ if (mnt_fs_is_swaparea(fs))
+ continue;
+ ul_buffer_append_string(&buf, root ? root : "/");
+- if (i + 1 < n)
+- ul_buffer_append_data(&buf, "\0", 1);
++ ul_buffer_append_data(&buf, "\0", 1);
+ }
+ str = ul_buffer_get_data(&buf, datasiz, NULL);
+ break;
+@@ -1276,7 +1274,7 @@ static void device_fill_scols_cell(struct lsblk_device *dev,
+ ce = scols_line_get_cell(ln, colnum);
+ if (!ce)
+ return;
+- rc = datasiz ? scols_cell_refer_memory(ce, data, datasiz + 1)
++ rc = datasiz ? scols_cell_refer_memory(ce, data, datasiz)
+ : scols_cell_refer_data(ce, data);
+ if (rc)
+ err(EXIT_FAILURE, _("failed to add output data"));
diff --git a/debian/patches/upstream/lslocks-don-t-abort-gathering-per-process-information-eve.patch b/debian/patches/upstream/lslocks-don-t-abort-gathering-per-process-information-eve.patch
new file mode 100644
index 0000000..59abf34
--- /dev/null
+++ b/debian/patches/upstream/lslocks-don-t-abort-gathering-per-process-information-eve.patch
@@ -0,0 +1,77 @@
+From: Masatake YAMATO <yamato@redhat.com>
+Date: Sat, 13 Apr 2024 03:59:39 +0900
+Subject: lslocks: don't abort gathering per-process information even if
+ opening a /proc/[0-9]* fails
+
+If a process ($pid) taking a lock is gone while running lslocks,
+gathering per-process information for the process may fail in opening
+/proc/$pid. Though lslocks should work with incomplete information,
+the original code stopped gathering per-process information for the
+other processes.
+
+As a result of the original behavior, tests/ts/lslocks/lslocks really
+failed in an environment where multiple test cases ran simultaneously.
+
+Close #2624 again.
+See also #2633.
+
+Signed-off-by: Masatake YAMATO <yamato@redhat.com>
+(cherry picked from commit 20df923cc3d2da12a5296223c3ff0de7484cc587)
+---
+ misc-utils/lslocks.c | 6 ++----
+ tests/ts/lslocks/lslocks | 11 -----------
+ 2 files changed, 2 insertions(+), 15 deletions(-)
+
+diff --git a/misc-utils/lslocks.c b/misc-utils/lslocks.c
+index 3d70b04..60f6595 100644
+--- a/misc-utils/lslocks.c
++++ b/misc-utils/lslocks.c
+@@ -513,10 +513,8 @@ static int get_pids_locks(void *locks, void (*add_lock)(void *, struct lock *))
+ if (procfs_dirent_get_pid(d, &pid) != 0)
+ continue;
+
+- if (procfs_process_init_path(pc, pid) != 0) {
+- rc = -1;
+- break;
+- }
++ if (procfs_process_init_path(pc, pid) != 0)
++ continue;
+
+ if (procfs_process_get_cmdname(pc, buf, sizeof(buf)) <= 0)
+ continue;
+diff --git a/tests/ts/lslocks/lslocks b/tests/ts/lslocks/lslocks
+index 912fac8..a9ef69a 100755
+--- a/tests/ts/lslocks/lslocks
++++ b/tests/ts/lslocks/lslocks
+@@ -53,14 +53,6 @@ OFD_METHODS=(
+ lease-w
+ )
+
+-SLEEP()
+-{
+- # It appears that there is a time lag between locking and its
+- # visibility in /proc/locks. See the unstbale results of errors I
+- # observed in https://github.com/util-linux/util-linux/pull/2629.
+- sleep 1
+-}
+-
+ DFD=18
+ COLS_WITH_HOLDERS=COMMAND,TYPE,SIZE,MODE,START,END,HOLDERS
+ run_lslocks()
+@@ -71,8 +63,6 @@ run_lslocks()
+ rm -f "${FILE}"
+ coproc MKFDS { "$TS_HELPER_MKFDS" make-regular-file $FD file="$FILE" lock=$m; }
+ if read -r -u "${MKFDS[0]}" PID; then
+- SLEEP
+-
+ "$TS_CMD_LSLOCKS" ${OPTS} --pid "${PID}" -o "${COLS}"
+ echo "# $m + ${COLS} + ${OPTS}": $?
+ "$TS_CMD_LSLOCKS" ${OPTS} --pid "${PID}" -o PATH | sed -e 's#.*\('"$FILE0"'\)--[0-9]\+ *$#\1#'
+@@ -91,7 +81,6 @@ run_lslocks_with_co_holders()
+ {
+ rm -f "${FILE}"
+ coproc MKFDS { "$TS_HELPER_MKFDS" make-regular-file $FD file="$FILE" lock=$m dupfd=$DFD; }
+- SLEEP
+ if read -r -u "${MKFDS[0]}" PID; then
+ "$TS_CMD_LSLOCKS" ${OPTS} --pid "${PID}" -o "${COLS_WITH_HOLDERS}" | sed -e "s/${PID},/1,/g"
+ echo "# $m + ${COLS_WITH_HOLDERS} + ${OPTS}": ${PIPESTATUS[0]}
diff --git a/debian/patches/upstream/lslocks-remove-a-unused-local-variable.patch b/debian/patches/upstream/lslocks-remove-a-unused-local-variable.patch
new file mode 100644
index 0000000..b1547cc
--- /dev/null
+++ b/debian/patches/upstream/lslocks-remove-a-unused-local-variable.patch
@@ -0,0 +1,37 @@
+From: Masatake YAMATO <yamato@redhat.com>
+Date: Sat, 13 Apr 2024 04:13:03 +0900
+Subject: lslocks: remove a unused local variable
+
+Signed-off-by: Masatake YAMATO <yamato@redhat.com>
+(cherry picked from commit c8c85e8e54aa201766f2420e2a7c86ccfa8d5df0)
+---
+ misc-utils/lslocks.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/misc-utils/lslocks.c b/misc-utils/lslocks.c
+index 60f6595..176173f 100644
+--- a/misc-utils/lslocks.c
++++ b/misc-utils/lslocks.c
+@@ -490,12 +490,11 @@ static int get_pid_locks(void *locks, void (*add_lock)(void *, struct lock *), s
+ return rc;
+ }
+
+-static int get_pids_locks(void *locks, void (*add_lock)(void *, struct lock *))
++static void get_pids_locks(void *locks, void (*add_lock)(void *, struct lock *))
+ {
+ DIR *dir;
+ struct dirent *d;
+ struct path_cxt *pc = NULL;
+- int rc = 0;
+
+ pc = ul_new_path(NULL);
+ if (!pc)
+@@ -526,7 +525,7 @@ static int get_pids_locks(void *locks, void (*add_lock)(void *, struct lock *))
+ closedir(dir);
+ ul_unref_path(pc);
+
+- return rc;
++ return;
+ }
+
+ static int get_proc_locks(void *locks, void (*add_lock)(void *, struct lock *), void *fallback)
diff --git a/debian/patches/upstream/lsns-fix-netns-use.patch b/debian/patches/upstream/lsns-fix-netns-use.patch
new file mode 100644
index 0000000..1d1c8b6
--- /dev/null
+++ b/debian/patches/upstream/lsns-fix-netns-use.patch
@@ -0,0 +1,33 @@
+From: Karel Zak <kzak@redhat.com>
+Date: Mon, 22 Apr 2024 14:28:52 +0200
+Subject: lsns: fix netns use
+
+ # ip netns add vpn
+ # lsns -T -t net
+ Segmentation fault (core dumped)
+
+The function interpolate_missing_namespaces() reads data from /proc.
+However, in the case of a persistent namespace, there is no procfs
+entry for the namespace. Therefore, this function should ignore it.
+
+Fixes: https://github.com/util-linux/util-linux/issues/2982
+Signed-off-by: Karel Zak <kzak@redhat.com>
+(cherry picked from commit 42880f54894c1d7fd113552ff8474566a2595a0d)
+---
+ sys-utils/lsns.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/sys-utils/lsns.c b/sys-utils/lsns.c
+index 4ea01d2..6c87c47 100644
+--- a/sys-utils/lsns.c
++++ b/sys-utils/lsns.c
+@@ -793,6 +793,9 @@ static void interpolate_missing_namespaces(struct lsns *ls, struct lsns_namespac
+ int fd_orphan, fd_missing;
+ struct stat st;
+
++ if (!orphan->proc)
++ return;
++
+ orphan->related_ns[rela] = get_namespace(ls, orphan->related_id[rela]);
+ if (orphan->related_ns[rela])
+ return;
diff --git a/debian/patches/upstream/lsns-report-with-warnx-if-a-namespace-related-ioctl-fails.patch b/debian/patches/upstream/lsns-report-with-warnx-if-a-namespace-related-ioctl-fails.patch
new file mode 100644
index 0000000..fd57faf
--- /dev/null
+++ b/debian/patches/upstream/lsns-report-with-warnx-if-a-namespace-related-ioctl-fails.patch
@@ -0,0 +1,27 @@
+From: Masatake YAMATO <yamato@redhat.com>
+Date: Mon, 15 Apr 2024 01:44:38 +0900
+Subject: lsns: report with warnx if a namespace related ioctl fails with
+ ENOSYS
+
+Qemu userspace emulation reports ENOSYS if it doesn't support a given
+ioctl command.
+
+Signed-off-by: Masatake YAMATO <yamato@redhat.com>
+(cherry picked from commit 0a7a8fbc7a82dfbd9e925d1b4d4936bf4e011bc1)
+---
+ sys-utils/lsns.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sys-utils/lsns.c b/sys-utils/lsns.c
+index e68bdbe..1f3574f 100644
+--- a/sys-utils/lsns.c
++++ b/sys-utils/lsns.c
+@@ -68,7 +68,7 @@ UL_DEBUG_DEFINE_MASKNAMES(lsns) = UL_DEBUG_EMPTY_MASKNAMES;
+
+ #define lsns_ioctl(fildes, request, ...) __extension__ ({ \
+ int ret = ioctl(fildes, request, ##__VA_ARGS__); \
+- if (ret == -1 && errno == ENOTTY) \
++ if (ret == -1 && (errno == ENOTTY || errno == ENOSYS)) \
+ warnx("Unsupported ioctl %s", #request); \
+ ret; })
+
diff --git a/debian/patches/upstream/lsns-tolerate-lsns_ioctl-fd-NS_GET_-PARENT-USERNS-failing.patch b/debian/patches/upstream/lsns-tolerate-lsns_ioctl-fd-NS_GET_-PARENT-USERNS-failing.patch
new file mode 100644
index 0000000..ff17dc2
--- /dev/null
+++ b/debian/patches/upstream/lsns-tolerate-lsns_ioctl-fd-NS_GET_-PARENT-USERNS-failing.patch
@@ -0,0 +1,49 @@
+From: Masatake YAMATO <yamato@redhat.com>
+Date: Sun, 14 Apr 2024 01:40:14 +0900
+Subject: lsns: tolerate lsns_ioctl(fd,
+ NS_GET_{PARENT,USERNS}) failing with ENOSYS
+
+With the original code, "lsns/filedesc" test case failed on
+"build (qemu-user, s390x)" and "build (qemu-user, riscv64)".
+
+On the platforms, lsns_ioctl(fd, NS_GET_{PARENT,USERNS}) failed
+with ENOSYS. The error stoped the iteration for gathering
+information from /proc/[0-9]+. As a result, lsns printed
+nothing. We don't expect this behavior.
+
+Signed-off-by: Masatake YAMATO <yamato@redhat.com>
+(cherry picked from commit f2a8b20d9c63f771d1fddd639ea1ec3fe034dc6d)
+---
+ sys-utils/lsns.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/sys-utils/lsns.c b/sys-utils/lsns.c
+index 1f3574f..4ea01d2 100644
+--- a/sys-utils/lsns.c
++++ b/sys-utils/lsns.c
+@@ -308,7 +308,11 @@ static int get_ns_ino(int dir, const char *nsname, ino_t *ino, ino_t *pino, ino_
+ return -errno;
+ if (strcmp(nsname, "pid") == 0 || strcmp(nsname, "user") == 0) {
+ if ((pfd = lsns_ioctl(fd, NS_GET_PARENT)) < 0) {
+- if (errno == EPERM)
++ if (errno == EPERM
++ /* On the test platforms, "build (qemu-user, s390x)" and
++ * "build (qemu-user, riscv64)", the ioctl reported ENOSYS.
++ */
++ || errno == ENOSYS)
+ goto user;
+ close(fd);
+ return -errno;
+@@ -323,7 +327,11 @@ static int get_ns_ino(int dir, const char *nsname, ino_t *ino, ino_t *pino, ino_
+ }
+ user:
+ if ((ofd = lsns_ioctl(fd, NS_GET_USERNS)) < 0) {
+- if (errno == EPERM)
++ if (errno == EPERM
++ /* On the test platforms, "build (qemu-user, s390x)" and
++ * "build (qemu-user, riscv64)", the ioctl reported ENOSYS.
++ */
++ || errno == ENOSYS)
+ goto out;
+ close(fd);
+ return -errno;
diff --git a/debian/patches/upstream/pam_lastlog2-link-against-liblastlog.patch b/debian/patches/upstream/pam_lastlog2-link-against-liblastlog.patch
new file mode 100644
index 0000000..6d299b2
--- /dev/null
+++ b/debian/patches/upstream/pam_lastlog2-link-against-liblastlog.patch
@@ -0,0 +1,32 @@
+From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= <thomas@t-8ch.de>
+Date: Mon, 1 Apr 2024 22:53:32 +0200
+Subject: pam_lastlog2: link against liblastlog
+MIME-Version: 1.0
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+While at it also drop the duplicated include path.
+
+Fixes #2897
+Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
+(cherry picked from commit 2722b40012740372daf3585b7c071fcbede13359)
+---
+ pam_lastlog2/src/Makemodule.am | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/pam_lastlog2/src/Makemodule.am b/pam_lastlog2/src/Makemodule.am
+index 9884416..f9a9b6b 100644
+--- a/pam_lastlog2/src/Makemodule.am
++++ b/pam_lastlog2/src/Makemodule.am
+@@ -10,8 +10,9 @@ EXTRA_pam_lastlog2_la_DEPENDENCIES = \
+ pam_lastlog2_la_CFLAGS = \
+ $(AM_CFLAGS) \
+ $(SOLIB_CFLAGS) \
+- -I$(ul_liblastlog2_incdir) \
+- -Iliblastlog2/src
++ -I$(ul_liblastlog2_incdir)
++
++pam_lastlog2_la_LIBADD = liblastlog2.la
+
+ pam_lastlog2_la_LDFLAGS = $(SOLIB_LDFLAGS) -module -avoid-version -shared
+ if HAVE_VSCRIPT