Auto sync2gitlab import of util-linux-2.32.1-35.el8.src.rpm

This commit is contained in:
James Antill 2022-05-26 15:47:06 -04:00
parent e59d840ab0
commit 9198025136
89 changed files with 11275 additions and 1 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/util-linux-2.32.1.tar.xz

View File

@ -0,0 +1,26 @@
From 2d57cb2d64ba4757dcfd9d0e7ed4873cae8a6fcd Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 20 Jun 2016 11:09:02 +0200
Subject: [PATCH 0/6] login: create /var/log/lastlog
Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=151635
---
login-utils/login.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/login-utils/login.c b/login-utils/login.c
index 09ee8f8ea..8c9e43292 100644
--- a/login-utils/login.c
+++ b/login-utils/login.c
@@ -506,7 +506,7 @@ static void log_lastlog(struct login_context *cxt)
sa.sa_handler = SIG_IGN;
sigaction(SIGXFSZ, &sa, &oldsa_xfsz);
- fd = open(_PATH_LASTLOG, O_RDWR, 0);
+ fd = open(_PATH_LASTLOG, O_RDWR | O_CREAT, 0);
if (fd < 0)
goto done;
--
2.14.4

View File

@ -0,0 +1,123 @@
From 768b91ef6f68661462494bed800505064eb97bc8 Mon Sep 17 00:00:00 2001
From: Milan Broz <gmazyland@gmail.com>
Date: Wed, 11 Jul 2018 12:34:39 +0200
Subject: [PATCH 1/6] libblkid: Check for a secondary LUKS2 header.
This patch adds search for a secondary LUKS2 header,
if the primary one is corrupted.
This patch is primarily needed for wipefs that should wipe
both signatures (otherwise LUKS2 header recovery can use
secondary header and revert wipefs action).
Signed-off-by: Milan Broz <gmazyland@gmail.com>
Upstream: http://github.com/karelzak/util-linux/commit/8bee1a220db8effbe5a75ba9bc68840e019ea89a
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1595882
---
libblkid/src/superblocks/luks.c | 60 ++++++++++++++++++++++++++++++++---------
1 file changed, 47 insertions(+), 13 deletions(-)
diff --git a/libblkid/src/superblocks/luks.c b/libblkid/src/superblocks/luks.c
index bc3d7f558..67d7cfcc5 100644
--- a/libblkid/src/superblocks/luks.c
+++ b/libblkid/src/superblocks/luks.c
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2008 Karel Zak <kzak@redhat.com>
+ * Copyright (C) 2018 Milan Broz <gmazyland@gmail.com>
*
* Inspired by libvolume_id by
* Kay Sievers <kay.sievers@vrfy.org>
@@ -29,6 +30,15 @@
#define LUKS2_CHECKSUM_ALG_L 32
#define LUKS2_CHECKSUM_L 64
+#define LUKS_MAGIC "LUKS\xba\xbe"
+#define LUKS_MAGIC_2 "SKUL\xba\xbe"
+
+/* Offsets for secondary header (for scan if primary header is corrupted). */
+#define LUKS2_HDR2_OFFSETS { 0x04000, 0x008000, 0x010000, 0x020000, \
+ 0x40000, 0x080000, 0x100000, 0x200000, 0x400000 }
+
+static const uint64_t secondary_offsets[] = LUKS2_HDR2_OFFSETS;
+
struct luks_phdr {
uint8_t magic[LUKS_MAGIC_L];
uint16_t version;
@@ -59,18 +69,16 @@ struct luks2_phdr {
/* Padding to 4k, then JSON area */
} __attribute__ ((packed));
-static int probe_luks(blkid_probe pr, const struct blkid_idmag *mag)
+static int luks_attributes(blkid_probe pr, struct luks2_phdr *header, uint64_t offset)
{
- struct luks_phdr *header_v1;
- struct luks2_phdr *header;
int version;
+ struct luks_phdr *header_v1;
- header = blkid_probe_get_sb(pr, mag, struct luks2_phdr);
- if (header == NULL)
- return errno ? -errno : 1;
+ if (blkid_probe_set_magic(pr, offset, LUKS_MAGIC_L, (unsigned char *) &header->magic))
+ return BLKID_PROBE_NONE;
version = be16_to_cpu(header->version);
- blkid_probe_sprintf_version(pr, "%u", be16_to_cpu(header->version));
+ blkid_probe_sprintf_version(pr, "%u", version);
if (version == 1) {
header_v1 = (struct luks_phdr *)header;
@@ -84,7 +92,37 @@ static int probe_luks(blkid_probe pr, const struct blkid_idmag *mag)
blkid_probe_set_id_label(pr, "SUBSYSTEM",
(unsigned char *) header->subsystem, LUKS2_LABEL_L);
}
- return 0;
+
+ return BLKID_PROBE_OK;
+}
+
+static int probe_luks(blkid_probe pr, const struct blkid_idmag *mag __attribute__((__unused__)))
+{
+ struct luks2_phdr *header;
+ size_t i;
+
+ header = (struct luks2_phdr *) blkid_probe_get_buffer(pr, 0, sizeof(struct luks2_phdr));
+ if (!header)
+ return errno ? -errno : BLKID_PROBE_NONE;
+
+ if (!memcmp(header->magic, LUKS_MAGIC, LUKS_MAGIC_L)) {
+ /* LUKS primary header was found. */
+ return luks_attributes(pr, header, 0);
+ } else {
+ /* No primary header, scan for known offsets of LUKS2 secondary header. */
+ for (i = 0; i < ARRAY_SIZE(secondary_offsets); i++) {
+ header = (struct luks2_phdr *) blkid_probe_get_buffer(pr,
+ secondary_offsets[i], sizeof(struct luks2_phdr));
+
+ if (!header)
+ return errno ? -errno : BLKID_PROBE_NONE;
+
+ if (!memcmp(header->magic, LUKS_MAGIC_2, LUKS_MAGIC_L))
+ return luks_attributes(pr, header, secondary_offsets[i]);
+ }
+ }
+
+ return BLKID_PROBE_NONE;
}
const struct blkid_idinfo luks_idinfo =
@@ -92,9 +130,5 @@ const struct blkid_idinfo luks_idinfo =
.name = "crypto_LUKS",
.usage = BLKID_USAGE_CRYPTO,
.probefunc = probe_luks,
- .magics =
- {
- { .magic = "LUKS\xba\xbe", .len = 6 },
- { NULL }
- }
+ .magics = BLKID_NONE_MAGIC
};
--
2.14.4

View File

@ -0,0 +1,40 @@
From 315960fa9a89248e9d56682c1915567d38fef431 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 7 Jun 2018 12:05:08 +0200
Subject: [PATCH 2/6] losetup: keep -f and <devname> mutually exclusive
losetup tries to blindly use specified device as well as search for
the first free device, the result is:
# losetup /dev/loop1 -f /tmp/tfile_loop1
losetup: /dev/loop1: failed to set up loop device: Invalid argument
fixed version:
# losetup /dev/loop10 -f img
losetup: unexpected arguments
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614364
Upstream: http://github.com/karelzak/util-linux/commit/c3f5a0f1d47dbc47f6d21da232d4eb1cfb7905db
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/losetup.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sys-utils/losetup.c b/sys-utils/losetup.c
index 9c479c02d..e80ceacce 100644
--- a/sys-utils/losetup.c
+++ b/sys-utils/losetup.c
@@ -749,6 +749,9 @@ int main(int argc, char **argv)
*/
act = A_CREATE;
file = argv[optind++];
+
+ if (optind < argc)
+ errx(EXIT_FAILURE, _("unexpected arguments"));
}
if (list && !act && optind == argc)
--
2.14.4

View File

@ -0,0 +1,55 @@
From 4859f218a3be0ae90908fc0ddbef498a784e9b24 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 10 Aug 2018 16:27:41 +0200
Subject: [PATCH 3/6] mount: add ext4 to some places to the man page
Upstream: http://github.com/karelzak/util-linux/commit/d901e4275f7c1899518bab3b34424c90af8dc35e
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614852
---
sys-utils/mount.8 | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/sys-utils/mount.8 b/sys-utils/mount.8
index 562ecb187..1cc792979 100644
--- a/sys-utils/mount.8
+++ b/sys-utils/mount.8
@@ -880,7 +880,7 @@ output for extN filesystems).
The following options apply to any filesystem that is being
mounted (but not every filesystem actually honors them \(en e.g.\&, the
.B sync
-option today has an effect only for ext2, ext3, fat, vfat and ufs):
+option today has an effect only for ext2, ext3, ext4, fat, vfat and ufs):
.TP
.B async
@@ -916,7 +916,8 @@ The
.B context=
option is useful when mounting filesystems that do not support
extended attributes, such as a floppy or hard disk formatted with VFAT, or
-systems that are not normally running under SELinux, such as an ext3 formatted
+systems that are not normally running under SELinux, such as an ext3 or ext4 formatted
+
disk from a non-SELinux workstation. You can also use
.B context=
on filesystems you do not trust, such as a floppy. It also helps in compatibility with
@@ -2314,7 +2315,7 @@ not specified or the filesystem is known for libblkid, for example:
.sp
.B "mount /tmp/disk.img /mnt"
.sp
-.B "mount \-t ext3 /tmp/disk.img /mnt"
+.B "mount \-t ext4 /tmp/disk.img /mnt"
.sp
.RE
This type of mount knows about three options, namely
@@ -2462,7 +2463,7 @@ It is possible for a corrupted filesystem to cause a crash.
.PP
Some Linux filesystems don't support
.BR "\-o sync " nor " \-o dirsync"
-(the ext2, ext3, fat and vfat filesystems
+(the ext2, ext3, ext4, fat and vfat filesystems
.I do
support synchronous updates (a la BSD) when mounted with the
.B sync
--
2.14.4

View File

@ -0,0 +1,29 @@
From 56b9e31e6b9864bba07a25d2244ca0006eed5bb5 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 10 Aug 2018 16:55:14 +0200
Subject: [PATCH 4/6] logger: add -S to the man page
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614843
Upstream: http://github.com/karelzak/util-linux/commit/1f6583930b1061c5e79e09a9f2e80caaf9eeb405
Reported-by: Radka Skvarilova <rskvaril@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/logger.1 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/misc-utils/logger.1 b/misc-utils/logger.1
index f121c4dc9..f9655978d 100644
--- a/misc-utils/logger.1
+++ b/misc-utils/logger.1
@@ -224,7 +224,7 @@ produces:
.fi
.IP
.TP
-.BR \-\-size " \fIsize
+.BR \-S , " -\-size " \fIsize
Sets the maximum permitted message size to \fIsize\fR. The default
is 1KiB characters, which is the limit traditionally used and specified
in RFC 3164. With RFC 5424, this limit has become flexible. A good assumption
--
2.14.4

View File

@ -0,0 +1,76 @@
From e73085fe74356df96b0e694c906f22f9c71a56c7 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 13 Aug 2018 13:49:26 +0200
Subject: [PATCH 5/6] lslogins: add info about single-user output mode
The supported command line synopsis is also
lslogins foo
and it provides different output than
lslogins -l foo
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614967
Signed-off-by: Karel Zak <kzak@redhat.com>
---
login-utils/lslogins.1 | 11 ++++++++++-
login-utils/lslogins.c | 2 +-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/login-utils/lslogins.1 b/login-utils/lslogins.1
index bd6955f82..effd42790 100644
--- a/login-utils/lslogins.1
+++ b/login-utils/lslogins.1
@@ -9,10 +9,17 @@ lslogins \- display information about known users in the system
.RB [ \-s | \-u [ =\fIUID ]]
.RB [ \-g " \fIgroups\fR]"
.RB [ \-l " \fIlogins\fR]"
+.RB [\fIusername\fR]
.SH DESCRIPTION
.PP
Examine the wtmp and btmp logs, /etc/shadow (if necessary) and /etc/passwd
and output the desired data.
+
+The optional argument \fIusername\fR forces
+.BR lslogins
+to print all available details about the specified user only. In this case the
+output format is different than in case of \fB\-l\fR or \fB\-g\fR.
+
.PP
The default action is to list info about all the users in the system.
.SH OPTIONS
@@ -39,7 +46,8 @@ Show information about supplementary groups.
.TP
\fB\-g\fR, \fB\-\-groups\fR=\fIgroups\fR
Only show data of users belonging to \fIgroups\fR. More than one group
-may be specified; the list has to be comma-separated.
+may be specified; the list has to be comma-separated. The unknown group
+names are ignored.
Note that relation between user and group may be invisible for primary group if
the user is not explicitly specify as group member (e.g. in /etc/group). If the
@@ -55,6 +63,7 @@ Display data containing information about the users' last login sessions.
\fB\-l\fR, \fB\-\-logins\fR=\fIlogins\fR
Only show data of users with a login specified in \fIlogins\fR (user names or user
IDS). More than one login may be specified; the list has to be comma-separated.
+The unknown login names are ignored.
.TP
\fB\-n\fR, \fB\-\-newline\fR
Display each piece of information on a separate line.
diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c
index 169962b72..501778e54 100644
--- a/login-utils/lslogins.c
+++ b/login-utils/lslogins.c
@@ -1293,7 +1293,7 @@ static void __attribute__((__noreturn__)) usage(void)
size_t i;
fputs(USAGE_HEADER, out);
- fprintf(out, _(" %s [options]\n"), program_invocation_short_name);
+ fprintf(out, _(" %s [options] [<username>]\n"), program_invocation_short_name);
fputs(USAGE_SEPARATOR, out);
fputs(_("Display information about known users in the system.\n"), out);
--
2.14.4

View File

@ -0,0 +1,105 @@
From 0aa9097f9ecee3688b8659d7f7414f5fb26e147a Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 13 Aug 2018 14:16:28 +0200
Subject: [PATCH 6/6] lslogins: return 1 on "lslogins nonexisting"
The default behavior for -l and -g is to silently ignore unknown login
names, but this is very confusing when you explicitly specify just one
login name.
Note that the current implementation also prints empty "Last log" for
nonexisting user. It seems ugly.
# lslogins nonexisting
Last logs:
new version:
# lslogins nonexisting
lt-lslogins: cannot found 'nonexisting'
# echo $?
1
The -l and -g behaviour has not been changed.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1614967
Signed-off-by: Karel Zak <kzak@redhat.com>
---
login-utils/lslogins.1 | 3 ++-
login-utils/lslogins.c | 16 +++++++++++++---
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/login-utils/lslogins.1 b/login-utils/lslogins.1
index effd42790..c831739d9 100644
--- a/login-utils/lslogins.1
+++ b/login-utils/lslogins.1
@@ -18,7 +18,8 @@ and output the desired data.
The optional argument \fIusername\fR forces
.BR lslogins
to print all available details about the specified user only. In this case the
-output format is different than in case of \fB\-l\fR or \fB\-g\fR.
+output format is different than in case of \fB\-l\fR or \fB\-g\fR and unknown
+is \fIusername\fR reported as an error.
.PP
The default action is to list info about all the users in the system.
diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c
index 501778e54..6f804aa35 100644
--- a/login-utils/lslogins.c
+++ b/login-utils/lslogins.c
@@ -266,6 +266,7 @@ struct lslogins_control {
const char *journal_path;
unsigned int selinux_enabled : 1,
+ fail_on_unknown : 1, /* fail if user does not exist */
ulist_on : 1,
noheadings : 1,
notrunc : 1;
@@ -653,6 +654,7 @@ static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const c
uid_t uid;
errno = 0;
+ errno = 0;
pwd = username ? getpwnam(username) : getpwent();
if (!pwd)
return NULL;
@@ -675,6 +677,7 @@ static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const c
return NULL;
}
+ errno = 0;
grp = getgrgid(pwd->pw_gid);
if (!grp)
return NULL;
@@ -965,10 +968,16 @@ static int create_usertree(struct lslogins_control *ctl)
if (ctl->ulist_on) {
for (n = 0; n < ctl->ulsiz; n++) {
- if (get_user(ctl, &user, ctl->ulist[n]))
+ int rc = get_user(ctl, &user, ctl->ulist[n]);
+
+ if (ctl->fail_on_unknown && !user) {
+ warnx(_("cannot found '%s'"), ctl->ulist[n]);
+ return -1;
+ }
+ if (rc || !user)
continue;
- if (user) /* otherwise an invalid user name has probably been given */
- tsearch(user, &ctl->usertree, cmp_uid);
+
+ tsearch(user, &ctl->usertree, cmp_uid);
}
} else {
while ((user = get_next_user(ctl)))
@@ -1518,6 +1527,7 @@ int main(int argc, char *argv[])
errx(EXIT_FAILURE, _("Only one user may be specified. Use -l for multiple users."));
logins = argv[optind];
outmode = OUT_PRETTY;
+ ctl->fail_on_unknown = 1;
} else if (argc != optind)
errx(EXIT_FAILURE, _("Only one user may be specified. Use -l for multiple users."));
--
2.14.4

View File

@ -0,0 +1,115 @@
From f942ba2c4c14b6bf7720e8316afe1971231553bc Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 31 Aug 2018 12:27:32 +0200
Subject: [PATCH 7/8] libuuid: fix name-based UUIDs
The current version is not fully compatible with RFC4122. It
incorrectly encodes UUID variant
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
where M is UUID version and N is UUID variant.
$ python -c "import uuid ; print(uuid.uuid5(uuid.UUID(int=0), 'foo'))"
aa752cea-8222-5bc8-acd9-555b090c0ccb
^^
Old version:
$ uuidgen --namespace 00000000-0000-0000-0000-000000000000 --name 'foo' --sha1
aa752cea-8222-5bc8-8cd9-555b090c0ccb
^^
Fixed version:
./uuidgen --namespace 00000000-0000-0000-0000-000000000000 --name 'foo' --sha1;
aa752cea-8222-5bc8-acd9-555b090c0ccb
^^
The patch uses uuid_unpack and uuid_pack. It makes code more readable
and allow to access proper octens. The same way we already use for
time and random based UUIDs.
Upstream: http://github.com/karelzak/util-linux/commit/d6ddf07d31dfdc894eb8e7e6842aa856342c526e
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1624877
Addresses: https://github.com/karelzak/util-linux/issues/683
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libuuid/src/gen_uuid.c | 34 ++++++++++++++++------------------
1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/libuuid/src/gen_uuid.c b/libuuid/src/gen_uuid.c
index a374e75c9..27c135db5 100644
--- a/libuuid/src/gen_uuid.c
+++ b/libuuid/src/gen_uuid.c
@@ -96,9 +96,6 @@
#define THREAD_LOCAL static
#endif
-/* index with UUID_VARIANT_xxx and shift 5 bits */
-static unsigned char variant_bits[] = { 0x00, 0x04, 0x06, 0x07 };
-
#ifdef _WIN32
static void gettimeofday (struct timeval *tv, void *dummy)
{
@@ -566,21 +563,22 @@ void uuid_generate_md5(uuid_t out, const uuid_t ns, const char *name, size_t len
{
UL_MD5_CTX ctx;
char hash[UL_MD5LENGTH];
+ uuid_t buf;
+ struct uuid uu;
ul_MD5Init(&ctx);
- /* hash concatenation of well-known UUID with name */
ul_MD5Update(&ctx, ns, sizeof(uuid_t));
ul_MD5Update(&ctx, (const unsigned char *)name, len);
-
ul_MD5Final((unsigned char *)hash, &ctx);
- memcpy(out, hash, sizeof(uuid_t));
+ assert(sizeof(buf) <= sizeof(hash));
- out[6] &= ~(UUID_TYPE_MASK << UUID_TYPE_SHIFT);
- out[6] |= (UUID_TYPE_DCE_MD5 << UUID_TYPE_SHIFT);
+ memcpy(buf, hash, sizeof(buf));
+ uuid_unpack(buf, &uu);
- out[8] &= ~(UUID_VARIANT_MASK << UUID_VARIANT_SHIFT);
- out[8] |= (variant_bits[UUID_VARIANT_DCE] << UUID_VARIANT_SHIFT);
+ uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000;
+ uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) | 0x3000;
+ uuid_pack(&uu, out);
}
/*
@@ -591,20 +589,20 @@ void uuid_generate_sha1(uuid_t out, const uuid_t ns, const char *name, size_t le
{
UL_SHA1_CTX ctx;
char hash[UL_SHA1LENGTH];
+ uuid_t buf;
+ struct uuid uu;
ul_SHA1Init(&ctx);
- /* hash concatenation of well-known UUID with name */
ul_SHA1Update(&ctx, ns, sizeof(uuid_t));
ul_SHA1Update(&ctx, (const unsigned char *)name, len);
-
ul_SHA1Final((unsigned char *)hash, &ctx);
- memcpy(out, hash, sizeof(uuid_t));
+ assert(sizeof(buf) <= sizeof(hash));
- out[6] &= ~(UUID_TYPE_MASK << UUID_TYPE_SHIFT);
- out[6] |= (UUID_TYPE_DCE_SHA1 << UUID_TYPE_SHIFT);
+ memcpy(buf, hash, sizeof(buf));
+ uuid_unpack(buf, &uu);
- out[8] &= ~(UUID_VARIANT_MASK << UUID_VARIANT_SHIFT);
- out[8] |= (variant_bits[UUID_VARIANT_DCE] << UUID_VARIANT_SHIFT);
+ uu.clock_seq = (uu.clock_seq & 0x3FFF) | 0x8000;
+ uu.time_hi_and_version = (uu.time_hi_and_version & 0x0FFF) | 0x5000;
+ uuid_pack(&uu, out);
}
-
--
2.14.4

View File

@ -0,0 +1,25 @@
From 2f75c4cdf6992af034bf02de55ad2ea90608e1c0 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 31 Aug 2018 12:48:46 +0200
Subject: [PATCH 8/8] test: update UUID v5 tests
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1624877
Upstream: http://github.com/karelzak/util-linux/commit/7edaf221d610309874e866670dceb4e2f3a04070
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/expected/uuid/oids | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/expected/uuid/oids b/tests/expected/uuid/oids
index 4644848e8..c121cbeee 100644
--- a/tests/expected/uuid/oids
+++ b/tests/expected/uuid/oids
@@ -1,4 +1,4 @@
3d813cbb-47fb-32ba-91df-831e1593ac29
5df41881-3aed-3515-88a7-2f4a814cf09e
2ed6657d-e927-568b-95e1-2665a8aea6a2
-fcdc2122-78d2-59f7-91ed-041a561ef652
+fcdc2122-78d2-59f7-b1ed-041a561ef652
--
2.14.4

View File

@ -0,0 +1,30 @@
From a0753a5452e293da56e1e8579d17b4eb19a7d6a2 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 30 Nov 2018 12:22:48 +0100
Subject: [PATCH 09/14] tests: enlarge backing file for fstab-btrfs
It seems the new limit for Btrfs is 47MiB.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1656437
Upstream: http://github.com/karelzak/util-linux/commit/7174b93dfda08f87228bb7aec6274fe60af581bd
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/ts/mount/fstab-btrfs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/ts/mount/fstab-btrfs b/tests/ts/mount/fstab-btrfs
index 090f52304..54c6bb8ba 100755
--- a/tests/ts/mount/fstab-btrfs
+++ b/tests/ts/mount/fstab-btrfs
@@ -42,7 +42,7 @@ TS_MOUNTPOINT_SUBVOL="$TS_MOUNTPOINT-subvol"
TS_MOUNTPOINT_SUBVOLID="$TS_MOUNTPOINT-subvolid"
TS_MOUNTPOINT_BIND="$TS_MOUNTPOINT-bind"
-ts_device_init 42
+ts_device_init 50
DEVICE=$TS_LODEV
[ -d "$TS_MOUNTPOINT_CREATE" ] || mkdir -p "$TS_MOUNTPOINT_CREATE"
[ -d "$TS_MOUNTPOINT_DEFAULT" ] || mkdir -p "$TS_MOUNTPOINT_DEFAULT"
--
2.17.2

View File

@ -0,0 +1,81 @@
From b48e972b3aa32710ed0495c35b2184f5d3ec9eb0 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 30 Nov 2018 12:24:15 +0100
Subject: [PATCH 10/14] tests: make lsns-netnsid portable
It seems ip(8) link-show command does not provide link-netnsid in all
cases (versions ?). Let's try to use "ip netns list-id" as fallback.
This commit also add possibility to debug the script by $LOG variable.
Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1656437
Upstream: http://github.com/karelzak/util-linux/commit/0d79f5805ff2d7651ec70b06753e908cc782857a
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/ts/lsns/netnsid | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/tests/ts/lsns/netnsid b/tests/ts/lsns/netnsid
index 72c14de6c..9d04f28f0 100755
--- a/tests/ts/lsns/netnsid
+++ b/tests/ts/lsns/netnsid
@@ -36,6 +36,7 @@ vethb=lsns-vethb
NS=LSNS-TEST-NETNSID-NS
FIFO=$TS_OUTDIR/FIFO-NETNSID
NULL=/dev/null
+LOG=/dev/null #/root/foo.log
function cleanup {
ip link delete $vetha 2> $NULL || :
@@ -43,24 +44,47 @@ function cleanup {
rm -f $FIFO
}
+echo "==Cleanup" >> $LOG
cleanup
+
+echo "==Create FIFO" >> $LOG
mkfifo $FIFO
+echo "==Netns ADD" >> $LOG
if ip netns add $NS &&
ip link add name $vetha type veth peer name $vethb &&
ip link set $vethb netns $NS; then
+ echo "===Netns EXEC" >> $LOG
ip netns exec $NS dd if=$FIFO bs=1 count=2 of=$NULL 2> $NULL &
PID=$!
+ echo "====PID=$PID" >> $LOG
else
cleanup
ts_skip "failed to initialize"
fi
{
+ echo "==Write to FIFO" >> $LOG
dd if=/dev/zero bs=1 count=1 2> $NULL
{
- ip -o link show dev $vetha > $NULL
+ echo "===IP output" >> $LOG
+ ip -o link show dev $vetha >> $LOG
+
IP_ID=$(ip -o link show dev $vetha | sed -ne 's/.* *link-netnsid *\([0-9]*\)/\1/p')
+ echo "====ip show: IP_ID=$IP_ID" >> $LOG
+
+ if [ "x$IP_ID" = "x" ]; then
+ echo "===IP output list id" >> $LOG
+ ip netns list-id >> $LOG
+
+ IP_ID=$(ip netns list-id | awk "/name: $NS/ { print \$2 }")
+ echo "====ip list-id: IP_ID=$IP_ID" >> $LOG
+ fi
+
+ echo "===LSNS output" >> $LOG
+ $TS_CMD_LSNS -o+NETNSID,NSFS --type net >> $LOG
+
LSNS_ID=$($TS_CMD_LSNS -n -o NETNSID --type net --task $PID | { read VAL; echo $VAL; } )
+ echo "===LSNS_ID=$LSNS_ID" >> $LOG
}
dd if=/dev/zero bs=1 count=1 2> $NULL
} > $FIFO
--
2.17.2

View File

@ -0,0 +1,111 @@
From c2b650ebe33a001b3bf19912b136dbbff5495600 Mon Sep 17 00:00:00 2001
From: Frank Schaefer <kelledin@gmail.com>
Date: Tue, 10 Jul 2018 20:21:02 -0500
Subject: [PATCH 11/14] tests: break up large strings for PySys_WriteStdout()
Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1656437
Upstream: http://github.com/karelzak/util-linux/commit/8a12ab57755afc36546834f175ef0b9e9376ba59
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/python/fs.c | 56 ++++++++++++++++++++++++++++++++++----------
1 file changed, 43 insertions(+), 13 deletions(-)
diff --git a/libmount/python/fs.c b/libmount/python/fs.c
index d6490d248..634a914ef 100644
--- a/libmount/python/fs.c
+++ b/libmount/python/fs.c
@@ -63,32 +63,62 @@ static PyObject *Fs_get_devno(FsObject *self)
return PyObjectResultInt(mnt_fs_get_devno(self->fs));
}
+static void _dump_debug_string(const char *lead, const char *s, char quote)
+{
+ /* PySys_WriteStdout() will automatically truncate any '%s' token
+ * longer than a certain length (documented as 1000 bytes, but we
+ * give ourselves some margin here just in case). The only way I
+ * know to get around this is to print such strings in bite-sized
+ * chunks.
+ */
+ static const unsigned int _PY_MAX_LEN = 900;
+ static const char *_PY_MAX_LEN_FMT = "%.900s";
+ unsigned int len;
+
+ if (lead != NULL)
+ PySys_WriteStdout("%s", lead);
+
+ if (quote != 0)
+ PySys_WriteStdout("%c", quote);
+
+ for (len = strlen(s); len > _PY_MAX_LEN; len -= _PY_MAX_LEN, s += _PY_MAX_LEN)
+ PySys_WriteStdout(_PY_MAX_LEN_FMT, s);
+
+ if (len > 0)
+ PySys_WriteStdout(_PY_MAX_LEN_FMT, s);
+
+ if (quote != 0)
+ PySys_WriteStdout("%c\n", quote);
+ else
+ PySys_WriteStdout("\n");
+}
+
#define Fs_print_debug_HELP "print_debug()\n\n"
static PyObject *Fs_print_debug(FsObject *self)
{
PySys_WriteStdout("------ fs: %p\n", self->fs);
- PySys_WriteStdout("source: %s\n", mnt_fs_get_source(self->fs));
- PySys_WriteStdout("target: %s\n", mnt_fs_get_target(self->fs));
- PySys_WriteStdout("fstype: %s\n", mnt_fs_get_fstype(self->fs));
+ _dump_debug_string("source: ", mnt_fs_get_source(self->fs), 0);
+ _dump_debug_string("target: ", mnt_fs_get_target(self->fs), 0);
+ _dump_debug_string("fstype: ", mnt_fs_get_fstype(self->fs), 0);
if (mnt_fs_get_options(self->fs))
- PySys_WriteStdout("optstr: %s\n", mnt_fs_get_options(self->fs));
+ _dump_debug_string("optstr: ", mnt_fs_get_options(self->fs), 0);
if (mnt_fs_get_vfs_options(self->fs))
- PySys_WriteStdout("VFS-optstr: %s\n", mnt_fs_get_vfs_options(self->fs));
+ _dump_debug_string("VFS-optstr: ", mnt_fs_get_vfs_options(self->fs), 0);
if (mnt_fs_get_fs_options(self->fs))
- PySys_WriteStdout("FS-opstr: %s\n", mnt_fs_get_fs_options(self->fs));
+ _dump_debug_string("FS-opstr: ", mnt_fs_get_fs_options(self->fs), 0);
if (mnt_fs_get_user_options(self->fs))
- PySys_WriteStdout("user-optstr: %s\n", mnt_fs_get_user_options(self->fs));
+ _dump_debug_string("user-optstr: ", mnt_fs_get_user_options(self->fs), 0);
if (mnt_fs_get_optional_fields(self->fs))
- PySys_WriteStdout("optional-fields: '%s'\n", mnt_fs_get_optional_fields(self->fs));
+ _dump_debug_string("optional-fields: ", mnt_fs_get_optional_fields(self->fs), '\'');
if (mnt_fs_get_attributes(self->fs))
- PySys_WriteStdout("attributes: %s\n", mnt_fs_get_attributes(self->fs));
+ _dump_debug_string("attributes: ", mnt_fs_get_attributes(self->fs), 0);
if (mnt_fs_get_root(self->fs))
- PySys_WriteStdout("root: %s\n", mnt_fs_get_root(self->fs));
+ _dump_debug_string("root: ", mnt_fs_get_root(self->fs), 0);
if (mnt_fs_get_swaptype(self->fs))
- PySys_WriteStdout("swaptype: %s\n", mnt_fs_get_swaptype(self->fs));
+ _dump_debug_string("swaptype: ", mnt_fs_get_swaptype(self->fs), 0);
if (mnt_fs_get_size(self->fs))
PySys_WriteStdout("size: %jd\n", mnt_fs_get_size(self->fs));
if (mnt_fs_get_usedsize(self->fs))
@@ -97,7 +127,7 @@ static PyObject *Fs_print_debug(FsObject *self)
PySys_WriteStdout("priority: %d\n", mnt_fs_get_priority(self->fs));
if (mnt_fs_get_bindsrc(self->fs))
- PySys_WriteStdout("bindsrc: %s\n", mnt_fs_get_bindsrc(self->fs));
+ _dump_debug_string("bindsrc: ", mnt_fs_get_bindsrc(self->fs), 0);
if (mnt_fs_get_freq(self->fs))
PySys_WriteStdout("freq: %d\n", mnt_fs_get_freq(self->fs));
if (mnt_fs_get_passno(self->fs))
@@ -112,7 +142,7 @@ static PyObject *Fs_print_debug(FsObject *self)
if (mnt_fs_get_tid(self->fs))
PySys_WriteStdout("tid: %d\n", mnt_fs_get_tid(self->fs));
if (mnt_fs_get_comment(self->fs))
- PySys_WriteStdout("comment: '%s'\n", mnt_fs_get_comment(self->fs));
+ _dump_debug_string("comment: ", mnt_fs_get_comment(self->fs), '\'');
return UL_IncRef(self);
}
/*
--
2.17.2

View File

@ -0,0 +1,33 @@
From 0afd0613fc738659fb0ff490e4e069366dee4a94 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 10 Dec 2018 16:25:08 +0100
Subject: [PATCH 12/14] libmount: (umount) make mnt_stat_mountpoin() usable for
relative paths
# mount -o loop devicefile /mnt/test
# umount devicefile
umount: devicefile: not mounted.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1653781
Upstream: http://github.com/karelzak/util-linux/commit/2859592ecb7b48d47d2e34d589ea35f76e329416
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/utils.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libmount/src/utils.c b/libmount/src/utils.c
index fd98d0529..c36187c07 100644
--- a/libmount/src/utils.c
+++ b/libmount/src/utils.c
@@ -121,7 +121,7 @@ static int fstype_cmp(const void *v1, const void *v2)
int mnt_stat_mountpoint(const char *target, struct stat *st)
{
#ifdef AT_NO_AUTOMOUNT
- return fstatat(-1, target, st, AT_NO_AUTOMOUNT);
+ return fstatat(AT_FDCWD, target, st, AT_NO_AUTOMOUNT);
#else
return stat(target, st);
#endif
--
2.17.2

View File

@ -0,0 +1,65 @@
From 5aea6937edf77a753e0d504bb637214e116aaed2 Mon Sep 17 00:00:00 2001
From: KyleMahlkuch <Kyle.Mahlkuch@ibm.com>
Date: Mon, 25 Jun 2018 14:52:01 -0500
Subject: [PATCH 13/14] libfdisk: Fix multipath partition seperators for
user-friendly names
The current code assumes "-part" is the only partition sepereator
but this is not true for some distros.
For example in Ubuntu 18.04 fdisk does not print the correct names for
mpatha:
~# ls -l /dev/mapper/mpatha*
lrwxrwxrwx 1 root root 7 Feb 1 04:39 /dev/mapper/mpatha -> ../dm-0
lrwxrwxrwx 1 root root 7 Feb 1 04:38 /dev/mapper/mpatha1 -> ../dm-4
lrwxrwxrwx 1 root root 7 Feb 1 04:38 /dev/mapper/mpatha2 -> ../dm-5
lrwxrwxrwx 1 root root 7 Feb 1 04:38 /dev/mapper/mpatha3 -> ../dm-6
~# fdisk -l /dev/mapper/mpatha
Device Boot Start End Sectors Size Id Type
/dev/mapper/mpatha-part1 2048 419432447 419430400 200G 83 Linux
/dev/mapper/mpatha-part2 419432448 838862847 419430400 200G 83 Linux
/dev/mapper/mpatha-part3 838862848 1258291199 419428352 200G 83 Linux
Instead of assuming a partition seperator of "-part" this patch uses
access to check the file system for a partition seperator of "p" or
the absense of a partition seperator. If neither of these work the patch
defaults to "-part" like we had before this patch.
Upstream: http://github.com/karelzak/util-linux/commit/73775189767195f1d9f5b6b6f6a54e51f61c4356
Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1655650
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libfdisk/src/utils.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/libfdisk/src/utils.c b/libfdisk/src/utils.c
index 5ba9e0466..54e28b2fa 100644
--- a/libfdisk/src/utils.c
+++ b/libfdisk/src/utils.c
@@ -153,7 +153,20 @@ char *fdisk_partname(const char *dev, size_t partno)
if ((strncmp(dev, _PATH_DEV_BYID, sizeof(_PATH_DEV_BYID) - 1) == 0) ||
strncmp(dev, _PATH_DEV_BYPATH, sizeof(_PATH_DEV_BYPATH) - 1) == 0 ||
strncmp(dev, "/dev/mapper", sizeof("/dev/mapper") - 1) == 0) {
- p = "-part";
+ asprintf(&res, "%.*s%zu", w, dev, partno);
+ if (access(res, F_OK) == 0){
+ p = "";
+ } else {
+ /* check for partition seperator "p" */
+ p = "p";
+ free(res);
+ asprintf(&res, "%.*s%s%zu", w, dev, p, partno);
+ if (access(res, F_OK) != 0){
+ /* otherwise, default to "-path" */
+ p = "-part";
+ }
+ }
+ free(res);
}
if (asprintf(&res, "%.*s%s%zu", w, dev, p, partno) <= 0)
--
2.17.2

View File

@ -0,0 +1,136 @@
From 64473a830dc93e7fcd246a64bb8389d66f0034b8 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 29 Nov 2018 13:21:36 +0100
Subject: [PATCH 14/14] blkid: make PART_ENTRY_* tags optional (add
--no-part-details)
blkid(8) returns information from partition table also for empty
partitions. This is necessary for example for udev, but it could be
confusing if you care about on-device content only.
Default:
# blkid -p /dev/md0p1; echo $?
/dev/md0p1: PART_ENTRY_SCHEME="dos" PART_ENTRY_UUID="6d8796b1-01" PART_ENTRY_TYPE="0x83" PART_ENTRY_NUMBER="1" PART_ENTRY_OFFSET="2048" PART_ENTRY_SIZE="204800" PART_ENTRY_DISK="9:0"
0
With --no-part-details:
# blkid -p /dev/md0p1 --no-part-details; echo $?
2
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1653413
Upstream: http://github.com/karelzak/util-linux/commit/5e91d5dd716ebc6144bcb0cabb0ec847a678be9e
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/blkid.8 | 6 +++++-
misc-utils/blkid.c | 15 +++++++++++----
2 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/misc-utils/blkid.8 b/misc-utils/blkid.8
index 13b5edb4d..d1cec1dea 100644
--- a/misc-utils/blkid.8
+++ b/misc-utils/blkid.8
@@ -35,6 +35,7 @@ blkid \- locate/print block device attributes
.IR list ]
.RB [ \-\-usages
.IR list ]
+.RB [ \-\-no\-part\-details ]
.IR device " ..."
.IP \fBblkid\fR
@@ -114,6 +115,9 @@ Don't encode non-printing characters. The non-printing characters are encoded
by ^ and M- notation by default. Note that the \fB\-\-output udev\fR output format uses
a different encoding which cannot be disabled.
.TP
+\fB\-D\fR, \fB\-\-no\-part\-details\fR
+Don't print information (PART_ENTRY_* tags) from partition table in low-level probing mode.
+.TP
\fB\-g\fR, \fB\-\-garbage\-collect\fR
Perform a garbage collection pass on the blkid cache to remove
devices which no longer exist.
@@ -224,7 +228,7 @@ Note that low-level probing also returns information about partition table type
(PTTYPE tag) and partitions (PART_ENTRY_* tags). The tag names produced by
low-level probing are based on names used internally by libblkid and it may be
different than when executed without \fB\-\-probe\fR (for example PART_ENTRY_UUID= vs
-PARTUUID=).
+PARTUUID=). See also \fB\-\-no\-part\-details\fR.
.TP
\fB\-s\fR, \fB\-\-match\-tag\fR \fItag\fR
For each (specified) device, show only the tags that match
diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c
index 4cd85317f..61a6994c2 100644
--- a/misc-utils/blkid.c
+++ b/misc-utils/blkid.c
@@ -58,6 +58,7 @@ struct blkid_control {
lowprobe:1,
lowprobe_superblocks:1,
lowprobe_topology:1,
+ no_part_details:1,
raw_chars:1;
};
@@ -101,6 +102,7 @@ static void __attribute__((__noreturn__)) usage(void)
fputs(_( " -O, --offset <offset> probe at the given offset\n"), out);
fputs(_( " -u, --usages <list> filter by \"usage\" (e.g. -u filesystem,raid)\n"), out);
fputs(_( " -n, --match-types <list> filter by filesystem type (e.g. -n vfat,ext3)\n"), out);
+ fputs(_( " -D, --no-part-details don't print info from partition table\n"), out);
fputs(USAGE_SEPARATOR, out);
printf(USAGE_HELP_OPTIONS(28));
@@ -444,7 +446,7 @@ done:
return rc;
}
-static int lowprobe_superblocks(blkid_probe pr)
+static int lowprobe_superblocks(blkid_probe pr, struct blkid_control *ctl)
{
struct stat st;
int rc, fd = blkid_probe_get_fd(pr);
@@ -470,7 +472,8 @@ static int lowprobe_superblocks(blkid_probe pr)
return 0; /* partition table detected */
}
- blkid_probe_set_partitions_flags(pr, BLKID_PARTS_ENTRY_DETAILS);
+ if (!ctl->no_part_details)
+ blkid_probe_set_partitions_flags(pr, BLKID_PARTS_ENTRY_DETAILS);
blkid_probe_enable_superblocks(pr, 1);
return blkid_do_safeprobe(pr);
@@ -509,7 +512,7 @@ static int lowprobe_device(blkid_probe pr, const char *devname,
if (ctl->lowprobe_topology)
rc = lowprobe_topology(pr);
if (rc >= 0 && ctl->lowprobe_superblocks)
- rc = lowprobe_superblocks(pr);
+ rc = lowprobe_superblocks(pr, ctl);
if (rc < 0)
goto done;
@@ -661,6 +664,7 @@ int main(int argc, char **argv)
static const struct option longopts[] = {
{ "cache-file", required_argument, NULL, 'c' },
{ "no-encoding", no_argument, NULL, 'd' },
+ { "no-part-details", no_argument, NULL, 'D' },
{ "garbage-collect", no_argument, NULL, 'g' },
{ "output", required_argument, NULL, 'o' },
{ "list-filesystems", no_argument, NULL, 'k' },
@@ -694,7 +698,7 @@ int main(int argc, char **argv)
strutils_set_exitcode(BLKID_EXIT_OTHER);
while ((c = getopt_long (argc, argv,
- "c:dghilL:n:ko:O:ps:S:t:u:U:w:Vv", longopts, NULL)) != -1) {
+ "c:DdghilL:n:ko:O:ps:S:t:u:U:w:Vv", longopts, NULL)) != -1) {
err_exclusive_options(c, NULL, excl, excl_st);
@@ -705,6 +709,9 @@ int main(int argc, char **argv)
case 'd':
ctl.raw_chars = 1;
break;
+ case 'D':
+ ctl.no_part_details = 1;
+ break;
case 'L':
ctl.eval = 1;
search_value = xstrdup(optarg);
--
2.17.2

View File

@ -0,0 +1,132 @@
From 9bccbbf06a91f4e7bf5c0cddadf18265dc2e9e4b Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 4 Mar 2019 16:42:30 +0100
Subject: [PATCH 15/19] tests: add missing ts_check_test_command calls
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062
Upstream: http://github.com/karelzak/util-linux/commit/19e00ec9e9e9c36305cf2dd163d0333e2d72c671
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/ts/fsck/ismounted | 2 ++
tests/ts/hexdump/format-strings | 1 +
tests/ts/hexdump/highlighting | 1 +
tests/ts/ipcs/limits | 1 +
tests/ts/ipcs/limits2 | 1 +
tests/ts/ipcs/mk-rm-msg | 1 +
tests/ts/ipcs/mk-rm-sem | 1 +
tests/ts/ipcs/mk-rm-shm | 1 +
tests/ts/misc/swaplabel | 1 +
9 files changed, 10 insertions(+)
diff --git a/tests/ts/fsck/ismounted b/tests/ts/fsck/ismounted
index 2a55907a7..7d1fe6273 100755
--- a/tests/ts/fsck/ismounted
+++ b/tests/ts/fsck/ismounted
@@ -22,6 +22,8 @@ ts_init "$*"
ts_check_test_command "$TS_CMD_FDISK"
ts_check_test_command "$TS_CMD_MOUNT"
+ts_check_test_command "$TS_CMD_UMOUNT"
+ts_check_test_command "$TS_HELPER_ISMOUNTED"
ts_skip_nonroot
ts_check_losetup
diff --git a/tests/ts/hexdump/format-strings b/tests/ts/hexdump/format-strings
index e6f9229a5..f2dc6a89b 100755
--- a/tests/ts/hexdump/format-strings
+++ b/tests/ts/hexdump/format-strings
@@ -23,6 +23,7 @@ FILES="$TS_TOPDIR/ts/hexdump/files"
ts_init "$*"
ts_check_test_command "$TS_CMD_HEXDUMP"
+ts_check_test_command "$TS_HELPER_SYSINFO"
# on big endian systems some of the subtests have different expected output
BYTE_ORDER=$($TS_HELPER_SYSINFO byte-order)
diff --git a/tests/ts/hexdump/highlighting b/tests/ts/hexdump/highlighting
index cf78f7b96..e57757978 100755
--- a/tests/ts/hexdump/highlighting
+++ b/tests/ts/hexdump/highlighting
@@ -25,6 +25,7 @@ ADDRFMT='-e "%07.7_Ax\n"'
ts_init "$*"
ts_check_test_command "$TS_CMD_HEXDUMP"
+ts_check_test_command "$TS_HELPER_SYSINFO"
# on big endian systems some of the subtests have different expected output
BYTE_ORDER=$($TS_HELPER_SYSINFO byte-order)
diff --git a/tests/ts/ipcs/limits b/tests/ts/ipcs/limits
index 7b64b3c17..671f23c77 100755
--- a/tests/ts/ipcs/limits
+++ b/tests/ts/ipcs/limits
@@ -23,6 +23,7 @@ TS_DESC="limits overflow"
ts_init "$*"
ts_check_test_command "$TS_CMD_IPCS"
+ts_check_test_command "$TS_HELPER_SYSINFO"
ts_skip_nonroot
ts_check_prog "bc"
diff --git a/tests/ts/ipcs/limits2 b/tests/ts/ipcs/limits2
index d23c41a35..77ad70f9b 100755
--- a/tests/ts/ipcs/limits2
+++ b/tests/ts/ipcs/limits2
@@ -23,6 +23,7 @@ TS_DESC="basic limits"
ts_init "$*"
ts_check_test_command "$TS_CMD_IPCS"
+ts_check_test_command "$TS_HELPER_SYSINFO"
ts_check_prog "bc"
. $TS_SELF/functions.sh
diff --git a/tests/ts/ipcs/mk-rm-msg b/tests/ts/ipcs/mk-rm-msg
index 25460e25d..de3682e87 100755
--- a/tests/ts/ipcs/mk-rm-msg
+++ b/tests/ts/ipcs/mk-rm-msg
@@ -21,6 +21,7 @@ ts_init "$*"
ts_check_test_command "$TS_CMD_IPCS"
ts_check_test_command "$TS_CMD_IPCMK"
ts_check_test_command "$TS_CMD_IPCRM"
+ts_check_test_command "$TS_HELPER_SYSINFO"
. $TS_SELF/functions.sh
diff --git a/tests/ts/ipcs/mk-rm-sem b/tests/ts/ipcs/mk-rm-sem
index 61e0cfdef..d7b505f7c 100755
--- a/tests/ts/ipcs/mk-rm-sem
+++ b/tests/ts/ipcs/mk-rm-sem
@@ -21,6 +21,7 @@ ts_init "$*"
ts_check_test_command "$TS_CMD_IPCS"
ts_check_test_command "$TS_CMD_IPCMK"
ts_check_test_command "$TS_CMD_IPCRM"
+ts_check_test_command "$TS_HELPER_SYSINFO"
. $TS_SELF/functions.sh
diff --git a/tests/ts/ipcs/mk-rm-shm b/tests/ts/ipcs/mk-rm-shm
index 838fb3f21..c21547b82 100755
--- a/tests/ts/ipcs/mk-rm-shm
+++ b/tests/ts/ipcs/mk-rm-shm
@@ -21,6 +21,7 @@ ts_init "$*"
ts_check_test_command "$TS_CMD_IPCS"
ts_check_test_command "$TS_CMD_IPCMK"
ts_check_test_command "$TS_CMD_IPCRM"
+ts_check_test_command "$TS_HELPER_SYSINFO"
. $TS_SELF/functions.sh
diff --git a/tests/ts/misc/swaplabel b/tests/ts/misc/swaplabel
index 646304508..22858b0ac 100755
--- a/tests/ts/misc/swaplabel
+++ b/tests/ts/misc/swaplabel
@@ -20,6 +20,7 @@ ts_init "$*"
ts_check_test_command "$TS_CMD_MKSWAP"
ts_check_test_command "$TS_CMD_SWAPLABEL"
+ts_check_test_command "$TS_HELPER_SYSINFO"
# fallocate does not work on most file systems
function fallocate_or_skip()
--
2.20.1

View File

@ -0,0 +1,357 @@
From 748fbfa9b1bb3b64b3fbc6b1e51d260d8376c791 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 4 Mar 2019 17:10:04 +0100
Subject: [PATCH 16/19] tests: add --use-system-commands
This change allows to use commands from $PATH rather than from
$top_builddir. There two basic use cases:
* check differences between installed and git version
run.sh --use-system-command --show-diff
* check system binaries by upstream tests (for example tests from
src.rpm package)
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062
Upstream: http://github.com/karelzak/util-linux/commit/43b4a4d3c720a4e65fe9de884cd73e0b1b94fbe
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/commands.sh | 194 ++++++++++++++++++++++-----------------------
tests/functions.sh | 34 ++++++--
tests/run.sh | 33 +++++---
3 files changed, 146 insertions(+), 115 deletions(-)
diff --git a/tests/commands.sh b/tests/commands.sh
index 1be2d25b4..93100caf6 100644
--- a/tests/commands.sh
+++ b/tests/commands.sh
@@ -2,105 +2,105 @@
TS_TESTUSER=${TS_TESTUSER:-"nobody"}
# helpers
-TS_HELPER_BYTESWAP="$top_builddir/test_byteswap"
-TS_HELPER_CPUSET="$top_builddir/test_cpuset"
-TS_HELPER_DMESG="$top_builddir/test_dmesg"
-TS_HELPER_ISLOCAL="$top_builddir/test_islocal"
-TS_HELPER_ISMOUNTED="$top_builddir/test_ismounted"
-TS_HELPER_LIBFDISK_GPT="$top_builddir/test_fdisk_gpt"
-TS_HELPER_LIBFDISK_MKPART="$top_builddir/sample-fdisk-mkpart"
-TS_HELPER_LIBMOUNT_CONTEXT="$top_builddir/test_mount_context"
-TS_HELPER_LIBFDISK_MKPART_FULLSPEC="$top_builddir/sample-fdisk-mkpart-fullspec"
-TS_HELPER_LIBMOUNT_LOCK="$top_builddir/test_mount_lock"
-TS_HELPER_LIBMOUNT_OPTSTR="$top_builddir/test_mount_optstr"
-TS_HELPER_LIBMOUNT_TABDIFF="$top_builddir/test_mount_tab_diff"
-TS_HELPER_LIBMOUNT_TAB="$top_builddir/test_mount_tab"
-TS_HELPER_LIBMOUNT_UPDATE="$top_builddir/test_mount_tab_update"
-TS_HELPER_LIBMOUNT_UTILS="$top_builddir/test_mount_utils"
-TS_HELPER_LIBMOUNT_DEBUG="$top_builddir/test_mount_debug"
-TS_HELPER_LIBSMARTCOLS_FROMFILE="$top_builddir/sample-scols-fromfile"
-TS_HELPER_LIBSMARTCOLS_TITLE="$top_builddir/sample-scols-title"
+TS_HELPER_BYTESWAP="${ts_helpersdir}test_byteswap"
+TS_HELPER_CPUSET="${ts_helpersdir}test_cpuset"
+TS_HELPER_DMESG="${ts_helpersdir}test_dmesg"
+TS_HELPER_ISLOCAL="${ts_helpersdir}test_islocal"
+TS_HELPER_ISMOUNTED="${ts_helpersdir}test_ismounted"
+TS_HELPER_LIBFDISK_GPT="${ts_helpersdir}test_fdisk_gpt"
+TS_HELPER_LIBFDISK_MKPART="${ts_helpersdir}sample-fdisk-mkpart"
+TS_HELPER_LIBMOUNT_CONTEXT="${ts_helpersdir}test_mount_context"
+TS_HELPER_LIBFDISK_MKPART_FULLSPEC="${ts_helpersdir}sample-fdisk-mkpart-fullspec"
+TS_HELPER_LIBMOUNT_LOCK="${ts_helpersdir}test_mount_lock"
+TS_HELPER_LIBMOUNT_OPTSTR="${ts_helpersdir}test_mount_optstr"
+TS_HELPER_LIBMOUNT_TABDIFF="${ts_helpersdir}test_mount_tab_diff"
+TS_HELPER_LIBMOUNT_TAB="${ts_helpersdir}test_mount_tab"
+TS_HELPER_LIBMOUNT_UPDATE="${ts_helpersdir}test_mount_tab_update"
+TS_HELPER_LIBMOUNT_UTILS="${ts_helpersdir}test_mount_utils"
+TS_HELPER_LIBMOUNT_DEBUG="${ts_helpersdir}test_mount_debug"
+TS_HELPER_LIBSMARTCOLS_FROMFILE="${ts_helpersdir}sample-scols-fromfile"
+TS_HELPER_LIBSMARTCOLS_TITLE="${ts_helpersdir}sample-scols-title"
TS_HELPER_PYLIBMOUNT_CONTEXT="$top_srcdir/libmount/python/test_mount_context.py"
TS_HELPER_PYLIBMOUNT_TAB="$top_srcdir/libmount/python/test_mount_tab.py"
TS_HELPER_PYLIBMOUNT_UPDATE="$top_srcdir/libmount/python/test_mount_tab_update.py"
-TS_HELPER_LOGGER="$top_builddir/test_logger"
-TS_HELPER_LOGINDEFS="$top_builddir/test_logindefs"
-TS_HELPER_MD5="$top_builddir/test_md5"
-TS_HELPER_SHA1="$top_builddir/test_sha1"
-TS_HELPER_MKFS_MINIX="$top_builddir/test_mkfs_minix"
-TS_HELPER_MORE=${TS_HELPER_MORE-"$top_builddir/test_more"}
-TS_HELPER_PARTITIONS="$top_builddir/sample-partitions"
-TS_HELPER_PATHS="$top_builddir/test_pathnames"
-TS_HELPER_SCRIPT="$top_builddir/test_script"
-TS_HELPER_SIGRECEIVE="$top_builddir/test_sigreceive"
-TS_HELPER_STRUTILS="$top_builddir/test_strutils"
-TS_HELPER_SYSINFO="$top_builddir/test_sysinfo"
-TS_HELPER_TIOCSTI="$top_builddir/test_tiocsti"
-TS_HELPER_UUID_PARSER="$top_builddir/test_uuid_parser"
-TS_HELPER_UUID_NAMESPACE="$top_builddir/test_uuid_namespace"
-TS_HELPER_MBSENCODE="$top_builddir/test_mbsencode"
-TS_HELPER_CAL="$top_builddir/test_cal"
+TS_HELPER_LOGGER="${ts_helpersdir}test_logger"
+TS_HELPER_LOGINDEFS="${ts_helpersdir}test_logindefs"
+TS_HELPER_MD5="${ts_helpersdir}test_md5"
+TS_HELPER_SHA1="${ts_helpersdir}test_sha1"
+TS_HELPER_MKFS_MINIX="${ts_helpersdir}test_mkfs_minix"
+TS_HELPER_MORE=${TS_HELPER_MORE-"${ts_helpersdir}test_more"}
+TS_HELPER_PARTITIONS="${ts_helpersdir}sample-partitions"
+TS_HELPER_PATHS="${ts_helpersdir}test_pathnames"
+TS_HELPER_SCRIPT="${ts_helpersdir}test_script"
+TS_HELPER_SIGRECEIVE="${ts_helpersdir}test_sigreceive"
+TS_HELPER_STRUTILS="${ts_helpersdir}test_strutils"
+TS_HELPER_SYSINFO="${ts_helpersdir}test_sysinfo"
+TS_HELPER_TIOCSTI="${ts_helpersdir}test_tiocsti"
+TS_HELPER_UUID_PARSER="${ts_helpersdir}test_uuid_parser"
+TS_HELPER_UUID_NAMESPACE="${ts_helpersdir}test_uuid_namespace"
+TS_HELPER_MBSENCODE="${ts_helpersdir}test_mbsencode"
+TS_HELPER_CAL="${ts_helpersdir}test_cal"
# paths to commands
-TS_CMD_ADDPART=${TS_CMD_ADDPART:-"$top_builddir/addpart"}
-TS_CMD_DELPART=${TS_CMD_DELPART:-"$top_builddir/delpart"}
-TS_CMD_BLKDISCARD=${TS_CMD_BLKID-"$top_builddir/blkdiscard"}
-TS_CMD_BLKID=${TS_CMD_BLKID-"$top_builddir/blkid"}
-TS_CMD_CAL=${TS_CMD_CAL-"$top_builddir/cal"}
-TS_CMD_COLCRT=${TS_CMD_COLCRT:-"$top_builddir/colcrt"}
-TS_CMD_COLRM=${TS_CMD_COLRM:-"$top_builddir/colrm"}
-TS_CMD_COL=${TS_CMD_COL:-"$top_builddir/col"}
-TS_CMD_COLUMN=${TS_CMD_COLUMN:-"$top_builddir/column"}
-TS_CMD_EJECT=${TS_CMD_EJECT-"$top_builddir/eject"}
-TS_CMD_FALLOCATE=${TS_CMD_FALLOCATE-"$top_builddir/fallocate"}
-TS_CMD_FDISK=${TS_CMD_FDISK-"$top_builddir/fdisk"}
-TS_CMD_FLOCK=${TS_CMD_FLOCK-"$top_builddir/flock"}
-TS_CMD_SFDISK=${TS_CMD_SFDISK-"$top_builddir/sfdisk"}
-TS_CMD_FINCORE=${TS_CMD_FINCORE-"$top_builddir/fincore"}
-TS_CMD_FINDMNT=${TS_CMD_FINDMNT-"$top_builddir/findmnt"}
-TS_CMD_FSCKCRAMFS=${TS_CMD_FSCKCRAMFS:-"$top_builddir/fsck.cramfs"}
-TS_CMD_FSCKMINIX=${TS_CMD_FSCKMINIX:-"$top_builddir/fsck.minix"}
-TS_CMD_GETOPT=${TS_CMD_GETOPT-"$top_builddir/getopt"}
-TS_CMD_HEXDUMP=${TS_CMD_HEXDUMP-"$top_builddir/hexdump"}
-TS_CMD_HWCLOCK=${TS_CMD_HWCLOCK-"$top_builddir/hwclock"}
-TS_CMD_IONICE=${TS_CMD_IONICE-"$top_builddir/ionice"}
-TS_CMD_IPCMK=${TS_CMD_IPCMK-"$top_builddir/ipcmk"}
-TS_CMD_IPCRM=${TS_CMD_IPCRM-"$top_builddir/ipcrm"}
-TS_CMD_IPCS=${TS_CMD_IPCS:-"$top_builddir/ipcs"}
-TS_CMD_ISOSIZE=${TS_CMD_ISOSIZE-"$top_builddir/isosize"}
-TS_CMD_KILL=${TS_CMD_KILL-"$top_builddir/kill"}
-TS_CMD_LAST=${TS_CMD_LAST-"$top_builddir/last"}
-TS_CMD_LINE=${TS_CMD_LINE-"$top_builddir/line"}
-TS_CMD_LOOK=${TS_CMD_LOOK-"$top_builddir/look"}
-TS_CMD_LOSETUP=${TS_CMD_LOSETUP:-"$top_builddir/losetup"}
-TS_CMD_LSBLK=${TS_CMD_LSBLK-"$top_builddir/lsblk"}
-TS_CMD_LSCPU=${TS_CMD_LSCPU-"$top_builddir/lscpu"}
-TS_CMD_LSMEM=${TS_CMD_LSMEM-"$top_builddir/lsmem"}
-TS_CMD_LSNS=${TS_CMD_LSNS-"$top_builddir/lsns"}
-TS_CMD_MCOOKIE=${TS_CMD_MCOOKIE-"$top_builddir/mcookie"}
-TS_CMD_MKCRAMFS=${TS_CMD_MKCRAMFS:-"$top_builddir/mkfs.cramfs"}
-TS_CMD_MKMINIX=${TS_CMD_MKMINIX:-"$top_builddir/mkfs.minix"}
-TS_CMD_MKSWAP=${TS_CMD_MKSWAP:-"$top_builddir/mkswap"}
-TS_CMD_MOUNT=${TS_CMD_MOUNT:-"$top_builddir/mount"}
-TS_CMD_MOUNTPOINT=${TS_CMD_MOUNTPOINT:-"$top_builddir/mountpoint"}
-TS_CMD_NAMEI=${TS_CMD_NAMEI-"$top_builddir/namei"}
-TS_CMD_PARTX=${TS_CMD_PARTX-"$top_builddir/partx"}
-TS_CMD_RENAME=${TS_CMD_RENAME-"$top_builddir/rename"}
-TS_CMD_RUNUSER=${TS_CMD_RUNUSER-"$top_builddir/runuser"}
-TS_CMD_REV=${TS_CMD_REV:-"$top_builddir/rev"}
-TS_CMD_SCRIPT=${TS_CMD_SCRIPT-"$top_builddir/script"}
-TS_CMD_SCRIPTREPLAY=${TS_CMD_SCRIPTREPLAY-"$top_builddir/scriptreplay"}
-TS_CMD_SETARCH=${TS_CMD_SETARCH-"$top_builddir/setarch"}
-TS_CMD_SETSID=${TS_CMD_SETSID-"$top_builddir/setsid"}
-TS_CMD_SWAPLABEL=${TS_CMD_SWAPLABEL:-"$top_builddir/swaplabel"}
-TS_CMD_SWAPOFF=${TS_CMD_SWAPOFF:-"$top_builddir/swapoff"}
-TS_CMD_SWAPON=${TS_CMD_SWAPON:-"$top_builddir/swapon"}
-TS_CMD_UL=${TS_CMD_UL-"$top_builddir/ul"}
-TS_CMD_UMOUNT=${TS_CMD_UMOUNT:-"$top_builddir/umount"}
-TS_CMD_UTMPDUMP=${TS_CMD_UTMPDUMP-"$top_builddir/utmpdump"}
-TS_CMD_UUIDD=${TS_CMD_UUIDD-"$top_builddir/uuidd"}
-TS_CMD_UUIDGEN=${TS_CMD_UUIDGEN-"$top_builddir/uuidgen"}
-TS_CMD_UUIDPARSE=${TS_CMD_UUIDPARSE-"$top_builddir/uuidparse"}
-TS_CMD_WHEREIS=${TS_CMD_WHEREIS-"$top_builddir/whereis"}
-TS_CMD_WIPEFS=${TS_CMD_WIPEFS-"$top_builddir/wipefs"}
-TS_CMD_CHRT=${TS_CMD_CHRT-"$top_builddir/chrt"}
+TS_CMD_ADDPART=${TS_CMD_ADDPART:-"${ts_commandsdir}addpart"}
+TS_CMD_DELPART=${TS_CMD_DELPART:-"${ts_commandsdir}delpart"}
+TS_CMD_BLKDISCARD=${TS_CMD_BLKID-"${ts_commandsdir}blkdiscard"}
+TS_CMD_BLKID=${TS_CMD_BLKID-"${ts_commandsdir}blkid"}
+TS_CMD_CAL=${TS_CMD_CAL-"${ts_commandsdir}cal"}
+TS_CMD_COLCRT=${TS_CMD_COLCRT:-"${ts_commandsdir}colcrt"}
+TS_CMD_COLRM=${TS_CMD_COLRM:-"${ts_commandsdir}colrm"}
+TS_CMD_COL=${TS_CMD_COL:-"${ts_commandsdir}col"}
+TS_CMD_COLUMN=${TS_CMD_COLUMN:-"${ts_commandsdir}column"}
+TS_CMD_EJECT=${TS_CMD_EJECT-"${ts_commandsdir}eject"}
+TS_CMD_FALLOCATE=${TS_CMD_FALLOCATE-"${ts_commandsdir}fallocate"}
+TS_CMD_FDISK=${TS_CMD_FDISK-"${ts_commandsdir}fdisk"}
+TS_CMD_FLOCK=${TS_CMD_FLOCK-"${ts_commandsdir}flock"}
+TS_CMD_SFDISK=${TS_CMD_SFDISK-"${ts_commandsdir}sfdisk"}
+TS_CMD_FINCORE=${TS_CMD_FINCORE-"${ts_commandsdir}fincore"}
+TS_CMD_FINDMNT=${TS_CMD_FINDMNT-"${ts_commandsdir}findmnt"}
+TS_CMD_FSCKCRAMFS=${TS_CMD_FSCKCRAMFS:-"${ts_commandsdir}fsck.cramfs"}
+TS_CMD_FSCKMINIX=${TS_CMD_FSCKMINIX:-"${ts_commandsdir}fsck.minix"}
+TS_CMD_GETOPT=${TS_CMD_GETOPT-"${ts_commandsdir}getopt"}
+TS_CMD_HEXDUMP=${TS_CMD_HEXDUMP-"${ts_commandsdir}hexdump"}
+TS_CMD_HWCLOCK=${TS_CMD_HWCLOCK-"${ts_commandsdir}hwclock"}
+TS_CMD_IONICE=${TS_CMD_IONICE-"${ts_commandsdir}ionice"}
+TS_CMD_IPCMK=${TS_CMD_IPCMK-"${ts_commandsdir}ipcmk"}
+TS_CMD_IPCRM=${TS_CMD_IPCRM-"${ts_commandsdir}ipcrm"}
+TS_CMD_IPCS=${TS_CMD_IPCS:-"${ts_commandsdir}ipcs"}
+TS_CMD_ISOSIZE=${TS_CMD_ISOSIZE-"${ts_commandsdir}isosize"}
+TS_CMD_KILL=${TS_CMD_KILL-"${ts_commandsdir}kill"}
+TS_CMD_LAST=${TS_CMD_LAST-"${ts_commandsdir}last"}
+TS_CMD_LINE=${TS_CMD_LINE-"${ts_commandsdir}line"}
+TS_CMD_LOOK=${TS_CMD_LOOK-"${ts_commandsdir}look"}
+TS_CMD_LOSETUP=${TS_CMD_LOSETUP:-"${ts_commandsdir}losetup"}
+TS_CMD_LSBLK=${TS_CMD_LSBLK-"${ts_commandsdir}lsblk"}
+TS_CMD_LSCPU=${TS_CMD_LSCPU-"${ts_commandsdir}lscpu"}
+TS_CMD_LSMEM=${TS_CMD_LSMEM-"${ts_commandsdir}lsmem"}
+TS_CMD_LSNS=${TS_CMD_LSNS-"${ts_commandsdir}lsns"}
+TS_CMD_MCOOKIE=${TS_CMD_MCOOKIE-"${ts_commandsdir}mcookie"}
+TS_CMD_MKCRAMFS=${TS_CMD_MKCRAMFS:-"${ts_commandsdir}mkfs.cramfs"}
+TS_CMD_MKMINIX=${TS_CMD_MKMINIX:-"${ts_commandsdir}mkfs.minix"}
+TS_CMD_MKSWAP=${TS_CMD_MKSWAP:-"${ts_commandsdir}mkswap"}
+TS_CMD_MOUNT=${TS_CMD_MOUNT:-"${ts_commandsdir}mount"}
+TS_CMD_MOUNTPOINT=${TS_CMD_MOUNTPOINT:-"${ts_commandsdir}mountpoint"}
+TS_CMD_NAMEI=${TS_CMD_NAMEI-"${ts_commandsdir}namei"}
+TS_CMD_PARTX=${TS_CMD_PARTX-"${ts_commandsdir}partx"}
+TS_CMD_RENAME=${TS_CMD_RENAME-"${ts_commandsdir}rename"}
+TS_CMD_RUNUSER=${TS_CMD_RUNUSER-"${ts_commandsdir}runuser"}
+TS_CMD_REV=${TS_CMD_REV:-"${ts_commandsdir}rev"}
+TS_CMD_SCRIPT=${TS_CMD_SCRIPT-"${ts_commandsdir}script"}
+TS_CMD_SCRIPTREPLAY=${TS_CMD_SCRIPTREPLAY-"${ts_commandsdir}scriptreplay"}
+TS_CMD_SETARCH=${TS_CMD_SETARCH-"${ts_commandsdir}setarch"}
+TS_CMD_SETSID=${TS_CMD_SETSID-"${ts_commandsdir}setsid"}
+TS_CMD_SWAPLABEL=${TS_CMD_SWAPLABEL:-"${ts_commandsdir}swaplabel"}
+TS_CMD_SWAPOFF=${TS_CMD_SWAPOFF:-"${ts_commandsdir}swapoff"}
+TS_CMD_SWAPON=${TS_CMD_SWAPON:-"${ts_commandsdir}swapon"}
+TS_CMD_UL=${TS_CMD_UL-"${ts_commandsdir}ul"}
+TS_CMD_UMOUNT=${TS_CMD_UMOUNT:-"${ts_commandsdir}umount"}
+TS_CMD_UTMPDUMP=${TS_CMD_UTMPDUMP-"${ts_commandsdir}utmpdump"}
+TS_CMD_UUIDD=${TS_CMD_UUIDD-"${ts_commandsdir}uuidd"}
+TS_CMD_UUIDGEN=${TS_CMD_UUIDGEN-"${ts_commandsdir}uuidgen"}
+TS_CMD_UUIDPARSE=${TS_CMD_UUIDPARSE-"${ts_commandsdir}uuidparse"}
+TS_CMD_WHEREIS=${TS_CMD_WHEREIS-"${ts_commandsdir}whereis"}
+TS_CMD_WIPEFS=${TS_CMD_WIPEFS-"${ts_commandsdir}wipefs"}
+TS_CMD_CHRT=${TS_CMD_CHRT-"${ts_commandsdir}chrt"}
diff --git a/tests/functions.sh b/tests/functions.sh
index 2fb0ddb5f..ab607c4ce 100644
--- a/tests/functions.sh
+++ b/tests/functions.sh
@@ -75,9 +75,19 @@ function ts_report {
}
function ts_check_test_command {
- if [ ! -x "$1" ]; then
- ts_skip "${1##*/} not found"
- fi
+ case "$1" in
+ */*)
+ # paths
+ if [ ! -x "$1" ]; then
+ ts_skip "${1##*/} not found"
+ fi
+ ;;
+ *)
+ # just command names (e.g. --use-system-commands)
+ local cmd=$1
+ type "$cmd" >/dev/null 2>&1 || ts_skip "missing in PATH: $cmd"
+ ;;
+ esac
}
function ts_check_prog {
@@ -254,8 +264,20 @@ function ts_init_env {
top_srcdir=$(ts_abspath $top_srcdir)
top_builddir=$(ts_abspath $top_builddir)
- # some ul commands search other ul commands in $PATH
- export PATH="$top_builddir:$PATH"
+ # We use helpser always from build tree
+ ts_helpersdir="${top_builddir}/"
+
+ TS_USE_SYSTEM_COMMANDS=$(ts_has_option "use-system-commands" "$*")
+ if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then
+ # Don't define anything, just follow current PATH
+ ts_commandsdir=""
+ else
+ # The default is to use commands from build tree
+ ts_commandsdir="${top_builddir}/"
+
+ # some ul commands search other ul commands in $PATH
+ export PATH="$ts_commandsdir:$PATH"
+ fi
TS_SCRIPT="$mydir/$(basename $0)"
TS_SUBDIR=$(dirname $TS_SCRIPT)
@@ -319,6 +341,8 @@ function ts_init_env {
if [ "$TS_VERBOSE" == "yes" ]; then
echo
echo " script: $TS_SCRIPT"
+ echo " commands: $ts_commandsdir"
+ echo " helpers: $ts_helpersdir"
echo " sub dir: $TS_SUBDIR"
echo " top dir: $TS_TOPDIR"
echo " self: $TS_SELF"
diff --git a/tests/run.sh b/tests/run.sh
index f40c9f801..28f8ee25a 100755
--- a/tests/run.sh
+++ b/tests/run.sh
@@ -20,6 +20,7 @@ TS_TOPDIR=$(cd ${0%/*} && pwd)
SUBTESTS=
EXCLUDETESTS=
OPTS=
+SYSCOMMANDS=
top_srcdir=
top_builddir=
@@ -68,6 +69,11 @@ while [ -n "$1" ]; do
# these options are simply forwarded to the test scripts
OPTS="$OPTS $1"
;;
+ --use-system-commands)
+ OPTS="$OPTS $1"
+ SYSCOMMANDS="yes"
+ ;;
+
--nonroot)
if [ $(id -ru) -eq 0 ]; then
echo "Ignore util-linux test suite [non-root UID expected]."
@@ -98,18 +104,19 @@ while [ -n "$1" ]; do
echo "Usage: "
echo " $(basename $0) [options] [<component> ...]"
echo "Options:"
- echo " --force execute demanding tests"
- echo " --fake do not run, setup tests only"
- echo " --memcheck-valgrind run with valgrind"
- echo " --memcheck-asan enable ASAN (requires ./configure --enable-asan)"
- echo " --nolocks don't use flock to lock resources"
- echo " --verbose verbose mode"
- echo " --show-diff show diff from failed tests"
- echo " --nonroot ignore test suite if user is root"
- echo " --srcdir=<path> autotools top source directory"
- echo " --builddir=<path> autotools top build directory"
- echo " --parallel=<num> number of parallel test jobs, default: num cpus"
- echo " --exclude=<list> exclude tests by list '<utilname>/<testname> ..'"
+ echo " --force execute demanding tests"
+ echo " --fake do not run, setup tests only"
+ echo " --memcheck-valgrind run with valgrind"
+ echo " --memcheck-asan enable ASAN (requires ./configure --enable-asan)"
+ echo " --nolocks don't use flock to lock resources"
+ echo " --verbose verbose mode"
+ echo " --show-diff show diff from failed tests"
+ echo " --nonroot ignore test suite if user is root"
+ echo " --use-system-commands use PATH rather than builddir"
+ echo " --srcdir=<path> autotools top source directory"
+ echo " --builddir=<path> autotools top build directory"
+ echo " --parallel=<num> number of parallel test jobs, default: num cpus"
+ echo " --exclude=<list> exclude tests by list '<utilname>/<testname> ..'"
echo
exit 1
;;
@@ -148,7 +155,7 @@ if [ -n "$SUBTESTS" ]; then
fi
done
else
- if [ ! -f "$top_builddir/test_ttyutils" ]; then
+ if [ -z "$SYSCOMMANDS" -a ! -f "$top_builddir/test_ttyutils" ]; then
echo "Tests not compiled! Run 'make check' to fix the problem."
exit 1
fi
--
2.20.1

View File

@ -0,0 +1,99 @@
From 47b0f3480a88be94ef73973e73ad9f7fb8258cad Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 4 Mar 2019 17:28:15 +0100
Subject: [PATCH 17/19] tests: (kill) do not use shell build-in
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062
Upstream: http://github.com/karelzak/util-linux/commit/2fadcded53add5b5b0ca7071f310a0f37c711c51
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/ts/kill/all_processes | 5 +++++
tests/ts/kill/name_to_number | 5 +++++
tests/ts/kill/options | 5 +++++
tests/ts/kill/print_pid | 5 +++++
tests/ts/kill/queue | 5 +++++
5 files changed, 25 insertions(+)
diff --git a/tests/ts/kill/all_processes b/tests/ts/kill/all_processes
index 2596ef02b..7a0c95931 100755
--- a/tests/ts/kill/all_processes
+++ b/tests/ts/kill/all_processes
@@ -20,6 +20,11 @@ ts_init "$*"
ts_skip_nonroot
+# make sure we do not use shell built-in command
+if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then
+ TS_CMD_KILL="/bin/kill"
+fi
+
ts_check_test_command "$TS_CMD_KILL"
ts_check_test_command "$TS_HELPER_SIGRECEIVE"
diff --git a/tests/ts/kill/name_to_number b/tests/ts/kill/name_to_number
index cde55c9ed..fd2aaafe0 100755
--- a/tests/ts/kill/name_to_number
+++ b/tests/ts/kill/name_to_number
@@ -18,6 +18,11 @@ TS_DESC="name_to_number"
. "$TS_TOPDIR/functions.sh"
ts_init "$*"
+# make sure we do not use shell built-in command
+if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then
+ TS_CMD_KILL="/bin/kill"
+fi
+
ts_check_test_command "$TS_CMD_KILL"
ts_check_test_command "$TS_HELPER_SIGRECEIVE"
diff --git a/tests/ts/kill/options b/tests/ts/kill/options
index 2c82bbccc..ee9e52f47 100755
--- a/tests/ts/kill/options
+++ b/tests/ts/kill/options
@@ -18,6 +18,11 @@ TS_DESC="options"
. "$TS_TOPDIR/functions.sh"
ts_init "$*"
+# make sure we do not use shell built-in command
+if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then
+ TS_CMD_KILL="/bin/kill"
+fi
+
ts_check_test_command "$TS_CMD_KILL"
ts_check_test_command "$TS_HELPER_SIGRECEIVE"
diff --git a/tests/ts/kill/print_pid b/tests/ts/kill/print_pid
index c6187f192..2a2a838ee 100755
--- a/tests/ts/kill/print_pid
+++ b/tests/ts/kill/print_pid
@@ -18,6 +18,11 @@ TS_DESC="print_pid"
. "$TS_TOPDIR/functions.sh"
ts_init "$*"
+# make sure we do not use shell built-in command
+if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then
+ TS_CMD_KILL="/bin/kill"
+fi
+
ts_check_test_command "$TS_CMD_KILL"
ts_check_test_command "$TS_HELPER_SIGRECEIVE"
diff --git a/tests/ts/kill/queue b/tests/ts/kill/queue
index 992acf7a6..4727cbfc4 100755
--- a/tests/ts/kill/queue
+++ b/tests/ts/kill/queue
@@ -18,6 +18,11 @@ TS_DESC="queue"
. "$TS_TOPDIR/functions.sh"
ts_init "$*"
+# make sure we do not use shell built-in command
+if [ "$TS_USE_SYSTEM_COMMANDS" == "yes" ]; then
+ TS_CMD_KILL="/bin/kill"
+fi
+
ts_check_test_command "$TS_CMD_KILL"
ts_check_test_command "$TS_HELPER_SIGRECEIVE"
--
2.20.1

View File

@ -0,0 +1,27 @@
From aa983f0eea49638f04de0fbafcd156c1472726ee Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 4 Mar 2019 17:32:03 +0100
Subject: [PATCH 18/19] tests: add missing TS_CMD_UMOUNT check
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062
Upstream: http://github.com/karelzak/util-linux/commit/bb872a239ce9faae7ac672a9137945dd8e4ee964
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/ts/libmount/loop | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/ts/libmount/loop b/tests/ts/libmount/loop
index b52b7476a..090b79fa4 100755
--- a/tests/ts/libmount/loop
+++ b/tests/ts/libmount/loop
@@ -23,6 +23,7 @@ TS_DESC="losetup-loop"
ts_init "$*"
ts_check_test_command "$TS_CMD_MOUNT"
+ts_check_test_command "$TS_CMD_UMOUNT"
ts_check_test_command "$TS_CMD_FINDMNT"
ts_check_test_command "$TS_CMD_LOSETUP"
--
2.20.1

View File

@ -0,0 +1,66 @@
From 9e92f2ff939a885b70d3a5d20e8c94f6e41e821b Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 5 Mar 2019 11:06:41 +0100
Subject: [PATCH 19/19] tests: add --noskip-commands
The default is SKIP missing commands on --use-system-commands, but
with --noskip-commands the test will FAIL.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062
Upstream: http://github.com/karelzak/util-linux/commit/7c90efa384cbb2ace873e2b90e8cc396a1719535
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/functions.sh | 9 ++++++++-
tests/run.sh | 2 ++
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/tests/functions.sh b/tests/functions.sh
index ab607c4ce..0605a1320 100644
--- a/tests/functions.sh
+++ b/tests/functions.sh
@@ -85,7 +85,13 @@ function ts_check_test_command {
*)
# just command names (e.g. --use-system-commands)
local cmd=$1
- type "$cmd" >/dev/null 2>&1 || ts_skip "missing in PATH: $cmd"
+ type "$cmd" >/dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ if [ "$TS_NOSKIP_COMMANDS" = "yes" ]; then
+ ts_failed "missing in PATH: $cmd"
+ fi
+ ts_skip "missing in PATH: $cmd"
+ fi
;;
esac
}
@@ -301,6 +307,7 @@ function ts_init_env {
ts_init_core_env
+ TS_NOSKIP_COMMANDS=$(ts_has_option "noskip-commands" "$*")
TS_VERBOSE=$(ts_has_option "verbose" "$*")
TS_SHOWDIFF=$(ts_has_option "show-diff" "$*")
TS_PARALLEL=$(ts_has_option "parallel" "$*")
diff --git a/tests/run.sh b/tests/run.sh
index 28f8ee25a..e8328cc5d 100755
--- a/tests/run.sh
+++ b/tests/run.sh
@@ -65,6 +65,7 @@ while [ -n "$1" ]; do
--show-diff |\
--verbose |\
--skip-loopdevs |\
+ --noskip-commands |\
--parsable)
# these options are simply forwarded to the test scripts
OPTS="$OPTS $1"
@@ -113,6 +114,7 @@ while [ -n "$1" ]; do
echo " --show-diff show diff from failed tests"
echo " --nonroot ignore test suite if user is root"
echo " --use-system-commands use PATH rather than builddir"
+ echo " --noskip-commands fail on missing commands"
echo " --srcdir=<path> autotools top source directory"
echo " --builddir=<path> autotools top build directory"
echo " --parallel=<num> number of parallel test jobs, default: num cpus"
--
2.20.1

View File

@ -0,0 +1,83 @@
From 68ab6d9691e667f89f72bc7eb39a5300b2f6cbaf Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 5 Mar 2019 13:56:45 +0100
Subject: [PATCH] tests: add missing program checks
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/ts/cal/bigyear | 2 +-
tests/ts/cal/month | 2 +-
tests/ts/cal/sep1752 | 2 +-
tests/ts/misc/mbsencode | 2 ++
tests/ts/misc/strtosize | 2 ++
5 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/tests/ts/cal/bigyear b/tests/ts/cal/bigyear
index d205c3afd..34139fd27 100755
--- a/tests/ts/cal/bigyear
+++ b/tests/ts/cal/bigyear
@@ -18,7 +18,7 @@ TS_DESC="Year 2147483646"
. $TS_TOPDIR/functions.sh
ts_init "$*"
-ts_check_test_command "$TS_CMD_CAL"
+ts_check_test_command "$TS_HELPER_CAL"
export TERM=linux
diff --git a/tests/ts/cal/month b/tests/ts/cal/month
index 9794e90c0..37996acae 100755
--- a/tests/ts/cal/month
+++ b/tests/ts/cal/month
@@ -22,7 +22,7 @@ TS_DESC="month"
. $TS_TOPDIR/functions.sh
ts_init "$*"
-ts_check_test_command "$TS_CMD_CAL"
+ts_check_test_command "$TS_HELPER_CAL"
export TERM=linux
diff --git a/tests/ts/cal/sep1752 b/tests/ts/cal/sep1752
index 3128261cd..41c30d40e 100755
--- a/tests/ts/cal/sep1752
+++ b/tests/ts/cal/sep1752
@@ -18,7 +18,7 @@ TS_DESC="September 1752"
. $TS_TOPDIR/functions.sh
ts_init "$*"
-ts_check_test_command "$TS_CMD_CAL"
+ts_check_test_command "$TS_HELPER_CAL"
export TERM=linux
diff --git a/tests/ts/misc/mbsencode b/tests/ts/misc/mbsencode
index 405d34c56..139148259 100755
--- a/tests/ts/misc/mbsencode
+++ b/tests/ts/misc/mbsencode
@@ -22,6 +22,8 @@ TS_DESC="mbsencode"
. $TS_TOPDIR/functions.sh
ts_init "$*"
+ts_check_test_command "$TS_HELPER_MBSENCODE"
+
# These test may fail on some machines (locales, other libc...)
TS_KNOWN_FAIL="yes"
diff --git a/tests/ts/misc/strtosize b/tests/ts/misc/strtosize
index 68b3b8bab..a5914a939 100755
--- a/tests/ts/misc/strtosize
+++ b/tests/ts/misc/strtosize
@@ -21,6 +21,8 @@ TS_DESC="strtosize"
. $TS_TOPDIR/functions.sh
ts_init "$*"
+ts_check_test_command "$TS_HELPER_STRUTILS"
+
$TS_HELPER_STRUTILS --size -1 >> $TS_OUTPUT 2>&1
$TS_HELPER_STRUTILS --size 0 >> $TS_OUTPUT 2>&1
$TS_HELPER_STRUTILS --size 1 >> $TS_OUTPUT 2>&1
--
2.20.1

View File

@ -0,0 +1,42 @@
From 0c57e5fedce0e627debda3258e2203842b427572 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 11 Dec 2018 11:44:48 +0100
Subject: [PATCH] tests: check for tar and {b,g}zip
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1681062
Upstream: http://github.com/karelzak/util-linux/commit/9e07672bb9989c88f6a7d8b8ab23158701fb4eec
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/ts/lscpu/lscpu | 2 ++
tests/ts/lsmem/lsmem | 2 ++
2 files changed, 4 insertions(+)
diff --git a/tests/ts/lscpu/lscpu b/tests/ts/lscpu/lscpu
index 70fbce9f3..ccf271149 100755
--- a/tests/ts/lscpu/lscpu
+++ b/tests/ts/lscpu/lscpu
@@ -22,6 +22,8 @@ TS_TOPDIR="${0%/*}/../.."
ts_init "$*"
+ts_check_prog "tar"
+ts_check_prog "gzip"
ts_check_test_command "$TS_CMD_LSCPU"
for dump in $(ls $TS_SELF/dumps/*.tar.gz | sort); do
diff --git a/tests/ts/lsmem/lsmem b/tests/ts/lsmem/lsmem
index f1a643f85..bedf4143f 100755
--- a/tests/ts/lsmem/lsmem
+++ b/tests/ts/lsmem/lsmem
@@ -21,6 +21,8 @@ TS_TOPDIR="${0%/*}/../.."
ts_init "$*"
ts_check_test_command "$TS_CMD_LSMEM"
+ts_check_prog "tar"
+ts_check_prog "bzip2"
LSCOLUMNS="RANGE,SIZE,STATE,REMOVABLE,BLOCK,NODE"
--
2.20.1

View File

@ -0,0 +1,93 @@
From 8822103e30121d95fa58b5e8b7ce8ce91d4e778e Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 3 Jun 2019 22:29:51 +0200
Subject: [PATCH] tests: make mount -oloop use more robust
The command creates loop device, so udevd is in the game and it seems
better to wait for him.
Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1681062
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/ts/libmount/loop | 4 ++++
tests/ts/libmount/loop-overlay | 11 +++++++++++
2 files changed, 15 insertions(+)
diff --git a/tests/ts/libmount/loop b/tests/ts/libmount/loop
index 090b79fa4..50764781c 100755
--- a/tests/ts/libmount/loop
+++ b/tests/ts/libmount/loop
@@ -65,6 +65,7 @@ ts_finalize_subtest
ts_init_subtest "file-o-loop"
[ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT
$TS_CMD_MOUNT -oloop "$BACKFILE" "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1
+udevadm settle
$TS_CMD_UMOUNT "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1
udevadm settle
ts_log "Success"
@@ -89,6 +90,7 @@ else
[ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT
LODEV=$( $TS_CMD_LOSETUP --find 2>> $TS_OUTPUT )
$TS_CMD_MOUNT -oloop=$LODEV "$BACKFILE" "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1
+ udevadm settle
verify_mount_dev "$LODEV" "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1
$TS_CMD_UMOUNT "$TS_MOUNTPOINT" >> $TS_OUTPUT 2>&1
udevadm settle
@@ -122,6 +124,7 @@ ts_init_subtest "o-loop-val-initialized"
LODEV=$( $TS_CMD_LOSETUP --show -f "$BACKFILE" 2>>$TS_OUTPUT)
$TS_CMD_MOUNT -oloop=$LODEV "$BACKFILE" "$TS_MOUNTPOINT" 2>&1 \
| sed 's/:.*:/: <target>/; s/for .*/for <source>/' > $TS_OUTPUT
+udevadm settle
$TS_CMD_LOSETUP --detach $LODEV >> $TS_OUTPUT 2>&1
udevadm settle
ts_log "Success"
@@ -133,6 +136,7 @@ cp "$BACKFILE" "$BACKFILE"-2
LODEV=$( $TS_CMD_LOSETUP --show -f "$BACKFILE"-2 2>> $TS_OUTPUT)
$TS_CMD_MOUNT -oloop=$LODEV "$BACKFILE" "$TS_MOUNTPOINT" 2>&1 \
| sed 's/:.*:/: <target>/; s/for .*/for <source>/' > $TS_OUTPUT
+udevadm settle
$TS_CMD_LOSETUP --detach $LODEV >> $TS_OUTPUT 2>&1
rm "$BACKFILE"-2
udevadm settle
diff --git a/tests/ts/libmount/loop-overlay b/tests/ts/libmount/loop-overlay
index fffb823c0..1ba6eb06e 100755
--- a/tests/ts/libmount/loop-overlay
+++ b/tests/ts/libmount/loop-overlay
@@ -43,23 +43,34 @@ dd if="$IMG" of="$IMG" oflag=append bs=1024k count=5 conv=notrunc &>/dev/null
echo "second should fail" >>$TS_OUTPUT
$TS_CMD_MOUNT -oloop "$IMG" "$TS_MOUNTPOINT-1" >> $TS_OUTPUT 2>&1
+udevadm settle
$TS_CMD_MOUNT -oloop,offset=$OFFSET "$IMG" "$TS_MOUNTPOINT-2" 2>&1 \
| sed 's/:.*:/: <target>/; s/for .*/for <source>/' >> $TS_OUTPUT
+udevadm settle
$TS_CMD_UMOUNT "$TS_MOUNTPOINT-1" >> $TS_OUTPUT 2>&1
+udevadm settle
echo "should succeed" >>$TS_OUTPUT
$TS_CMD_MOUNT -oloop,sizelimit=$OFFSET "$IMG" "$TS_MOUNTPOINT-1" >> $TS_OUTPUT 2>&1
+udevadm settle
$TS_CMD_MOUNT -oloop,offset=$OFFSET "$IMG" "$TS_MOUNTPOINT-2" >> $TS_OUTPUT 2>&1
+udevadm settle
$TS_CMD_UMOUNT "$TS_MOUNTPOINT-1" >> $TS_OUTPUT 2>&1
+udevadm settle
$TS_CMD_UMOUNT "$TS_MOUNTPOINT-2" >> $TS_OUTPUT 2>&1
+udevadm settle
echo "both should fail" >>$TS_OUTPUT
LOOPDEV=$($TS_CMD_LOSETUP --show -f --offset 1 --sizelimit $OFFSET "$IMG")
+udevadm settle
$TS_CMD_MOUNT -oloop,sizelimit=$OFFSET "$IMG" "$TS_MOUNTPOINT-1" 2>&1 \
| sed 's/:.*:/: <target>/; s/for .*/for <source>/' >> $TS_OUTPUT
+udevadm settle
$TS_CMD_MOUNT -oloop,offset=$OFFSET "$IMG" "$TS_MOUNTPOINT-2" 2>&1 \
| sed 's/:.*:/: <target>/; s/for .*/for <source>/' >> $TS_OUTPUT
+udevadm settle
$TS_CMD_LOSETUP --detach $LOOPDEV
+udevadm settle
ts_log "Success"
ts_finalize
--
2.21.0

View File

@ -0,0 +1,87 @@
From e431bfeca0f3e7be2eba30be83260f20976f871d Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 31 Jul 2019 16:18:27 +0200
Subject: [PATCH 23/24] libblkid: fix file descriptor leak in blkid_verify()
The function blkid_verify() uses private device file descriptor and
uses blkid_probe_set_device() to assign the descriptor to low-level
probing code. Unfortunately, close() in this case is not enough as the
prober can internally open whole-disk device too.
The library API has been extended so blkid_probe_set_device()
deallocates and close previously used prober for whole-disk. This new
functionality is used in blkid_verify() now.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1734553
Upstream: http://github.com/karelzak/util-linux/commit/c4d6d1c54dcd0eff701236d396d88b1fc6251768
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/probe.c | 19 ++++++++++++++++---
libblkid/src/verify.c | 4 +++-
2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c
index 647ae416a..a6dc8416a 100644
--- a/libblkid/src/probe.c
+++ b/libblkid/src/probe.c
@@ -848,10 +848,15 @@ failed:
* @off: begin of probing area
* @size: size of probing area (zero means whole device/file)
*
- * Assigns the device to probe control struct, resets internal buffers and
- * resets the current probing.
+ * Assigns the device to probe control struct, resets internal buffers, resets
+ * the current probing, and close previously associated device (if open by
+ * libblkid).
*
- * Returns: -1 in case of failure, or 0 on success.
+ * If @fd is < 0 than only resets the prober and returns 1. Note that
+ * blkid_reset_probe() keeps the device associated with the prober, but
+ * blkid_probe_set_device() does complete reset.
+ *
+ * Returns: -1 in case of failure, 0 on success and 1 on reset.
*/
int blkid_probe_set_device(blkid_probe pr, int fd,
blkid_loff_t off, blkid_loff_t size)
@@ -866,6 +871,11 @@ int blkid_probe_set_device(blkid_probe pr, int fd,
if ((pr->flags & BLKID_FL_PRIVATE_FD) && pr->fd >= 0)
close(pr->fd);
+ if (pr->disk_probe) {
+ blkid_free_probe(pr->disk_probe);
+ pr->disk_probe = NULL;
+ }
+
pr->flags &= ~BLKID_FL_PRIVATE_FD;
pr->flags &= ~BLKID_FL_TINY_DEV;
pr->flags &= ~BLKID_FL_CDROM_DEV;
@@ -881,6 +891,9 @@ int blkid_probe_set_device(blkid_probe pr, int fd,
pr->wipe_size = 0;
pr->wipe_chain = NULL;
+ if (fd < 0)
+ return 1;
+
#if defined(POSIX_FADV_RANDOM) && defined(HAVE_POSIX_FADVISE)
/* Disable read-ahead */
posix_fadvise(fd, 0, 0, POSIX_FADV_RANDOM);
diff --git a/libblkid/src/verify.c b/libblkid/src/verify.c
index 7f44f5497..750378f8c 100644
--- a/libblkid/src/verify.c
+++ b/libblkid/src/verify.c
@@ -184,9 +184,11 @@ blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev)
dev->bid_name, (long long)st.st_rdev, dev->bid_type));
}
- blkid_reset_probe(cache->probe);
+ /* reset prober */
blkid_probe_reset_superblocks_filter(cache->probe);
+ blkid_probe_set_device(cache->probe, -1, 0, 0);
close(fd);
+
return dev;
}
--
2.21.0

View File

@ -0,0 +1,73 @@
From 3f6de92999cf63e234265f51d6ee02134bc75ac3 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 12 Jun 2019 11:02:51 +0200
Subject: [PATCH 24/24] findmnt: (verify) ignore passno for XFS
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1719069
Upstream: http://github.com/karelzak/util-linux/commit/f5b7bf155b9881de5b99cc0a23b4dccf9a2d4af3
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/findmnt-verify.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/misc-utils/findmnt-verify.c b/misc-utils/findmnt-verify.c
index 1cc62def9..73e44a418 100644
--- a/misc-utils/findmnt-verify.c
+++ b/misc-utils/findmnt-verify.c
@@ -28,7 +28,8 @@ struct verify_context {
int nwarnings;
int nerrors;
- unsigned int target_printed : 1;
+ unsigned int target_printed : 1,
+ no_fsck : 1;
};
static void verify_mesg(struct verify_context *vfy, char type, const char *fmt, va_list ap)
@@ -408,6 +409,8 @@ static int verify_fstype(struct verify_context *vfy)
isauto = 1;
else if (strcmp(type, "swap") == 0)
isswap = 1;
+ else if (strcmp(type, "xfs") == 0)
+ vfy->no_fsck = 1;
if (!isswap && !isauto && !none && !is_supported_filesystem(vfy, type))
verify_warn(vfy, _("%s seems unsupported by the current kernel"), type);
@@ -422,6 +425,7 @@ static int verify_fstype(struct verify_context *vfy)
if (realtype) {
isswap = strcmp(realtype, "swap") == 0;
+ vfy->no_fsck = strcmp(realtype, "xfs") == 0;
if (type && !isauto && strcmp(type, realtype) != 0)
return verify_err(vfy, _("%s does not match with on-disk %s"), type, realtype);
@@ -440,7 +444,7 @@ static int verify_passno(struct verify_context *vfy)
int passno = mnt_fs_get_passno(vfy->fs);
const char *tgt = mnt_fs_get_target(vfy->fs);
- if (tgt && strcmp("/", tgt) == 0 && passno != 1)
+ if (tgt && strcmp("/", tgt) == 0 && passno != 1 && !vfy->no_fsck)
return verify_warn(vfy, _("recommended root FS passno is 1 (current is %d)"), passno);
return 0;
@@ -463,7 +467,7 @@ static int verify_filesystem(struct verify_context *vfy)
if (!rc)
rc = verify_fstype(vfy);
if (!rc)
- rc = verify_passno(vfy);
+ rc = verify_passno(vfy); /* depends on verify_fstype() */
return rc;
}
@@ -492,6 +496,8 @@ int verify_table(struct libmnt_table *tb)
while (rc == 0 && (vfy.fs = get_next_fs(tb, itr))) {
vfy.target_printed = 0;
+ vfy.no_fsck = 0;
+
if (check_order)
rc = verify_order(&vfy);
if (!rc)
--
2.21.0

View File

@ -0,0 +1,41 @@
From be5e6b14db3cdd09dab711572116d7ee39344875 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 21 Aug 2019 10:51:18 +0200
Subject: [PATCH 25/26] partx: don't report ENXIO as error on -d
The errno ENXIO should be ignored, unfortunately the current code uses
variable 'rc' for ioctl return code as well as for final del_parts()
return value. So, failed ioctl (which should be ignored) affects all
del_parts() status.
# modprobe scsi_debug dev_size_mb=100
# partx -d --nr 1-1024 /dev/sdc; echo $?
1
The device dos not contains any partitions, so 0 return code is
expected in this case.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1739179
Upstream: http://github.com/karelzak/util-linux/commit/53ae7d60cfeacd4e87bfe6fcc015b58b78ef4555
Signed-off-by: Karel Zak <kzak@redhat.com>
---
disk-utils/partx.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/disk-utils/partx.c b/disk-utils/partx.c
index e3443ea80..f3dcc9007 100644
--- a/disk-utils/partx.c
+++ b/disk-utils/partx.c
@@ -327,8 +327,7 @@ static int del_parts(int fd, const char *device, dev_t devno,
}
for (i = lower; i <= upper; i++) {
- rc = partx_del_partition(fd, i);
- if (rc == 0) {
+ if (partx_del_partition(fd, i) == 0) {
if (verbose)
printf(_("%s: partition #%d removed\n"), device, i);
continue;
--
2.21.0

View File

@ -0,0 +1,59 @@
From 5a9269c019f9cb0b2d54444501beb74663670693 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 21 Aug 2019 13:42:22 +0200
Subject: [PATCH 26/26] partx: document -d vs. --nr and fix test
The commit ab025087f91b66ee8e23a16bc49eb0d9bd421d65 has disabled error
message, but unfortunately it keeps wrong return code. This has been fixed
by commit 53ae7d60cfeacd4e87bfe6fcc015b58b78ef4555.
This commit add hit about it to docs and fix regression test too.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1739179
Upstream: http://github.com/karelzak/util-linux/commit/5200aa99d27e084b514e8b035db32f39b49562a3
Signed-off-by: Karel Zak <kzak@redhat.com>
---
disk-utils/partx.8 | 5 ++++-
tests/ts/partx/partx | 9 +++++++--
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/disk-utils/partx.8 b/disk-utils/partx.8
index af7313cb9..c6bbbae42 100644
--- a/disk-utils/partx.8
+++ b/disk-utils/partx.8
@@ -53,7 +53,10 @@ Add the specified partitions, or read the disk and add all partitions.
Print the SIZE column in bytes rather than in human-readable format.
.TP
.BR \-d , " \-\-delete"
-Delete the specified partitions or all partitions.
+Delete the specified partitions or all partitions. It is not error to
+remove non-existing partitions, so this option is possible to use together with
+large \fB\-\-nr\fR ranges without care about the current partitions set on
+the device.
.TP
.BR \-g , " \-\-noheadings"
Do not print a header line with \fB\-\-show\fR or \fB\-\-raw\fR.
diff --git a/tests/ts/partx/partx b/tests/ts/partx/partx
index b21dc44ef..84c286a94 100755
--- a/tests/ts/partx/partx
+++ b/tests/ts/partx/partx
@@ -137,9 +137,14 @@ udevadm settle
ts_init_subtest "delete-non-existent"
#attempt to remove it again
{
+ # remove non-existing partitions (ENXIO) is not error
+ #
+ # see ab025087f91b66ee8e23a16bc49eb0d9bd421d65 and
+ # 53ae7d60cfeacd4e87bfe6fcc015b58b78ef4555
+ #
$TS_CMD_PARTX -d --nr $PARTS $TS_DEVICE &&
- echo "partx failed: removed non-existing partition" ||
- echo "partx: OK"
+ echo "partx: OK" ||
+ echo "partx failed: removed non-existing partition"
} >$TS_OUTPUT 2>&1
ts_finalize_subtest
--
2.21.0

View File

@ -0,0 +1,396 @@
From 32fe4f1dd8fbc104bd848e24de613122947f095a Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 28 Aug 2019 15:47:16 +0200
Subject: [PATCH] libmount: improve mountinfo reliability
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The standard way how we read mount table is not reliable because
during the read() syscalls the table may be modified by some another
process. The changes in the table is possible to detect by poll()
event, and in this case it seems better to lseek to the begin of the file
and read it again. It's expensive, but better than races...
This patch does not modify mountinfo parser, but it reads all file to
memory (by read()+poll()) and than it creates memory stream
from the buffer and use it rather than a regular file stream.
It means the parser is still possible to use for normal files
(e.g. fstab) as well as for mountinfo and it's also portable to
systems where for some reason is no fmemopen().
Addresses: https://github.com/systemd/systemd/issues/10872
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1751447
Upstream: http://github.com/karelzak/util-linux/commit/e4925f591c1bfb83719418b56b952830d15b77eb
Upstream: http://github.com/karelzak/util-linux/commit/ee551c909f95437fd9fcd162f398c069d0ce9720
Reported-by: Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
configure.ac | 1 +
libmount/src/mountP.h | 2 +
libmount/src/tab_parse.c | 87 +++++++++++++++++----
libmount/src/utils.c | 158 +++++++++++++++++++++++++++++++++++++++
4 files changed, 233 insertions(+), 15 deletions(-)
diff --git a/configure.ac b/configure.ac
index a05a294ad..245004890 100644
--- a/configure.ac
+++ b/configure.ac
@@ -456,6 +456,7 @@ AC_CHECK_FUNCS([ \
err \
errx \
explicit_bzero \
+ fmemopen \
fsync \
utimensat \
getdomainname \
diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h
index d47d26442..52a238ef3 100644
--- a/libmount/src/mountP.h
+++ b/libmount/src/mountP.h
@@ -93,6 +93,7 @@ extern int mnt_valid_tagname(const char *tagname);
extern int append_string(char **a, const char *b);
extern const char *mnt_statfs_get_fstype(struct statfs *vfs);
+extern int is_procfs_fd(int fd);
extern int is_file_empty(const char *name);
extern int mnt_is_readonly(const char *path)
@@ -118,6 +119,7 @@ extern void mnt_free_filesystems(char **filesystems);
extern char *mnt_get_kernel_cmdline_option(const char *name);
extern int mnt_guess_system_root(dev_t devno, struct libmnt_cache *cache, char **path);
extern int mnt_stat_mountpoint(const char *target, struct stat *st);
+extern FILE *mnt_get_procfs_memstream(int fd, char **membuf);
/* tab.c */
extern int is_mountinfo(struct libmnt_table *tb);
diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c
index 3ed84ebc2..10fc68279 100644
--- a/libmount/src/tab_parse.c
+++ b/libmount/src/tab_parse.c
@@ -603,15 +603,7 @@ static int kernel_fs_postparse(struct libmnt_table *tb,
return rc;
}
-/**
- * mnt_table_parse_stream:
- * @tb: tab pointer
- * @f: file stream
- * @filename: filename used for debug and error messages
- *
- * Returns: 0 on success, negative number in case of error.
- */
-int mnt_table_parse_stream(struct libmnt_table *tb, FILE *f, const char *filename)
+static int __table_parse_stream(struct libmnt_table *tb, FILE *f, const char *filename)
{
int rc = -1;
int flags = 0;
@@ -685,6 +677,40 @@ err:
return rc;
}
+/**
+ * mnt_table_parse_stream:
+ * @tb: tab pointer
+ * @f: file stream
+ * @filename: filename used for debug and error messages
+ *
+ * Returns: 0 on success, negative number in case of error.
+ */
+int mnt_table_parse_stream(struct libmnt_table *tb, FILE *f, const char *filename)
+{
+ int fd, rc;
+ FILE *memf = NULL;
+ char *membuf = NULL;
+
+ /*
+ * For /proc/#/{mountinfo,mount} we read all file to memory and use it
+ * as memory stream. For more details see mnt_read_procfs_file().
+ */
+ if ((fd = fileno(f)) >= 0
+ && (tb->fmt == MNT_FMT_GUESS ||
+ tb->fmt == MNT_FMT_MOUNTINFO ||
+ tb->fmt == MNT_FMT_MTAB)
+ && is_procfs_fd(fd)
+ && (memf = mnt_get_procfs_memstream(fd, &membuf))) {
+
+ rc = __table_parse_stream(tb, memf, filename);
+ fclose(memf);
+ free(membuf);
+ } else
+ rc = __table_parse_stream(tb, f, filename);
+
+ return rc;
+}
+
/**
* mnt_table_parse_file:
* @tb: tab pointer
@@ -700,18 +726,49 @@ err:
int mnt_table_parse_file(struct libmnt_table *tb, const char *filename)
{
FILE *f;
- int rc;
+ int rc, fd = -1;
if (!filename || !tb)
return -EINVAL;
- f = fopen(filename, "r" UL_CLOEXECSTR);
+ /*
+ * Try to use read()+poll() to realiably read all
+ * /proc/#/{mount,mountinfo} file to memory
+ */
+ if (tb->fmt != MNT_FMT_SWAPS
+ && strncmp(filename, "/proc/", 6) == 0) {
+
+ FILE *memf;
+ char *membuf = NULL;
+
+ fd = open(filename, O_RDONLY|O_CLOEXEC);
+ if (fd < 0) {
+ rc = -errno;
+ goto done;
+ }
+ memf = mnt_get_procfs_memstream(fd, &membuf);
+ if (memf) {
+ rc = __table_parse_stream(tb, memf, filename);
+
+ fclose(memf);
+ free(membuf);
+ close(fd);
+ goto done;
+ }
+ /* else fallback to fopen/fdopen() */
+ }
+
+ if (fd >= 0)
+ f = fdopen(fd, "r" UL_CLOEXECSTR);
+ else
+ f = fopen(filename, "r" UL_CLOEXECSTR);
+
if (f) {
- rc = mnt_table_parse_stream(tb, f, filename);
+ rc = __table_parse_stream(tb, f, filename);
fclose(f);
} else
rc = -errno;
-
+done:
DBG(TAB, ul_debugobj(tb, "parsing done [filename=%s, rc=%d]", filename, rc));
return rc;
}
@@ -768,7 +825,7 @@ static int __mnt_table_parse_dir(struct libmnt_table *tb, const char *dirname)
f = fopen_at(dd, d->d_name, O_RDONLY|O_CLOEXEC, "r" UL_CLOEXECSTR);
if (f) {
- mnt_table_parse_stream(tb, f, d->d_name);
+ __table_parse_stream(tb, f, d->d_name);
fclose(f);
}
}
@@ -809,7 +866,7 @@ static int __mnt_table_parse_dir(struct libmnt_table *tb, const char *dirname)
f = fopen_at(dirfd(dir), d->d_name,
O_RDONLY|O_CLOEXEC, "r" UL_CLOEXECSTR);
if (f) {
- mnt_table_parse_stream(tb, f, d->d_name);
+ __table_parse_stream(tb, f, d->d_name);
fclose(f);
}
}
diff --git a/libmount/src/utils.c b/libmount/src/utils.c
index c36187c07..f7d85d124 100644
--- a/libmount/src/utils.c
+++ b/libmount/src/utils.c
@@ -14,6 +14,7 @@
#include <fcntl.h>
#include <pwd.h>
#include <grp.h>
+#include <poll.h>
#include <blkid.h>
#include "strutils.h"
@@ -408,6 +409,12 @@ const char *mnt_statfs_get_fstype(struct statfs *vfs)
return NULL;
}
+int is_procfs_fd(int fd)
+{
+ struct statfs sfs;
+
+ return fstatfs(fd, &sfs) == 0 && sfs.f_type == STATFS_PROC_MAGIC;
+}
/**
* mnt_match_fstype:
@@ -1117,8 +1124,158 @@ done:
return 1;
}
+#if defined(HAVE_FMEMOPEN) || defined(TEST_PROGRAM)
+
+/*
+ * This function tries to minimize possible races when we read
+ * /proc/#/{mountinfo,mount} files.
+ *
+ * The idea is to minimize number of read()s and check by poll() that during
+ * the read the mount table has not been modified. If yes, than re-read it
+ * (with some limitations to avoid never ending loop).
+ *
+ * Returns: <0 error, 0 success, 1 too many attempts
+ */
+static int read_procfs_file(int fd, char **buf, size_t *bufsiz)
+{
+ size_t bufmax = 0;
+ int rc = 0, tries = 0, ninters = 0;
+ char *bufptr = NULL;;
+
+ assert(buf);
+ assert(bufsiz);
+
+ *bufsiz = 0;
+ *buf = NULL;
+
+ do {
+ ssize_t ret;
+
+ if (!bufptr || bufmax == *bufsiz) {
+ char *tmp;
+
+ bufmax = bufmax ? bufmax * 2 : (16 * 1024);
+ tmp = realloc(*buf, bufmax);
+ if (!tmp)
+ break;
+ *buf = tmp;
+ bufptr = tmp + *bufsiz;
+ }
+
+ errno = 0;
+ ret = read(fd, bufptr, bufmax - *bufsiz);
+
+ if (ret < 0) {
+ /* error */
+ if ((errno == EAGAIN || errno == EINTR) && (ninters++ < 5)) {
+ xusleep(200000);
+ continue;
+ }
+ break;
+
+ } else if (ret > 0) {
+ /* success -- verify no event during read */
+ struct pollfd fds[] = {
+ { .fd = fd, .events = POLLPRI }
+ };
+
+ rc = poll(fds, 1, 0);
+ if (rc < 0)
+ break; /* poll() error */
+ if (rc > 0) {
+ /* event -- read all again */
+ if (lseek(fd, 0, SEEK_SET) != 0)
+ break;
+ *bufsiz = 0;
+ bufptr = *buf;
+ tries++;
+
+ if (tries > 10)
+ /* busy system? -- wait */
+ xusleep(10000);
+ continue;
+ }
+
+ /* successful read() without active poll() */
+ (*bufsiz) += (size_t) ret;
+ bufptr += ret;
+ tries = ninters = 0;
+ } else {
+ /* end-of-file */
+ goto success;
+ }
+ } while (tries <= 100);
+
+ rc = errno ? -errno : 1;
+ free(*buf);
+ return rc;
+
+success:
+ return 0;
+}
+
+/*
+ * Create FILE stream for data from read_procfs_file()
+ */
+FILE *mnt_get_procfs_memstream(int fd, char **membuf)
+{
+ FILE *memf;
+ size_t sz = 0;
+ off_t cur;
+
+ /* in case of error, rewind to the original position */
+ cur = lseek(fd, 0, SEEK_CUR);
+
+ if (read_procfs_file(fd, membuf, &sz) == 0
+ && sz > 0
+ && (memf = fmemopen(*membuf, sz, "r")))
+ return memf;
+
+ /* error */
+ lseek(fd, cur, SEEK_SET);
+ return NULL;
+}
+#else
+FILE *mnt_get_procfs_memstream(int fd __attribute((__unused__)),
+ char **membuf __attribute((__unused__)))
+{
+ return NULL;
+}
+#endif /* HAVE_FMEMOPEN */
+
#ifdef TEST_PROGRAM
+static int test_proc_read(struct libmnt_test *ts, int argc, char *argv[])
+{
+ char *buf = NULL;
+ char *filename = argv[1];
+ size_t bufsiz = 0;
+ int rc = 0, fd = open(filename, O_RDONLY);
+
+ if (fd <= 0) {
+ warn("%s: cannot open", filename);
+ return -errno;
+ }
+
+ rc = read_procfs_file(fd, &buf, &bufsiz);
+ close(fd);
+
+ switch (rc) {
+ case 0:
+ fwrite(buf, 1, bufsiz, stdout);
+ free(buf);
+ break;
+ case 1:
+ warnx("too many attempts");
+ break;
+ default:
+ warn("%s: cannot read", filename);
+ break;
+ }
+
+ return rc;
+}
+
static int test_match_fstype(struct libmnt_test *ts, int argc, char *argv[])
{
char *type = argv[1];
@@ -1300,6 +1457,7 @@ int main(int argc, char *argv[])
{ "--guess-root", test_guess_root, "[<maj:min>]" },
{ "--mkdir", test_mkdir, "<path>" },
{ "--statfs-type", test_statfs_type, "<path>" },
+ { "--read-procfs", test_proc_read, "<path>" },
{ NULL }
};
--
2.21.0

View File

@ -0,0 +1,53 @@
From d9fe56d8da9015694fcba5f3dd850becff677ab5 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 20 Sep 2019 13:00:19 +0200
Subject: [PATCH] libmount: use fmemopen() in more robust way [coverity scan]
Upstream: http://github.com/karelzak/util-linux/commit/026f7d302066a4e6f5a69dc9818ec3180939f4a3
Upstream: http://github.com/karelzak/util-linux/commit/bc747dfccf511419312ec872cefa90e25d83136a
Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1751447
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/utils.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/libmount/src/utils.c b/libmount/src/utils.c
index f7d85d124..04e79f53f 100644
--- a/libmount/src/utils.c
+++ b/libmount/src/utils.c
@@ -1219,20 +1219,26 @@ success:
*/
FILE *mnt_get_procfs_memstream(int fd, char **membuf)
{
- FILE *memf;
size_t sz = 0;
off_t cur;
+ *membuf = NULL;
+
/* in case of error, rewind to the original position */
cur = lseek(fd, 0, SEEK_CUR);
- if (read_procfs_file(fd, membuf, &sz) == 0
- && sz > 0
- && (memf = fmemopen(*membuf, sz, "r")))
- return memf;
+ if (read_procfs_file(fd, membuf, &sz) == 0 && sz > 0) {
+ FILE *memf = fmemopen(*membuf, sz, "r");
+ if (memf)
+ return memf; /* success */
+
+ free(*membuf);
+ *membuf = NULL;
+ }
/* error */
- lseek(fd, cur, SEEK_SET);
+ if (cur != (off_t) -1)
+ lseek(fd, cur, SEEK_SET);
return NULL;
}
#else
--
2.21.0

View File

@ -0,0 +1,28 @@
From 6f16035b81cd7feca02d6df8eff1bb954ed7e58d Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 4 Sep 2018 14:30:37 +0200
Subject: [PATCH 29/32] lscpu: use the first VM from /proc/sysinfo
Addresses: https://github.com/karelzak/util-linux/issues/685
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1739443
Upstream: http://github.com/karelzak/util-linux/commit/350f5c8df2cb6edbfb5bae95f00a9fff446d236c
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/lscpu.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index fd6d63bbf..1aa7bff4d 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -866,6 +866,7 @@ read_hypervisor(struct lscpu_desc *desc, struct lscpu_modifier *mod)
*(str--) = '\0';
while ((str = strstr(desc->hypervisor, " ")))
memmove(str, str + 1, strlen(str));
+ break;
}
fclose(fd);
}
--
2.21.0

View File

@ -0,0 +1,206 @@
From e10bdfc6cd623f02740cf2bcfd9867c56534c5e5 Mon Sep 17 00:00:00 2001
From: Radka Skvarilova <rskvaril@redhat.com>
Date: Sun, 22 Sep 2019 13:49:45 +0200
Subject: [PATCH 30/32] tests: lscpu s390 nested virtualization
Signed-off-by: Radka Skvarilova <rskvaril@redhat.com>
Addresses:https://bugzilla.redhat.com/show_bug.cgi?id=1739443
Upstream: http://github.com/karelzak/util-linux/commit/2062164894fffa314ecb7ac99dc6c98062484389
---
tests/expected/lscpu/lscpu-s390-nested-virt | 45 +++++++++++++++++++
tests/ts/lscpu/dumps/s390-nested-virt.tar.gz | Bin 0 -> 7199 bytes
2 files changed, 45 insertions(+)
create mode 100644 tests/expected/lscpu/lscpu-s390-nested-virt
create mode 100644 tests/ts/lscpu/dumps/s390-nested-virt.tar.gz
diff --git a/tests/expected/lscpu/lscpu-s390-nested-virt b/tests/expected/lscpu/lscpu-s390-nested-virt
new file mode 100644
index 000000000..2665fd8dc
--- /dev/null
+++ b/tests/expected/lscpu/lscpu-s390-nested-virt
@@ -0,0 +1,45 @@
+CPU op-mode(s): 32-bit, 64-bit
+CPU(s): 2
+On-line CPU(s) list: 0,1
+Thread(s) per core: 1
+Core(s) per socket: 1
+Socket(s) per book: 1
+Book(s) per drawer: 1
+Drawer(s): 2
+NUMA node(s): 1
+Vendor ID: IBM/S390
+Machine type: 2964
+CPU dynamic MHz: 5000
+CPU static MHz: 5000
+BogoMIPS: 3033.00
+Hypervisor: KVM/Linux
+Hypervisor vendor: KVM
+Virtualization type: full
+Dispatching mode: horizontal
+L1d cache: 256 KiB
+L1i cache: 192 KiB
+L2d cache: 4 MiB
+L2i cache: 4 MiB
+L3 cache: 64 MiB
+L4 cache: 480 MiB
+NUMA node0 CPU(s): 0,1
+Vulnerability L1tf: Not affected
+Vulnerability Meltdown: Not affected
+Vulnerability Spec store bypass: Not affected
+Vulnerability Spectre v1: Mitigation; __user pointer sanitization
+Vulnerability Spectre v2: Mitigation; execute trampolines
+Flags: esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te vx
+
+# The following is the parsable format, which can be fed to other
+# programs. Each different item in every column has an unique ID
+# starting from zero.
+# CPU,Core,Socket,Node,,L1d,L1i,L2d,L2i
+0,0,0,0,,0,0,0,0
+1,1,1,0,,1,1,1,1
+
+# The following is the parsable format, which can be fed to other
+# programs. Each different item in every column has an unique ID
+# starting from zero.
+# CPU,Core,Socket,Node,,L1d,L1i,L2d,L2i
+0,0,0,0,,0,0,0,0
+1,1,1,0,,1,1,1,1
diff --git a/tests/ts/lscpu/dumps/s390-nested-virt.tar.gz b/tests/ts/lscpu/dumps/s390-nested-virt.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..7992699925395ed8d33b1e1466b74fc1aa235268
GIT binary patch
literal 7199
zcmb7|dpK14zsFsYO}nPFYuZ%PMd^Z336(4*TcRer3sNpgD3MZbv80PMNo`w{G9oG0
zqzEx26v{10($JJUV=(5n*7}?^*}wgq^E~G{&vW`mYx%D4_jCJx-mecD^A|aJ^PPv}
z6bJ7eib<%-zkE8l+t#n8FlzI-@}kEz)axa}w(L)lt9PBsIIOAv%}zn7;nQdi5~WYu
zJ{neZKDMS$*w*%R=W)|!D?0w%vFL^?&s?4AW{mpAeg7e#;9SqG91c9*fS(3`-H^qX
z)Y3P;zr?$Q=%Hctr>gQ-q}<J=jcTt>_}aRkprjf_!Sec}n^BcIE<Kh$6ICsxLEF)U
z2h7a0<9p@z@7PR57h|28L}}W0O5H%8B+6(Z6dT=h7wg~7Q=C09oJMJ7jTe0DXWI)7
zU12V%Wt!c5QS{b3@66McpO(MBP294MAAfMJFVJ?NclGMH!1?dmh$FMR59xe+^rhRE
z?=*WZ)n-*&!3vg+y^ZevH4fBS4)0<PSA08Ca&+txQER-){-ExWmq%*9pA9T-wAFPz
zD~vs)lWhNVM~$ZLLX$_;MzgKgRw~SWI!j|+Hbtds4%dV$&t1%2T2*ZwVBITJU9LI%
zstPMIEb>O=O+sXSYPld#Gv=x#>uuQE8!Mw%zW>{Khm+}=AL~*n*W=aKaa>K@OPx!P
zguV%1Gi}4PWz*(N3z^$bNkO8j|F|199x+Se`nIt}`;Lxl^yalL86sWBl5d$`PJFZV
zNm+ZiQo9+&<F)*65~<AZ4%k&@W4%}G1HK<HvVNP}7gqPzBkSS6P6_*oI;?FS+lslC
z^S(yYitT^ix8WSoc{0>DG_(<Wdnrv<+B@2|r{LT;GbibN&LWDfXz9+mmd0#En&$Sm
zEj-#aS5)ftSUuFqkP!FnYwv4`m%ch~!XD3FsPyKgN-=XRIsK~bAP0z>p0SmlkLwX;
zO@+<E?c$u9y7mK%)cOocq;JwOt*!~J!luLSeP=^b&Oj0y&!vF4s=HYKfY!Q@x>n&>
zb%o^pf&LUq1pBnAcfeJ))LRVEyaF(6Pp&pe3IqnMY=o3fvB>ABC4(bBCXz0skmYlS
zi$wF(I?npN{KE=h6QA-xwGq-frF{BXr4A8&CUy|cZ^c%MW~Mr9ewKdOQ~W)bmQfv+
z`M!l$v}uz|+F<Zy+S9<78&@~`8k>w*Es7>W1S^T-8fkg)C5>7EnE3PN@{FKlTbixS
zfy8@Xn-%}6h;2*oNQt=oW4LRxyKSgZM@z+~wgEAe9^o~KYx~^;O1{4vT_)AJepS20
z{5hB1V{<^0-xU)e?Qck_kM=cbu1;>R=wTzei5qlT8?qBO46|tLpfP@QIGz~WXcMJ8
zx_e}~74>b_j2~F(hfVWg?;m~GQQ`PfVKvHR8nJ`V37aE{p2`RgrzGppx2|nz)#B2t
z-sv~R*+k?6;@Cm_udEpTjoW(rbfn1)zP445P3fjpdtH4~T~n47eq`s*7-iBMyPlmN
z!TC0~&#fA(+IUg0R$$j1jW_Z);Au~9@**tU%J<mMyY}72UbJ`awW?~C+uqgO`x{qj
zAhF`054Lpf*FCq@-=>^C<+yq_)|)qy7SwoQFR$0X^XdL>exr?jmgB`g3E2;khu^{d
z8B|@1YPMOH<I7wl;_mYx{y1E(IVSk#8#-RhObfE%>KR?l>U_R-S$N7?o7G%w#qhVs
zjvqW;NB3JlI&hmFU5g#K{Y!MH|Ev!+yZR3pw=h*JMtc3JDF<%nT<^EOcHC|Bh2xPd
z$F0K)Lh3brR?MF6_Vm8>`oG1~-L{z7f7)$uY=s8m^iaLueEkRJu}9RF-SqVPj(g2Y
z9$gNynJ!44`~_z>J=Cm3G+pq`@B{OId6+U?pr-%9s$n<1+_U6h35X<y6Sbj586VfG
z`mPAbyLPH$=<3*m6*2Z}T!eWScrj;^rQZgL>J))*!N6w91iJ7lD;tI7KRQ_WvxKq>
z2ey<Xl$mEGeP!%^&J~1i#Z`T{f$LAdpg*D^m~Mm>?NHL!93#p3&%TbEh}`{2!3Y}K
z5K^4C@ogOc*m!uJSuXLT#@Hb@I`C|Q#ej-bTu*7`#rR1D#85=Ry?qOEg04iYySqQ}
z(Sn@TLwG<*e}B)0>>`|xhUjqpvR$!}gfE~F(S#62{my+E!Q8eLw+!i9O}goSfAD|n
zJ1>%YemGg=yZ%^Fq;OwFeMWaH0|JFSPRQ96CK-2pTG3&txZFz6RGgz8>bU;T8tLr2
zAFrj8XIbMS`*$O}mO9Sn8K+|N`0Rxe;XTE}CZLr%vIZ>5{kbSI)Y>X6J4_&Z-@xMg
zYX}L??d34GUXO|7bfe~v$V;so30`?a;|uhn(OxAxSlZPj8i3$@CxtO7I&a5y(H`gD
z;KaE!3#F>oPxMj!Oz?etol7^O7-z!nk*?N)91c4e@7ot!XS+;iXQ}UoLdKT_%<fWJ
zP*)4{k>e3TaypeAq>>)@B<S~jbZ-BTGlJ3PIaPijcWoT0O*y<_XI_)`vLuPx<I^2T
z2NW7LvOC{E>Ulb5t~uq@!2HVnAbrp>EvGRZ<vqjWjDJl+RgdU}k1nX%4)zCrWN0|0
zWI;~wEq5G^BoLMP{r>7pacX-)#p1l<gFWc0kx?-XcTZ|Z`J+DsTy)=#r^L(>+c2)g
z@G2~qs`Yf|g-JyTb)YgVbH02DAvVy7Ib)pl(!Sklxx&O|?BN89H36~IMZmgv;((W7
zf_5w4f>E|bdmP#HVAi3~s0o6NZiF<2I=DIWMD4Gy{Nr?oApg_g?BCN`5RL4{&jc$9
zLO4AQh*G@JKVgO>`l#C}YC$9@uf~J_G=<+x!Q1sdq}K*;CKx^ZRiAgZzRQyv!l7AA
zbJ{EBG{A`6YcwyBh@I1Hteamn$IjgC?)$UNmv1Lch*)1iakv~93d7_k4?sVmdTw&&
zZ{GRD(!erWE1I71*|BIrwZP{Vj5+hy6<-$PEM*VyER(R?=k+0X>d)lVi+r8Cxv1_F
z!a`Akdb=7C4(5TQCm_@A!trPQtlDM)(q{&m+UpiHXzQfR@t&f4_yHU#y_%Nib-Y*J
z%LgtrPawbM5{#|Awv=#bF`^_Y)@y~(Azt!JwzAh}ltR$dL@R#9oxew!eVKCb^>(Pu
z{F0ep@bLFesn{tG^Qq)x6t&E6PHv$Zb@By5*fqw!^ydqRDXZ?q3$Miz&kuWZYg?Ys
zx_*BLSHoO!)|5IZii#zuHiw<zg(<jm5!|qs6;8F2J4+@%u5G!4TfwFZ`J_q_eWVkX
zmFp4-KeD$UZ6q()QC3QOz@0iWEhfaKTCkPJ5X~g$F*qw>xdk%22jT~uPMs%cDh=%R
zPkr#DQTlAV_kPQu_WZdX+31`_5Ha;v`0|j7Gi)sz7tLT2=$l3&CTxOpV&gc_z3{Bh
z=;INLq1HeY@1#h4JY_E;F(-BMIqDwa^K@{mYz%z^i{vG;LZIbCG#^pv1=(WSLx}D{
zZ^-r<97pO?=)R$Szmz3I&N&gXJ&fph7(*x@1j-shOCCoH`piKw6Q+HKpC8mE!td{H
z@f)OU-z=2=YZojc3%OmSYY?QccaC#j4|`g9E@2gJjz#&O*KY<BLW-mJp)2<~yIl81
z7S7JYX(88fCyz2B+S@e?y>Mtzdpk7aGy$RqRtgiSU&8PZD%HKwJ%-39g4vXA^vlCM
zg8oUVX)7!oMLbCJst&-^V$(bIptR&7FsCp@T15rImUZ!R&u+uC5zI+#kc*1fh7}U2
zqk3Qw9)i_&biZ;pCDZ-B8+|D!MAg3j;dW6ssrb_Xn#zN?%}O87VOp0W1Wsx<$ox!5
z=(lVZ)~6LY7hN~l*{avd=DC2fdeYBG=u9=8hEKaBpsDG>0J)UqR%;a9+_tM0$x56$
zK2+Ejb{1!Kqe^#EaIGyO`C+*kt~o$&%#J_G^xXSfn|5T)ciol#oRZ6dQktj%nZEQ9
z$8%7?@@_Tsb?lJ8`ohav&Zian2!@HU6P7OC{X+hQbp#*A77(*P3(!)c#}#O5FXrLb
zHiePq!zm5t)RTD_ZDrsUjHX&t1!@}3131(Hb^CcKqA~)7J8f~N!-|=j-rcZgu?5+-
zWbb^2&<oQW0tnmTw2Mio!V_Y^Af%7|cB)4vI_s*On5IegiROI}_eri@3Tb1={Z~Ye
z{--JyWeE1fLrR$mp(uq0&?+|}HcMntO{F>$aTonPZMq#g0_*=ApR(Y!BamzKh^6ub
ztsu7*$_V5d{46diPU(UQ30)-~&S(VVltD0)G88bfALPJ!9Bn{Uc9S<^0JQ^J^%(gH
z)SuXR4T8tvUJjIlMTJoqUhg(2Kr(^h42W7$6{-icMA#|Yf;9Sq7)CHHwN5yl@bxp4
z;^ZAzB0s?PZjK{@g|HYdOzGvEDC$R70Br(IE;k?!djKn1jHnKBktaaGQL=oH5dw{e
zW%5!ej4C0NC%^@>2oDq8t8yd_hjTJVNUMSxVJ1PE@mHAGN#^1c0y#gynj(TPlk1XD
z^(Vk0U12kT(}%I^HzdM#1>uzWVKbUtFir~4jfCKW$4%*4=_S{zHzA?bKsANj<Yy{n
zUP(~RGO{8M36OZ8)T2w}38bJe3+J^%1V&f;CvE;f8%2IbHiM7~fqwxg1Vzn@OIIF~
zJ<wlcG^GjtKYKp|%}>?nBOFBK5FtR+CJmGY0}+Aj22SSTK89kQP$7zzc|-OfVL!AF
zIF*5wVmI1BdS@p7xxv5QPChH+F>*g0{%5}%VE!{HE*NqHcu&aUC7qoN4_O<Uqv(oW
zbs%urQD!iC)T9d~vedf&Cx>5u8e>LKRqWtQLg_e%1wK5OwfJAJNk_ZHh~~W4EDby2
zx?Uo1T~?4#5^jUh3$O)^4^dr44;V#2++_;8Gz2F)1{gVhVOp`NKBG~!Z<k!JIkAut
zn)zx^$w<HXUi#A@n-->1$&?l=yOL|^alV4lq9Adf>SiV?_lJb_!zTCcL;K$iyMymO
z<pFD;)Bw=WKt1R}u%?ubPz`U6=*>7e+W|NH5zJ~z2U2q$vu}`kyw-H;qgql2tyX75
z@YjE?hO{B1M~$quPVm$C9~jZ#OfZIept3fuH5xj+nEhtsj`G(BI4g*_G;Bd`G~0%t
z2}dxxy7o8JvW7EDy0FxSV2y5-HE0Ye$ZddSD^ZJQLST%+MOCr`DvXjjw32dejQVdo
zE=389%BhwhDwBlZvqQY;)mBJ+J?3O7>#bWM?g1IIuYlYG{v}hgVa(-oGSg7EO8sbN
zmbcP=n?m##y9(>w!B~AFRPZr>^^@RFdXUy;oIlfz>_!6G+YF2+6|nl#^W(g$eer}J
zaHMZZVMq7nm2%xebYT*nCO`0#Av{c4OH5L}a8$?m2-OZ!NUhSS;B!{h#Q4}eceqi$
z{(zwVN1ud6l9<}9+cP|F-D*@dRG_YDLf1M~HrwZ~AD7E7fV6t_yUP^;suu2CSAC;2
zFMa@JPx#w><tQ2qArTNU#iU7qs9#brSfsV43D&MQ%oxh@oGJ<>TD8GpUp;C;2uJKH
z*)^C!yrMS`?scQnF5zsCPFI>?Xhd!kdw<=DbA{>?OO4mz$_f%KnUSk;dh+Ws!uLE;
zUxjX63^5l;A~^N`B!cQOB(iMirv}%K&VARqrj`9&0Y}tGrO9nZ3+uQZCOUs5?EC9$
zewNam0Vkz5aDR&_>}qBbX&DbZW=5C;^4$Y0O{F}81rng<6Z?nQdjkk96%XimsEijp
zlfBqR(5I8nRlC5@ej>0_j2OdtSqI$Mi+&=IDj<=BXRx^!jVF*q*rM=Rb~YGCm%bLK
zE|p^vY}FfNXC3Dm+#5$aCFqrZ7=kXLIpa=C$k;w36FGs^d*okRIf0J7O2;F>H9-3t
zJBoKWMay)byg@KgJahg4Ths0}CxE*BG|t2cwv02YInLBK9|=wy5p7aU(Dj|cq9FI9
zj1q>1NCAv)iu>7tk)oZ#33do|`<R%usB^L@zu4)HJ3X29;1aR<JK7+J7e_rOrk_2p
z&w^>&egP_3u?#;SUWU7#yvI7Ac8b|#&x27nxzo7S4;LbOic}O={O(eHm@L`vAV7W?
zG+##5{Bp?DpX}m0I6x0p%@m6msua@fMNoZWP~fDUVw}i0Q|`Cm#GP!HY?M<$Q1ll;
zE2#k}Q@&v<Y<0mWW03>)`Pasb?hQS|n)^LXIf)4~JX*n%ur14lY13a(PAZ?A7fcQi
zXDjs`tW%QT9JSoL+~2ZLI=sHF9m*mI&$4`$ObPvpOC!hnXY79M=Bf}-OfZD#=!OW0
zzG&JtwR7!)Dya7tG02U@5>_;hZtpxizHV4<_;3!?o(PM5^==e>@Y{Sb@|#~2EHfzk
zD23ZVzo9^qk4zS`CG6Kz?JU34LE6^q*yKA>DyM2B@v)pQ9J2ltI>A@gXpboBe`Nn+
z9!5g541dzW$}8;Ww7}Z!0=DX2-1>+Kvh|`eO>rjWN+vFB3*fY2IpgGz^4Ey2PR+TD
zO+5RniAfhoNhjA-p=3zOnit5#mW%u}$Z;IG2(n-&;r{;@5s;rJlI={U^FQ^IcMd1z
zQoTxk5Y?T8hfidLviY<+i0DCoYLQ<H>?X*XkDMwKvVsY=52==HQogHCNSaU{fqX}A
zkOf3i5~Z8ec8W?qpK2zBt#x4IOq1bAFT}|HBZLZ!uJVag{r_gU@1(IZnIvx%i34&3
zG6<H6|FR5uJ7u6S`3c!MCV4_iqRe}c-sOs;HBU0i<a_nVe3Bd$ei~>WQOlW$ucn5{
zu#r4nZ8C?>1TsF!93;4qT#yLcen!DT$|(Sf*omYBu8iP(!0F1rxhlud078RwD2^1{
zbScsem#hC9xGC}=LhSS(0Fc3!Ozlw_yZi%g<lyjcW@H#b0?H?d_*e7ERb*Qx3u-b7
z7szHHi*bcWMsB1Z|9Z|?3=!dzSs}-rNhXy=dyF-SQO6;8f&??>RPywPbX+(LW`weA
zEFzOfdOir-UZwI`T9wOJxz}oztS|i|7-R6@;6*#ok{6-{g?s;*@}_2Uv{qe8cn86y
zqicY1-V@6RBwnm(=ia?VusaD)Ebt1>_H?dGc;c1&=u|+?JnroMx?@Ins4+Vi`Xs;H
zxMI22>>g&?(t}_vaI<_mps%ZS8V?QG4PLpQzZzqE;6qRdzKl^LT7D-a)JR(x!TZ=k
z?dytfLT>BSXu?3(n}Ap2?1u?n&x;Vv@%29Y+Xlx3e1}V=y9CQhziKBB^>_Wf)#PO`
zF8U)R*4#HF?~wL4tSdeTeQs=78xgG)j#oQW57^&E95>#5vhURCtkw5VZK`Xk&bT&1
zDNvtLYBFDgSN|l^TaXlxioC*oA0zDS%pDFCi}6bK5pfSYpKlPFe(-V51UhuD!#hE5
z-ev!n8NEtgs#6s#-+x@-qa1s7{)Y0t2GQ)ZpC8&H37Qux_v9XW*HR;$Z`9--UOvG@
zN8Cg6k1gt$p}P1M+T)hj;ii~S$KNj~R9+sdq15rK_Gmt@l!%YKHC^p?26q4MyKOpS
zFG^{559{WcKJ%+R>R(W^BjNp>vju{>TJBCkgx1>1=E{XW#~1rp9c@0gbW9M+*?z&;
zC2`K+e0u%1gndpubJxx;oNs$%b?Uaopn0OU+}vH+ZRx5!#)gwmw|x(In7(ON<SW-#
z;f)3vwAG%G#cZz!e(pWTI%xO&_Idr`U;MJBvP<n|V!E_V&uK<&pV!Xt@?{f$oZ8nX
zy>ilSDEPQvdhzHIdew_fehzWdhp?ygHR<_H*HnYnEbAHb?&~xyc{O3f+*9uFTKMvF
zOWY$j`sKWp_@3SpdrSPL!EwhA;W@>7LNsed2X9orUF3O_dQMXBfb^7c)|`OTj?||=
z>JK)}W5Ln`KsT52lzut=IldpL$5-#qw2~ZQRlOi`T4AOL4LrQ7Q+}hHwZQ4)?>eWB
zZ5Tz?K12n%7Fl?;6s7wqJ~XS?Uw`UIsq5ZBhkVI{9p*~gl<uo8ne%#8e8wW1E$QKx
zRBx>kC5Jm0?<7`R3sCj!O{rZC<Uo%bBBt5RRdx`Yhmi=dCEgj&p@!G@0^|2RxZ(O9
z@xzlr3P!!ic_^SIfv0OWy2ppHAoXOefVS8&m#9!a`@`qk(BpLytW^jzWZRX&>Cd0~
zIIr9HSXh2}4>6kYz*oeOv?y08gcqc}7m0WhoN;$*01PN)0?WW#g1&9vQ@sVI5Kf_C
zL>l?0hn+7spQ(~U>losD5eLlqAfdy(%#t?GLy6<$L^6L29Lq3xwx$K4U*Zn3D=@?|
zMzb7aQ@m<8CnoBXaIMdn(-j^nxu34&C}%xS1E*Qw6P}-<!BVeULZ>@p$O&tK5Aoc8
zfs~KVRBB*Tt!u%>X>Vp~!pk@2x+z{wPlh4FCEgkQ=`U`fZ&mLb*y~xkKEqoj;5%~*
zIEoyZ8b$57IueL^y$@dA-1pFJKzVIq)g$6L&iXc!0}~a7_IHKP+K+Z0E%|!-<5&GN
zjw<3>&t*$l#oLY5zpl*rh#JY3yY@oXynfc^+#yH3=Th6Y4>g=<Ga>J8YcKlFT!$u~
zU}h$^s+Aj*!kGRmg5qdO&I&L3*^3Ul-?>~uq%5kE(CDVnT(u4M-CNUBNu%BUi2BJ!
zPh2=Jj;*RtaKQNx;WG2G9dMOuN8=8i|I6T(=e2y0NWti}1f_5D7?+p(_g_E(Hg(Yb
L#Syu9MY;b1+Xr6l
literal 0
HcmV?d00001
--
2.21.0

View File

@ -0,0 +1,43 @@
From 90d4faece26c328c40336a0e02b875515c503e30 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 19 Aug 2019 14:03:07 +0200
Subject: [PATCH 31/32] chfn: don't append extra tailing commas
# grep kzak /etc/passwd
kzak:x:1000:1000::/home/kzak:/bin/bash
# chfn kzak
...
grep kzak /etc/passwd
old version:
kzak:x:1000:1000:Karel Zak,,,,:/home/kzak:/bin/bash
fixed version:
kzak:x:1000:1000:Karel Zak:/home/kzak:/bin/bash
Reported-by: Filip Dvorak <fdvorak@redhat.com>
References: f723cbf544a7eac2927634f2cb6d802437a2d519
Upstream: http://github.com/karelzak/util-linux/commit/9210c0d225fd808da451d86055bf243a8b47a525
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1743555
Signed-off-by: Karel Zak <kzak@redhat.com>
---
login-utils/chfn.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/login-utils/chfn.c b/login-utils/chfn.c
index c5312fa0c..4f32604c5 100644
--- a/login-utils/chfn.c
+++ b/login-utils/chfn.c
@@ -377,7 +377,7 @@ static int save_new_data(struct chfn_control *ctl)
ctl->newf.other);
/* remove trailing empty fields (but not subfields of ctl->newf.other) */
- if (!ctl->newf.other) {
+ if (!ctl->newf.other || !*ctl->newf.other) {
while (len > 0 && gecos[len - 1] == ',')
len--;
gecos[len] = 0;
--
2.21.0

View File

@ -0,0 +1,83 @@
From 447b7d7222bf8cb3591d611aa51917bd4453f8d6 Mon Sep 17 00:00:00 2001
From: Radka Skvarilova <rskvaril@redhat.com>
Date: Mon, 16 Dec 2019 10:57:32 +0100
Subject: [PATCH 32/32] tests: add new test for chfn gecos
Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=1743555
Upstream: http://github.com/karelzak/util-linux/commit/02238bff663ce5fe823980d8119f3871cc348764
Upstream: http://github.com/karelzak/util-linux/commit/b2ef43864f24b1a9c0c67fe2a7177a5110da1b6e
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/commands.sh | 1 +
tests/expected/chfn/gecos | 6 ++++++
tests/ts/chfn/gecos | 36 ++++++++++++++++++++++++++++++++++++
3 files changed, 43 insertions(+)
create mode 100644 tests/expected/chfn/gecos
create mode 100755 tests/ts/chfn/gecos
diff --git a/tests/commands.sh b/tests/commands.sh
index 93100caf6..b56381c9e 100644
--- a/tests/commands.sh
+++ b/tests/commands.sh
@@ -104,3 +104,4 @@ TS_CMD_UUIDPARSE=${TS_CMD_UUIDPARSE-"${ts_commandsdir}uuidparse"}
TS_CMD_WHEREIS=${TS_CMD_WHEREIS-"${ts_commandsdir}whereis"}
TS_CMD_WIPEFS=${TS_CMD_WIPEFS-"${ts_commandsdir}wipefs"}
TS_CMD_CHRT=${TS_CMD_CHRT-"${ts_commandsdir}chrt"}
+TS_CMD_CHFN=${TS_CMD_CHFN-"${ts_commandsdir}chfn"}
diff --git a/tests/expected/chfn/gecos b/tests/expected/chfn/gecos
new file mode 100644
index 000000000..af7b81b6c
--- /dev/null
+++ b/tests/expected/chfn/gecos
@@ -0,0 +1,6 @@
+Initialize user
+testuser_chfn_test:x:9899:9899::/home/testuser_chfn_test:/bin/bash
+Changing finger information for testuser_chfn_test.
+
+Finger information changed.
+testuser_chfn_test:x:9899:9899:test_gecos:/home/testuser_chfn_test:/bin/bash
diff --git a/tests/ts/chfn/gecos b/tests/ts/chfn/gecos
new file mode 100755
index 000000000..aad27d40a
--- /dev/null
+++ b/tests/ts/chfn/gecos
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+#
+# Copyright (C) 2019 Radka Skvarilova <rskvaril@redhat.com>
+#
+# 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="gecos"
+
+. $TS_TOPDIR/functions.sh
+ts_init "$*"
+
+ts_skip_nonroot
+ts_check_test_command "$TS_CMD_CHFN"
+ts_check_prog "useradd"
+ts_check_prog "userdel"
+
+ts_log "Initialize user"
+useradd -u 9899 --shell /bin/bash testuser_chfn_test
+grep testuser /etc/passwd >> $TS_OUTPUT
+$TS_CMD_CHFN -f test_gecos testuser_chfn_test >>$TS_OUTPUT
+grep testuser /etc/passwd >> $TS_OUTPUT
+userdel --remove testuser_chfn_test &> /dev/null
+ts_finalize
--
2.21.0

View File

@ -0,0 +1,83 @@
From b30f84e240bd60a23508797e33a4777cbaa50949 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 17 Dec 2019 10:53:47 +0100
Subject: [PATCH] tests: update lscpu test for RHEL8
The test is originally from upstream (~v2.35), but RHEL-8 uses older
version with a little different output -- RHEL-8 has no vulnerability
fields and it counts cache sizes in different way.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1739443
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/expected/lscpu/lscpu-s390-nested-virt | 57 ++++++++++-----------
1 file changed, 26 insertions(+), 31 deletions(-)
diff --git a/tests/expected/lscpu/lscpu-s390-nested-virt b/tests/expected/lscpu/lscpu-s390-nested-virt
index 2665fd8dc..a6ab04f0b 100644
--- a/tests/expected/lscpu/lscpu-s390-nested-virt
+++ b/tests/expected/lscpu/lscpu-s390-nested-virt
@@ -1,34 +1,29 @@
-CPU op-mode(s): 32-bit, 64-bit
-CPU(s): 2
-On-line CPU(s) list: 0,1
-Thread(s) per core: 1
-Core(s) per socket: 1
-Socket(s) per book: 1
-Book(s) per drawer: 1
-Drawer(s): 2
-NUMA node(s): 1
-Vendor ID: IBM/S390
-Machine type: 2964
-CPU dynamic MHz: 5000
-CPU static MHz: 5000
-BogoMIPS: 3033.00
-Hypervisor: KVM/Linux
-Hypervisor vendor: KVM
-Virtualization type: full
-Dispatching mode: horizontal
-L1d cache: 256 KiB
-L1i cache: 192 KiB
-L2d cache: 4 MiB
-L2i cache: 4 MiB
-L3 cache: 64 MiB
-L4 cache: 480 MiB
-NUMA node0 CPU(s): 0,1
-Vulnerability L1tf: Not affected
-Vulnerability Meltdown: Not affected
-Vulnerability Spec store bypass: Not affected
-Vulnerability Spectre v1: Mitigation; __user pointer sanitization
-Vulnerability Spectre v2: Mitigation; execute trampolines
-Flags: esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te vx
+CPU op-mode(s): 32-bit, 64-bit
+CPU(s): 2
+On-line CPU(s) list: 0,1
+Thread(s) per core: 1
+Core(s) per socket: 1
+Socket(s) per book: 1
+Book(s) per drawer: 1
+Drawer(s): 2
+NUMA node(s): 1
+Vendor ID: IBM/S390
+Machine type: 2964
+CPU dynamic MHz: 5000
+CPU static MHz: 5000
+BogoMIPS: 3033.00
+Hypervisor: KVM/Linux
+Hypervisor vendor: KVM
+Virtualization type: full
+Dispatching mode: horizontal
+L1d cache: 128K
+L1i cache: 96K
+L2d cache: 2048K
+L2i cache: 2048K
+L3 cache: 65536K
+L4 cache: 491520K
+NUMA node0 CPU(s): 0,1
+Flags: esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te vx
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
--
2.21.0

View File

@ -0,0 +1,91 @@
From 60f97394878d8b540ee6a4fb9c9edaae2f90d0d0 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 17 Dec 2019 18:10:31 +0100
Subject: [PATCH] tests: (fdisk) make sure we use the same sizes for MD devices
It seems on some kernels MD can return error if the devices in RAID
have different size
# mdadm -q --create /dev/md8 --chunk=64 --level=0 --raid-devices=2 /dev/sda1 /dev/sda2
mdadm: RUN_ARRAY failed: Unknown error 524
# dmesg
...
[ 1485.148435] md/raid0:md8: cannot assemble multi-zone RAID0 with default_layout setting
[ 1485.152306] md/raid0: please set raid.default_layout to 1 or 2
[ 1485.154050] md: pers->run() failed ...
[ 1485.154104] md: md8 stopped.
Reference: https://bugzilla.redhat.com/show_bug.cgi?id=1784534
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/expected/fdisk/align-512-4K-md | 12 ++++++------
tests/ts/fdisk/align-512-4K-md | 4 ++--
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/tests/expected/fdisk/align-512-4K-md b/tests/expected/fdisk/align-512-4K-md
index caca03154..3690c04c2 100644
--- a/tests/expected/fdisk/align-512-4K-md
+++ b/tests/expected/fdisk/align-512-4K-md
@@ -16,7 +16,7 @@ Created a new <removed>.
Command (m for help): Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
-Select (default p): Partition number (2-4, default 2): First sector (43008-102399, default 43008): Last sector, +sectors or +size{K,M,G,T,P} (43008-102399, default 102399):
+Select (default p): Partition number (2-4, default 2): First sector (51199-102399, default 51200): Last sector, +sectors or +size{K,M,G,T,P} (51200-102399, default 102399):
Created a new <removed>.
Command (m for help): Disk <removed>: 50 MiB, 52428800 bytes, 102400 sectors
@@ -27,8 +27,8 @@ Disklabel type: dos
Disk identifier: <removed>
Device Boot Start End Sectors Size Id Type
-<removed>1 2048 43007 40960 20M 83 Linux
-<removed>2 43008 102399 59392 29M 83 Linux
+<removed>1 2048 51198 49151 24M 83 Linux
+<removed>2 51200 100350 49151 24M 83 Linux
Command (m for help): The partition table has been altered.
Calling ioctl() to re-read partition table.
@@ -49,16 +49,16 @@ Created a new <removed>.
Command (m for help): Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
-Select (default p): Partition number (1-4, default 1): First sector (2048-100095, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-100095, default 100095):
+Select (default p): Partition number (1-4, default 1): First sector (2048-97791, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-97791, default 97791):
Created a new <removed>.
Command (m for help): Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
-Select (default p): Partition number (2-4, default 2): First sector (22528-100095, default 22528): Last sector, +sectors or +size{K,M,G,T,P} (22528-100095, default 100095):
+Select (default p): Partition number (2-4, default 2): First sector (22528-97791, default 22528): Last sector, +sectors or +size{K,M,G,T,P} (22528-97791, default 97791):
Created a new <removed>.
-Command (m for help): Disk <removed>: 48.9 MiB, 51249152 bytes, 100096 sectors
+Command (m for help): Disk <removed>: 47.8 MiB, 50069504 bytes, 97792 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 65536 bytes / <removed> bytes
diff --git a/tests/ts/fdisk/align-512-4K-md b/tests/ts/fdisk/align-512-4K-md
index 7f60a654f..68aaff0b7 100755
--- a/tests/ts/fdisk/align-512-4K-md
+++ b/tests/ts/fdisk/align-512-4K-md
@@ -41,12 +41,12 @@ n
p
1
-+20M
++49150
n
p
2
-
++49150
p
w
q
--
2.21.0

View File

@ -0,0 +1,80 @@
From 3fd5c8e78a9758a6fc9310485d2428e300ad3b63 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 11 Jun 2020 10:55:25 +0200
Subject: [PATCH 35/40] tests: mark MD tests with metadata v0.90 as KNOWN-FAIL
metadata v0.90 is deprecated thing and unsupported to create by some new
mdadm versions. It's possible to assemble this array (with
default_layout=1 on modprobe raid0), but impossible to create a new
one.
Upstream: http://github.com/karelzak/util-linux/commit/4ae96cf77b36660255d5870a4209480bbec47902
Upstream: http://github.com/karelzak/util-linux/commit/7519c3edab120b14623931d5ddb16fdc6e7cad5d
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1826251
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/ts/blkid/md-raid0-whole | 3 +++
tests/ts/blkid/md-raid1-part | 3 +++
tests/ts/blkid/md-raid1-whole | 3 +++
tests/ts/fdisk/align-512-4K-md | 3 +++
4 files changed, 12 insertions(+)
diff --git a/tests/ts/blkid/md-raid0-whole b/tests/ts/blkid/md-raid0-whole
index 45c6ee55b..1f3fc2634 100755
--- a/tests/ts/blkid/md-raid0-whole
+++ b/tests/ts/blkid/md-raid0-whole
@@ -29,6 +29,9 @@ ts_skip_nonroot
ts_check_losetup
ts_check_prog "mdadm"
+# rhbz#182625: It can't create new raid0 with metadata 0.90 from mdadm-4.1-12.
+TS_KNOWN_FAIL="yes"
+
ts_log "Initialize devices"
IMGNAME="${TS_OUTDIR}/${TS_TESTNAME}"
diff --git a/tests/ts/blkid/md-raid1-part b/tests/ts/blkid/md-raid1-part
index 3fa6395b0..3d42aadb8 100755
--- a/tests/ts/blkid/md-raid1-part
+++ b/tests/ts/blkid/md-raid1-part
@@ -28,6 +28,9 @@ ts_check_test_command "$TS_CMD_BLKID"
ts_skip_nonroot
ts_check_prog "mdadm"
+# rhbz#182625: It can't create new raid0 with metadata 0.90 from mdadm-4.1-12.
+TS_KNOWN_FAIL="yes"
+
# set global variable TS_DEVICE
ts_scsi_debug_init dev_size_mb=51 sector_size=512
diff --git a/tests/ts/blkid/md-raid1-whole b/tests/ts/blkid/md-raid1-whole
index ddf4a6934..6eba9cc8e 100755
--- a/tests/ts/blkid/md-raid1-whole
+++ b/tests/ts/blkid/md-raid1-whole
@@ -29,6 +29,9 @@ ts_skip_nonroot
ts_check_losetup
ts_check_prog "mdadm"
+# rhbz#182625: It can't create new raid0 with metadata 0.90 from mdadm-4.1-12.
+TS_KNOWN_FAIL="yes"
+
ts_log "Initialize devices"
IMGNAME="${TS_OUTDIR}/${TS_TESTNAME}"
diff --git a/tests/ts/fdisk/align-512-4K-md b/tests/ts/fdisk/align-512-4K-md
index 68aaff0b7..0a8e09bc1 100755
--- a/tests/ts/fdisk/align-512-4K-md
+++ b/tests/ts/fdisk/align-512-4K-md
@@ -31,6 +31,9 @@ ts_check_test_command "$TS_CMD_FDISK"
ts_skip_nonroot
ts_check_prog "mdadm"
+# rhbz#182625: It can't create new raid0 with metadata 0.90 from mdadm-4.1-12.
+TS_KNOWN_FAIL="yes"
+
# set global variable TS_DEVICE
ts_scsi_debug_init dev_size_mb=50 sector_size=512 physblk_exp=3
DEVNAME=$(basename $TS_DEVICE)
--
2.25.4

View File

@ -0,0 +1,284 @@
From ae7b79ff8a7fb576c018bc9a7eaf9e135b7b553e Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 24 Apr 2018 10:57:48 +0200
Subject: [PATCH 36/40] libblkid: add BitLocker detection
Supported:
* WinVista version
* Win7 and later versions (based on NTFS)
* BitLockerToGo (for removable media; based on FAT32)
Unfortunately, it's without LABEL and UUID. It seems BitLocker does
not use volume_label and volume_serial stuff from NTFS header.
Upstream: http://github.com/karelzak/util-linux/commit/136f89ce5ed8cd159a1c56b5a775dada2363ecd3
Upstream: http://github.com/karelzak/util-linux/commit/47afae0caaa2b3440d6ac812079e3ada5f2aa0bd (bitlocker.c part)
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1812576
Addresses: https://github.com/karelzak/util-linux/issues/617
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/Makemodule.am | 1 +
libblkid/src/superblocks/bitlocker.c | 191 +++++++++++++++++++++++++
libblkid/src/superblocks/superblocks.c | 1 +
libblkid/src/superblocks/superblocks.h | 3 +
libblkid/src/superblocks/vfat.c | 3 +
5 files changed, 199 insertions(+)
create mode 100644 libblkid/src/superblocks/bitlocker.c
diff --git a/libblkid/src/Makemodule.am b/libblkid/src/Makemodule.am
index 0e1c765fb..ea0230702 100644
--- a/libblkid/src/Makemodule.am
+++ b/libblkid/src/Makemodule.am
@@ -47,6 +47,7 @@ libblkid_la_SOURCES = \
libblkid/src/superblocks/bcache.c \
libblkid/src/superblocks/befs.c \
libblkid/src/superblocks/bfs.c \
+ libblkid/src/superblocks/bitlocker.c \
libblkid/src/superblocks/btrfs.c \
libblkid/src/superblocks/cramfs.c \
libblkid/src/superblocks/ddf_raid.c \
diff --git a/libblkid/src/superblocks/bitlocker.c b/libblkid/src/superblocks/bitlocker.c
new file mode 100644
index 000000000..111edf39b
--- /dev/null
+++ b/libblkid/src/superblocks/bitlocker.c
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2018 Karel Zak <kzak@redhat.com>
+ *
+ * This file may be redistributed under the terms of the
+ * GNU Lesser General Public License.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <stdint.h>
+
+#include "superblocks.h"
+
+#define BDE_HDR_SIZE 512
+#define BDE_HDR_OFFSET 0
+
+struct bde_header_win7 {
+/* 0 */ unsigned char boot_entry_point[3];
+/* 3 */ unsigned char fs_signature[8];
+/* 11 */ unsigned char __dummy1[67 - 11];
+/* 67 */ uint32_t volume_serial; /* NTFS uses 64bit serial number */
+/* 71 */ unsigned char volume_label[11]; /* "NO NAME\x20\x20\x20\x20" only */
+/* 82 */ unsigned char __dummy2[160 - 82];
+/* 160 */ unsigned char guid[16]; /* BitLocker specific GUID */
+/* 176 */ uint64_t fve_metadata_offset;
+} __attribute__((packed));
+
+
+struct bde_header_togo {
+/* 0 */ unsigned char boot_entry_point[3];
+/* 3 */ unsigned char fs_signature[8];
+/* 11 */ unsigned char __dummy[424 - 11];
+/* 424 */ unsigned char guid[16];
+/* 440 */ uint64_t fve_metadata_offset;
+} __attribute__((packed));
+
+
+struct bde_fve_metadata {
+/* 0 */ unsigned char signature[8];
+/* 8 */ uint16_t size;
+/* 10 */ uint16_t version;
+};
+
+enum {
+ BDE_VERSION_VISTA = 0,
+ BDE_VERSION_WIN7,
+ BDE_VERSION_TOGO
+};
+
+#define BDE_MAGIC_VISTA "\xeb\x52\x90-FVE-FS-"
+#define BDE_MAGIC_WIN7 "\xeb\x58\x90-FVE-FS-"
+#define BDE_MAGIC_TOGO "\xeb\x58\x90MSWIN4.1"
+
+#define BDE_MAGIC_FVE "-FVE-FS-"
+
+static int get_bitlocker_type(const unsigned char *buf)
+{
+ size_t i;
+ static const char *map[] = {
+ [BDE_VERSION_VISTA] = BDE_MAGIC_VISTA,
+ [BDE_VERSION_WIN7] = BDE_MAGIC_WIN7,
+ [BDE_VERSION_TOGO] = BDE_MAGIC_TOGO
+ };
+
+ for (i = 0; i < ARRAY_SIZE(map); i++) {
+ if (memcmp(buf, map[i], 11) == 0)
+ return (int) i;
+ }
+
+ return -1;
+}
+
+/* Returns: < 0 error, 1 nothing, 0 success
+ */
+static int get_bitlocker_headers(blkid_probe pr,
+ int *type,
+ const unsigned char **buf_hdr,
+ const unsigned char **buf_fve)
+{
+
+ const unsigned char *buf;
+ const struct bde_fve_metadata *fve;
+ uint64_t off = 0;
+ int kind;
+
+ if (buf_hdr)
+ *buf_hdr = NULL;
+ if (buf_fve)
+ *buf_fve = NULL;
+ if (type)
+ *type = -1;
+
+ buf = blkid_probe_get_buffer(pr, BDE_HDR_OFFSET, BDE_HDR_SIZE);
+ if (!buf)
+ return errno ? -errno : 1;
+
+ kind = get_bitlocker_type(buf);
+
+ /* Check BitLocker header */
+ switch (kind) {
+ case BDE_VERSION_WIN7:
+ off = le64_to_cpu(((const struct bde_header_win7 *) buf)->fve_metadata_offset);
+ break;
+ case BDE_VERSION_TOGO:
+ off = le64_to_cpu(((const struct bde_header_togo *) buf)->fve_metadata_offset);
+ break;
+ case BDE_VERSION_VISTA:
+ goto done;
+ default:
+ goto nothing;
+ }
+
+ if (!off)
+ goto nothing;
+ if (buf_hdr)
+ *buf_hdr = buf;
+
+ /* Check Bitlocker FVE metadata header */
+ buf = blkid_probe_get_buffer(pr, off, sizeof(struct bde_fve_metadata));
+ if (!buf)
+ return errno ? -errno : 1;
+
+ fve = (const struct bde_fve_metadata *) buf;
+ if (memcmp(fve->signature, BDE_MAGIC_FVE, sizeof(fve->signature)) != 0)
+ goto nothing;
+ if (buf_fve)
+ *buf_fve = buf;
+done:
+ if (type)
+ *type = kind;
+ return 0;
+nothing:
+ return 1;
+}
+
+/*
+ * This is used by vFAT and NTFS prober to avoid collisions with bitlocker.
+ */
+int blkid_probe_is_bitlocker(blkid_probe pr)
+{
+ return get_bitlocker_headers(pr, NULL, NULL, NULL) == 0;
+}
+
+static int probe_bitlocker(blkid_probe pr,
+ const struct blkid_idmag *mag __attribute__((__unused__)))
+{
+ const unsigned char *buf_fve = NULL;
+ const unsigned char *buf_hdr = NULL;
+ int rc, kind;
+
+ rc = get_bitlocker_headers(pr, &kind, &buf_hdr, &buf_fve);
+ if (rc)
+ return rc;
+
+ if (kind == BDE_VERSION_WIN7) {
+ const struct bde_header_win7 *hdr = (const struct bde_header_win7 *) buf_hdr;
+
+ /* Unfortunately, it seems volume_serial is always zero */
+ blkid_probe_sprintf_uuid(pr,
+ (const unsigned char *) &hdr->volume_serial,
+ sizeof(hdr->volume_serial),
+ "%016d", le32_to_cpu(hdr->volume_serial));
+ }
+
+ if (buf_fve) {
+ const struct bde_fve_metadata *fve = (const struct bde_fve_metadata *) buf_fve;
+
+ blkid_probe_sprintf_version(pr, "%d", fve->version);
+ }
+ return 0;
+}
+
+/* See header details:
+ * https://github.com/libyal/libbde/blob/master/documentation/BitLocker%20Drive%20Encryption%20(BDE)%20format.asciidoc
+ */
+const struct blkid_idinfo bitlocker_idinfo =
+{
+ .name = "BitLocker",
+ .usage = BLKID_USAGE_CRYPTO,
+ .probefunc = probe_bitlocker,
+ .magics =
+ {
+ { .magic = BDE_MAGIC_VISTA, .len = 11 },
+ { .magic = BDE_MAGIC_WIN7, .len = 11 },
+ { .magic = BDE_MAGIC_TOGO, .len = 11 },
+ { NULL }
+ }
+};
diff --git a/libblkid/src/superblocks/superblocks.c b/libblkid/src/superblocks/superblocks.c
index 076541d1a..6dfd2be64 100644
--- a/libblkid/src/superblocks/superblocks.c
+++ b/libblkid/src/superblocks/superblocks.c
@@ -115,6 +115,7 @@ static const struct blkid_idinfo *idinfos[] =
&ubi_idinfo,
&vdo_idinfo,
&stratis_idinfo,
+ &bitlocker_idinfo,
/* Filesystems */
&vfat_idinfo,
diff --git a/libblkid/src/superblocks/superblocks.h b/libblkid/src/superblocks/superblocks.h
index 2723fb1d5..d677f85bc 100644
--- a/libblkid/src/superblocks/superblocks.h
+++ b/libblkid/src/superblocks/superblocks.h
@@ -81,6 +81,7 @@ extern const struct blkid_idinfo bcache_idinfo;
extern const struct blkid_idinfo mpool_idinfo;
extern const struct blkid_idinfo vdo_idinfo;
extern const struct blkid_idinfo stratis_idinfo;
+extern const struct blkid_idinfo bitlocker_idinfo;
/*
* superblock functions
@@ -105,4 +106,6 @@ extern int blkid_probe_set_id_label(blkid_probe pr, const char *name,
extern int blkid_probe_set_utf8_id_label(blkid_probe pr, const char *name,
unsigned char *data, size_t len, int enc);
+extern int blkid_probe_is_bitlocker(blkid_probe pr);
+
#endif /* _BLKID_SUPERBLOCKS_H */
diff --git a/libblkid/src/superblocks/vfat.c b/libblkid/src/superblocks/vfat.c
index 3aeba018a..29b3c501c 100644
--- a/libblkid/src/superblocks/vfat.c
+++ b/libblkid/src/superblocks/vfat.c
@@ -268,6 +268,9 @@ static int fat_valid_superblock(blkid_probe pr,
}
}
+ if (blkid_probe_is_bitlocker(pr))
+ return 0;
+
return 1; /* valid */
}
--
2.25.4

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
From 28b89361bf574af24c2f9c857d0e5f7c84e2787c Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 3 Sep 2019 15:10:35 +0200
Subject: [PATCH 38/40] libblkid: (xfs) fix sector size calculation
Reported-by: Anatoly Pugachev <matorola@gmail.com>
Upstream: http://github.com/karelzak/util-linux/commit/2771d40b88660a11306aa5d4e200fc0ebebfe315
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1817726
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/superblocks/xfs.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libblkid/src/superblocks/xfs.c b/libblkid/src/superblocks/xfs.c
index eb513ac3e..98e59ff7c 100644
--- a/libblkid/src/superblocks/xfs.c
+++ b/libblkid/src/superblocks/xfs.c
@@ -173,7 +173,7 @@ static int probe_xfs(blkid_probe pr, const struct blkid_idmag *mag)
blkid_probe_set_label(pr, (unsigned char *) xs->sb_fname,
sizeof(xs->sb_fname));
blkid_probe_set_uuid(pr, xs->sb_uuid);
- blkid_probe_set_block_size(pr, xs->sb_sectsize * 256);
+ blkid_probe_set_block_size(pr, be16_to_cpu(xs->sb_sectsize));
return 0;
}
--
2.25.4

View File

@ -0,0 +1,68 @@
From 54e3d1414e1a031d6f635f8fcbe273eecfd65560 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 5 Feb 2019 12:06:00 +0100
Subject: [PATCH 39/40] col: make flush_line() a little bit robust
The code is horrible. The core of the problem are signed integers
and no check for the limits.
This patch fixes c->c_column = cur_col; where c_column is "short"
and "cur_col" is int. Let's use "int" for all the variables. It's
really not perfect as for bigger lines it can segfault again...
The patch also removes some unnecessary static variables.
Upstream: http://github.com/karelzak/util-linux/commit/004356f05018e3bfcaddd2652846659a4d8481f3
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1803753
Addresses: https://github.com/karelzak/util-linux/issues/749
Signed-off-by: Karel Zak <kzak@redhat.com>
---
text-utils/col.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/text-utils/col.c b/text-utils/col.c
index 3d9e15d26..c2f8db64d 100644
--- a/text-utils/col.c
+++ b/text-utils/col.c
@@ -88,7 +88,7 @@ typedef char CSET;
typedef struct char_str {
#define CS_NORMAL 1
#define CS_ALTERNATE 2
- short c_column; /* column character is in */
+ int c_column; /* column character is in */
CSET c_set; /* character set (currently only 2) */
wchar_t c_char; /* character in question */
int c_width; /* character width */
@@ -476,8 +476,9 @@ void flush_line(LINE *l)
nchars = l->l_line_len;
if (l->l_needs_sort) {
- static CHAR *sorted;
- static int count_size, *count, i, save, sorted_size, tot;
+ static CHAR *sorted = NULL;
+ static int count_size = 0, *count = NULL, sorted_size = 0;
+ int i, tot;
/*
* Do an O(n) sort on l->l_line by column being careful to
@@ -494,7 +495,7 @@ void flush_line(LINE *l)
(unsigned)sizeof(int) * count_size);
}
memset(count, 0, sizeof(int) * l->l_max_col + 1);
- for (i = nchars, c = l->l_line; --i >= 0; c++)
+ for (i = nchars, c = l->l_line; c && --i >= 0; c++)
count[c->c_column]++;
/*
@@ -502,7 +503,7 @@ void flush_line(LINE *l)
* indices into new line.
*/
for (tot = 0, i = 0; i <= l->l_max_col; i++) {
- save = count[i];
+ int save = count[i];
count[i] = tot;
tot += save;
}
--
2.25.4

View File

@ -0,0 +1,49 @@
From 2cd5219da87274db251a7f836efe6ac724b70e53 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 11 Mar 2020 10:38:37 +0100
Subject: [PATCH 40/40] libmount: improve smb{2,3} support
It seems kernel can use smb3 as fstype in mountinfo.
Upstream: http://github.com/karelzak/util-linux/commit/36d80cb6c11b3064ed9fb29c7c8b101e3f266441
Upstream: http://github.com/karelzak/util-linux/commit/b7ff4134beea53688ab3c01484cf59b2ce2d9ce9
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1812118
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/tab.c | 5 ++++-
libmount/src/utils.c | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/libmount/src/tab.c b/libmount/src/tab.c
index eb61dd33e..74d60df3d 100644
--- a/libmount/src/tab.c
+++ b/libmount/src/tab.c
@@ -1644,9 +1644,12 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs)
if (root) {
const char *fstype = mnt_fs_get_fstype(fs);
- if (fstype && strcmp(fstype, "cifs") == 0) {
+ if (fstype && (strcmp(fstype, "cifs") == 0
+ || strcmp(fstype, "smb3") == 0)) {
+
const char *unc_subdir = get_cifs_unc_subdir_path(src);
const char *path_on_fs = mnt_fs_get_root(fs);
+
if (!unc_subdir || !path_on_fs || !streq_paths(unc_subdir, path_on_fs))
continue;
} else {
diff --git a/libmount/src/utils.c b/libmount/src/utils.c
index 04e79f53f..e43588831 100644
--- a/libmount/src/utils.c
+++ b/libmount/src/utils.c
@@ -315,6 +315,7 @@ int mnt_fstype_is_pseudofs(const char *type)
int mnt_fstype_is_netfs(const char *type)
{
if (strcmp(type, "cifs") == 0 ||
+ strcmp(type, "smb3") == 0 ||
strcmp(type, "smbfs") == 0 ||
strncmp(type,"nfs", 3) == 0 ||
strcmp(type, "afs") == 0 ||
--
2.25.4

View File

@ -0,0 +1,65 @@
From 618aedc9e892b206492c1720bec261b043c66263 Mon Sep 17 00:00:00 2001
From: Roberto Bergantinos Corpas <rbergant@redhat.com>
Date: Mon, 27 Apr 2020 15:46:02 +0200
Subject: [PATCH] libmount: fix mount -a EBUSY for cifs
fstab:
//rhel73/myshare/sub/path /mnt cifs
after mount in mountinfo:
# grep cifs /proc/self/mountinfo
47 39 0:40 /sub/path /mnt rw,relatime shared:60 - cifs //rhel73/myshare/sub/path ...
^^^^^^^^^
or:
# grep cifs /proc/self/mountinfo
47 39 0:40 / /mnt rw,relatime shared:60 - cifs //rhel73/myshare/sub/path ...
^
That is so since on kernel cifs code, cifs_get_root (which returns the
entry associated with mnt_root) return s_root if
CIFS_MOUNT_USE_PREFIX_PATH is set, no questions asked.
This situation can occurr often on CIFS mounts, as CIFS servers limit
frequently scope of access to the root path.
[kzak@redhat.com: - add more info to the commit message,
- clean up variable names]
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1829245
Upstream: http://github.com/karelzak/util-linux/commit/31b3a523eca2fc7e5876ec5fd89094208fed0899
Signed-off-by: Roberto Bergantinos Corpas <rbergant@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/tab.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/libmount/src/tab.c b/libmount/src/tab.c
index 74d60df3d..cd97a1cb5 100644
--- a/libmount/src/tab.c
+++ b/libmount/src/tab.c
@@ -1644,13 +1644,14 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs)
if (root) {
const char *fstype = mnt_fs_get_fstype(fs);
- if (fstype && (strcmp(fstype, "cifs") == 0
- || strcmp(fstype, "smb3") == 0)) {
+ if (fstype && (strcmp(fstype, "cifs") == 0 ||
+ strcmp(fstype, "smb3") == 0)) {
- const char *unc_subdir = get_cifs_unc_subdir_path(src);
- const char *path_on_fs = mnt_fs_get_root(fs);
+ const char *sub = get_cifs_unc_subdir_path(src);
+ const char *r = mnt_fs_get_root(fs);
- if (!unc_subdir || !path_on_fs || !streq_paths(unc_subdir, path_on_fs))
+ if (!sub || !r || (!streq_paths(sub, r) &&
+ !streq_paths("/", r)))
continue;
} else {
const char *r = mnt_fs_get_root(fs);
--
2.25.4

View File

@ -0,0 +1,31 @@
From 0717177be22588d4e419de280eccd0eeafb15016 Mon Sep 17 00:00:00 2001
From: Rupesh Girase <rgirase@redhat.com>
Date: Thu, 18 Jun 2020 19:17:41 +0530
Subject: [PATCH] Manual pages: losetup.8: Fix "--direct-io" defaults
"--direct-io" option is "off" by default while configuring
loop device but it's mentioned "on" in man page.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1848919
Upstream: http://github.com/karelzak/util-linux/commit/4bee67e2d1a78abc52e89c6eb71f0efc8a278ce9
Signed-off-by: Rupesh Girase <rgirase@redhat.com>
---
sys-utils/losetup.8 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sys-utils/losetup.8 b/sys-utils/losetup.8
index cdb9ed052..c87c231b6 100644
--- a/sys-utils/losetup.8
+++ b/sys-utils/losetup.8
@@ -130,7 +130,7 @@ Set up a read-only loop device.
.BR \-\-direct\-io [ =on | off ]
Enable or disable direct I/O for the backing file. The optional argument
can be either \fBon\fR or \fBoff\fR. If the argument is omitted, it defaults
-to \fBon\fR.
+to \fBoff\fR.
.TP
.BR \-v , " \-\-verbose"
Verbose mode.
--
2.25.4

View File

@ -0,0 +1,46 @@
From f575b6e0857087f46d54f494d9a435af715ea19d Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 1 Oct 2020 10:40:27 +0200
Subject: [PATCH 43/55] chrt: use SCHED_FLAG_RESET_ON_FORK for sched_setattr()
Reviewed by many people, used for years (but probably nobody uses
SCHED_DEADLINE with reset-on-fork), but we all missed:
- sched_setscheduler() uses SCHED_RESET_ON_FORK (0x40000000)
- sched_setattr() uses SCHED_FLAG_RESET_ON_FORK (0x01)
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1884194
Signed-off-by: Karel Zak <kzak@redhat.com>
---
schedutils/chrt.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/schedutils/chrt.c b/schedutils/chrt.c
index b08c78ed8..15556bbad 100644
--- a/schedutils/chrt.c
+++ b/schedutils/chrt.c
@@ -123,7 +123,7 @@ struct chrt_ctl {
uint64_t period;
unsigned int all_tasks : 1, /* all threads of the PID */
- reset_on_fork : 1, /* SCHED_RESET_ON_FORK */
+ reset_on_fork : 1, /* SCHED_RESET_ON_FORK or SCHED_FLAG_RESET_ON_FORK */
altered : 1, /* sched_set**() used */
verbose : 1; /* verbose output */
};
@@ -376,9 +376,10 @@ static int set_sched_one(struct chrt_ctl *ctl, pid_t pid)
sa.sched_period = ctl->period;
sa.sched_deadline = ctl->deadline;
-# ifdef SCHED_RESET_ON_FORK
+# ifdef SCHED_FLAG_RESET_ON_FORK
+ /* Don't use SCHED_RESET_ON_FORK for sched_setattr()! */
if (ctl->reset_on_fork)
- sa.sched_flags |= SCHED_RESET_ON_FORK;
+ sa.sched_flags |= SCHED_FLAG_RESET_ON_FORK;
# endif
errno = 0;
return sched_setattr(pid, &sa, 0);
--
2.29.2

View File

@ -0,0 +1,146 @@
From c4caa5b973f9cdb4c43edea3c32cda62cdf15b3b Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 1 Oct 2020 11:20:01 +0200
Subject: [PATCH 44/55] chrt: don't restrict --reset-on-fork, add more info to
man page
The flag works (= kernel accepts it) for all scheduling policies
and sched_getattr() returns the flag for all policies.
There is no reason for userspace to be more smart than kernel or hide
the flag when it prints sched_getattr()/sched_getscheduler() results.
# chrt -v --reset-on-fork --batch 0 /bin/true
pid 1315019's new scheduling policy: SCHED_BATCH|SCHED_RESET_ON_FORK
# chrt -v --reset-on-fork --fifo 1 /bin/true
pid 1315055's new scheduling policy: SCHED_FIFO|SCHED_RESET_ON_FORK
# chrt -v --reset-on-fork --deadline --sched-period 10000 0 /bin/true
pid 1315182's new scheduling policy: SCHED_DEADLINE|SCHED_RESET_ON_FORK
# chrt -v --reset-on-fork --idle 0 /bin/true
pid 1315247's new scheduling policy: SCHED_IDLE|SCHED_RESET_ON_FORK
# chrt -v --reset-on-fork --rr 1 /bin/true
pid 1315275's new scheduling policy: SCHED_RR|SCHED_RESET_ON_FORK
# chrt -v --reset-on-fork --other 0 /bin/true
pid 1315311's new scheduling policy: SCHED_OTHER|SCHED_RESET_ON_FORK
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1884194
Signed-off-by: Karel Zak <kzak@redhat.com>
---
schedutils/chrt.1 | 32 ++++++++++++++++++++++++++++----
schedutils/chrt.c | 18 +++++-------------
2 files changed, 33 insertions(+), 17 deletions(-)
diff --git a/schedutils/chrt.1 b/schedutils/chrt.1
index 4b8b1e9da..a9adfb316 100644
--- a/schedutils/chrt.1
+++ b/schedutils/chrt.1
@@ -92,13 +92,37 @@ Specifies period parameter for SCHED_DEADLINE policy (Linux-specific).
Specifies deadline parameter for SCHED_DEADLINE policy (Linux-specific).
.TP
\fB\-R\fR, \fB\-\-reset-on-fork\fR
-Add
+Use
.B SCHED_RESET_ON_FORK
-flag to the
+or
+.B SCHED_FLAG_RESET_ON_FORK
+flag. Linux-specific, supported since 2.6.31.
+
+Each thread has a reset-on-fork scheduling flag. When this flag is set, children created by
+.BR fork (2)
+do not inherit privileged scheduling policies. After the reset-on-fork flag has been enabled,
+it can be reset only if the thread has the
+.BR CAP_SYS_NICE
+capability. This flag is disabled in child processes created by
+.BR fork (2).
+
+More precisely, if the reset-on-fork flag is set,
+the following rules apply for subsequently created children:
+.RS
+.IP * 3
+If the calling thread has a scheduling policy of
.B SCHED_FIFO
or
-.B SCHED_RR
-scheduling policy (Linux-specific, supported since 2.6.31).
+.BR SCHED_RR ,
+the policy is reset to
+.BR SCHED_OTHER
+in child processes.
+.IP *
+If the calling process has a negative nice value,
+the nice value is reset to zero in child processes.
+.RE
+
+
.SH OPTIONS
.TP
diff --git a/schedutils/chrt.c b/schedutils/chrt.c
index 15556bbad..2a6f1e151 100644
--- a/schedutils/chrt.c
+++ b/schedutils/chrt.c
@@ -152,7 +152,7 @@ static void __attribute__((__noreturn__)) usage(void)
fputs(USAGE_SEPARATOR, out);
fputs(_("Scheduling options:\n"), out);
- fputs(_(" -R, --reset-on-fork set SCHED_RESET_ON_FORK for FIFO or RR\n"), out);
+ fputs(_(" -R, --reset-on-fork set reset-on-fork flag\n"), out);
fputs(_(" -T, --sched-runtime <ns> runtime parameter for DEADLINE\n"), out);
fputs(_(" -P, --sched-period <ns> period parameter for DEADLINE\n"), out);
fputs(_(" -D, --sched-deadline <ns> deadline parameter for DEADLINE\n"), out);
@@ -173,22 +173,19 @@ static void __attribute__((__noreturn__)) usage(void)
static const char *get_policy_name(int policy)
{
+#ifdef SCHED_RESET_ON_FORK
+ policy &= ~SCHED_RESET_ON_FORK;
+#endif
switch (policy) {
case SCHED_OTHER:
return "SCHED_OTHER";
case SCHED_FIFO:
-#ifdef SCHED_RESET_ON_FORK
- case SCHED_FIFO | SCHED_RESET_ON_FORK:
-#endif
return "SCHED_FIFO";
#ifdef SCHED_IDLE
case SCHED_IDLE:
return "SCHED_IDLE";
#endif
case SCHED_RR:
-#ifdef SCHED_RESET_ON_FORK
- case SCHED_RR | SCHED_RESET_ON_FORK:
-#endif
return "SCHED_RR";
#ifdef SCHED_BATCH
case SCHED_BATCH:
@@ -257,7 +254,7 @@ fallback:
else
prio = sp.sched_priority;
# ifdef SCHED_RESET_ON_FORK
- if (policy == (SCHED_FIFO|SCHED_RESET_ON_FORK) || policy == (SCHED_BATCH|SCHED_RESET_ON_FORK))
+ if (policy & SCHED_RESET_ON_FORK)
reset_on_fork = 1;
# endif
}
@@ -515,11 +512,6 @@ int main(int argc, char **argv)
errno = 0;
ctl->priority = strtos32_or_err(argv[optind], _("invalid priority argument"));
-#ifdef SCHED_RESET_ON_FORK
- if (ctl->reset_on_fork && ctl->policy != SCHED_FIFO && ctl->policy != SCHED_RR)
- errx(EXIT_FAILURE, _("--reset-on-fork option is supported for "
- "SCHED_FIFO and SCHED_RR policies only"));
-#endif
#ifdef SCHED_DEADLINE
if ((ctl->runtime || ctl->deadline || ctl->period) && ctl->policy != SCHED_DEADLINE)
errx(EXIT_FAILURE, _("--sched-{runtime,deadline,period} options "
--
2.29.2

View File

@ -0,0 +1,41 @@
From 8704fa57c3b93152df6c10fd6a35ebdd59e1a5b7 Mon Sep 17 00:00:00 2001
From: Peter Wu <peter@lekensteyn.nl>
Date: Fri, 1 Feb 2019 15:40:53 +0100
Subject: [PATCH 45/55] mount.8: clarify (no)suid behavior on file capabilities
Clarify that the nosuid option also affects file capabilities and that
it only limits execution of programs. (setgid on directories still
inherit the group regardless of the nosuid option.) The new text is
taken from the mount(2) manual page from the man-pages project.
Addresses: https://github.com/karelzak/util-linux/issues/482
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1855759
Signed-off-by: Peter Wu <peter@lekensteyn.nl>
---
sys-utils/mount.8 | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/sys-utils/mount.8 b/sys-utils/mount.8
index 1cc792979..a4d7de2c0 100644
--- a/sys-utils/mount.8
+++ b/sys-utils/mount.8
@@ -1107,12 +1107,12 @@ or
Do not use the lazytime feature.
.TP
.B suid
-Allow set-user-ID or set-group-ID bits to take
-effect.
+Honor set-user-ID and set-group-ID bits or file capabilities when
+executing programs from this filesystem.
.TP
.B nosuid
-Do not allow set-user-ID or set-group-ID bits to take
-effect.
+Do not honor set-user-ID and set-group-ID bits or file capabilities when
+executing programs from this filesystem.
.TP
.B silent
Turn on the silent flag.
--
2.29.2

View File

@ -0,0 +1,59 @@
From afe6545483a881ccde41dcaa6718c71c74b38d7b Mon Sep 17 00:00:00 2001
From: Sven Wiltink <swiltink@transip.nl>
Date: Fri, 1 May 2020 16:35:40 +0200
Subject: [PATCH 46/55] lsblk: Fall back to ID_SERIAL
In some cases ID_SERIAL_SHORT isn't provided by libudev, but ID_SERIAL
is. An example of this are virtio devices. See the output of udevadm
info:
P: /devices/pci0000:00/0000:00:06.0/virtio2/block/vdb
N: vdb
S: disk/by-id/virtio-08491434ee711d3420e9
S: disk/by-path/pci-0000:00:06.0
S: disk/by-path/virtio-pci-0000:00:06.0
E: DEVLINKS=/dev/disk/by-id/virtio-08491434ee711d3420e9 /dev/disk/by-path/pci-0000:00:06.0 /dev/disk/by-path/virtio-pci-0000:00:06.0
E: DEVNAME=/dev/vdb
E: DEVPATH=/devices/pci0000:00/0000:00:06.0/virtio2/block/vdb
E: DEVTYPE=disk
E: ID_PATH=pci-0000:00:06.0
E: ID_PATH_TAG=pci-0000_00_06_0
E: ID_SERIAL=08491434ee711d3420e9
E: MAJOR=252
E: MINOR=16
E: SUBSYSTEM=block
E: TAGS=:systemd:
E: USEC_INITIALIZED=1403804
[RHEL-8 backport: add ID_SERIAL and also ID_SCSI_SERIAL to be compatible with upstream]
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1861670
Upstream: http://github.com/karelzak/util-linux/commit/e81d0f80068086147434fa947a4f723c00318772
Upstream: http://github.com/karelzak/util-linux/commit/de6c2a4aec140e6086e278688d97f4655ced1a9a
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/lsblk.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c
index ae97f9f05..d0369d3e7 100644
--- a/misc-utils/lsblk.c
+++ b/misc-utils/lsblk.c
@@ -567,8 +567,14 @@ static int get_udev_properties(struct blkdev_cxt *cxt)
if (data)
cxt->wwn = xstrdup(data);
- if ((data = udev_device_get_property_value(dev, "ID_SERIAL_SHORT")))
+ data = udev_device_get_property_value(dev, "ID_SCSI_SERIAL");
+ if (!data)
+ data = udev_device_get_property_value(dev, "ID_SERIAL_SHORT");
+ if (!data)
+ data = udev_device_get_property_value(dev, "ID_SERIAL");
+ if (data)
cxt->serial = xstrdup(data);
+
udev_device_unref(dev);
cxt->probed = 1;
DBG(DEV, ul_debugobj(cxt, "%s: found udev properties", cxt->name));
--
2.29.2

View File

@ -0,0 +1,32 @@
From 4ac8e70822313b0c6b35ebf633c6e8fbca558998 Mon Sep 17 00:00:00 2001
From: Thomas Abraham <tabraham@suse.com>
Date: Thu, 24 Sep 2020 14:52:33 -0400
Subject: [PATCH 47/55] lscpu: avoid segfault on PowerPC systems with valid
hardware configurations
ntypes greater than 1 is valid in some hardware configurations, and an assert()
on the value isn't necessary or very future proof
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883783
Upstream: http://github.com/karelzak/util-linux/commit/cbe3304bc43b3fceb06fb6e5dd822bb59abf1b84
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/lscpu.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index 1aa7bff4d..748d545b6 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -369,8 +369,6 @@ static void read_physical_info_powerpc(struct lscpu_desc *desc)
return;
ntypes = strbe16toh(buf, 2);
-
- assert(ntypes <= 1);
if (!ntypes)
return;
--
2.29.2

View File

@ -0,0 +1,33 @@
From b3c5c1f39db58b057bb581f1d3bebcbeedeee1cb Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 17 Sep 2018 11:58:50 +0200
Subject: [PATCH 48/55] libfdisk: count gaps to possible size when resize
The current code counts only partition sizes when it counts possible
space, but we have gaps between the partitions. It seems better to
count all based on offsets rather than sizes.
Addresses: https://github.com/karelzak/util-linux/issues/693
Upstream: http://github.com/karelzak/util-linux/commit/2f35c1ead621f42f32f7777232568cb03185b473
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1900498
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libfdisk/src/partition.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libfdisk/src/partition.c b/libfdisk/src/partition.c
index a790dc9c9..ebcf6bf5c 100644
--- a/libfdisk/src/partition.c
+++ b/libfdisk/src/partition.c
@@ -1113,7 +1113,7 @@ static int resize_get_last_possible(
break;
} else {
last = pa;
- *maxsz += pa->size;
+ *maxsz = pa->size - (start - pa->start);
DBG(TAB, ul_debugobj(tb, " new max=%ju (last updated)", (uintmax_t) *maxsz));
}
}
--
2.29.2

View File

@ -0,0 +1,116 @@
From 780f79420073e0c09cd41afea28ac217a6d4ef29 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 26 Jun 2020 12:59:32 +0200
Subject: [PATCH 49/55] libmount: (parser) fix memory leak on error before
end-of-file
Let's simplify the loop where we add FS to the table. The optimization
for recoverable errors is a fragile overkill. The new code always
allocates and unrefs FS for each loop.
Addresses: https://github.com/karelzak/util-linux/pull/1068
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1900498
Upstream: http://github.com/karelzak/util-linux/commit/fe0d12d4f82269096f8d0cffc51ca9590814c284
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/fs.c | 2 +-
libmount/src/tab_parse.c | 49 ++++++++++++++++++++++------------------
2 files changed, 28 insertions(+), 23 deletions(-)
diff --git a/libmount/src/fs.c b/libmount/src/fs.c
index def32253c..aae4961c3 100644
--- a/libmount/src/fs.c
+++ b/libmount/src/fs.c
@@ -34,7 +34,7 @@ struct libmnt_fs *mnt_new_fs(void)
fs->refcount = 1;
INIT_LIST_HEAD(&fs->ents);
- /*DBG(FS, ul_debugobj(fs, "alloc"));*/
+ DBG(FS, ul_debugobj(fs, "alloc"));
return fs;
}
diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c
index 10fc68279..719c1abca 100644
--- a/libmount/src/tab_parse.c
+++ b/libmount/src/tab_parse.c
@@ -608,7 +608,6 @@ static int __table_parse_stream(struct libmnt_table *tb, FILE *f, const char *fi
int rc = -1;
int flags = 0;
pid_t tid = -1;
- struct libmnt_fs *fs = NULL;
struct libmnt_parser pa = { .line = 0 };
assert(tb);
@@ -628,19 +627,25 @@ static int __table_parse_stream(struct libmnt_table *tb, FILE *f, const char *fi
if (filename && strcmp(filename, _PATH_PROC_MOUNTS) == 0)
flags = MNT_FS_KERNEL;
- while (!feof(f)) {
- if (!fs) {
- fs = mnt_new_fs();
- if (!fs)
- goto err;
+ do {
+ struct libmnt_fs *fs;
+
+ if (feof(f)) {
+ DBG(TAB, ul_debugobj(tb, "end-of-file"));
+ break;
}
+ fs = mnt_new_fs();
+ if (!fs)
+ goto err;
+ /* parse */
rc = mnt_table_parse_next(&pa, tb, fs);
- if (!rc && tb->fltrcb && tb->fltrcb(fs, tb->fltrcb_data))
- rc = 1; /* filtered out by callback... */
+ if (rc != 0 && tb->fltrcb && tb->fltrcb(fs, tb->fltrcb_data))
+ rc = 1; /* error filtered out by callback... */
- if (!rc) {
+ /* add to the table */
+ if (rc == 0) {
rc = mnt_table_add_fs(tb, fs);
fs->flags |= flags;
@@ -651,21 +656,21 @@ static int __table_parse_stream(struct libmnt_table *tb, FILE *f, const char *fi
}
}
- if (rc) {
- if (rc > 0) {
- mnt_reset_fs(fs);
- assert(fs->refcount == 1);
- continue; /* recoverable error, reuse fs*/
- }
+ /* remove refernece (or deallocate on error) */
+ mnt_unref_fs(fs);
- mnt_unref_fs(fs);
- if (feof(f))
- break;
- goto err; /* fatal error */
+ /* recoverable error */
+ if (rc > 0) {
+ DBG(TAB, ul_debugobj(tb, "recoverable error (continue)"));
+ continue;
}
- mnt_unref_fs(fs);
- fs = NULL;
- }
+
+ /* fatal errors */
+ if (rc < 0 && !feof(f)) {
+ DBG(TAB, ul_debugobj(tb, "fatal error"));
+ goto err;
+ }
+ } while (1);
DBG(TAB, ul_debugobj(tb, "%s: stop parsing (%d entries)",
filename, mnt_table_get_nents(tb)));
--
2.29.2

View File

@ -0,0 +1,104 @@
From 6700a458ef1bcd8fe2c066411bc415bc43ccdb8a Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 15 Dec 2020 11:17:42 +0100
Subject: [PATCH 50/55] lscpu: update ARM identifiers tables
Use the latest upstream identifiers to add FUJITSU and HiSilicon
implementers and many new ARM CPUs.
Upstream: http://github.com/karelzak/util-linux/commit/dd9b4cb32042def5b7767e26ebd294f7f52cd07f
Upstream: http://github.com/karelzak/util-linux/commit/a625b32e2c716723a28a49702a02c78274dd3bb6
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883056
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/lscpu-arm.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/sys-utils/lscpu-arm.c b/sys-utils/lscpu-arm.c
index f3a746a62..2b178a72e 100644
--- a/sys-utils/lscpu-arm.c
+++ b/sys-utils/lscpu-arm.c
@@ -49,7 +49,7 @@ static const struct id_part arm_part[] = {
{ 0xc07, "Cortex-A7" },
{ 0xc08, "Cortex-A8" },
{ 0xc09, "Cortex-A9" },
- { 0xc0d, "Cortex-A12" },
+ { 0xc0d, "Cortex-A17" }, /* Originally A12 */
{ 0xc0f, "Cortex-A15" },
{ 0xc0e, "Cortex-A17" },
{ 0xc14, "Cortex-R4" },
@@ -60,19 +60,28 @@ static const struct id_part arm_part[] = {
{ 0xc21, "Cortex-M1" },
{ 0xc23, "Cortex-M3" },
{ 0xc24, "Cortex-M4" },
- { 0xc20, "Cortex-M7" },
+ { 0xc27, "Cortex-M7" },
{ 0xc60, "Cortex-M0+" },
{ 0xd01, "Cortex-A32" },
{ 0xd03, "Cortex-A53" },
{ 0xd04, "Cortex-A35" },
{ 0xd05, "Cortex-A55" },
+ { 0xd06, "Cortex-A65" },
{ 0xd07, "Cortex-A57" },
{ 0xd08, "Cortex-A72" },
{ 0xd09, "Cortex-A73" },
{ 0xd0a, "Cortex-A75" },
+ { 0xd0b, "Cortex-A76" },
+ { 0xd0c, "Neoverse-N1" },
+ { 0xd0d, "Cortex-A77" },
+ { 0xd0e, "Cortex-A76AE" },
{ 0xd13, "Cortex-R52" },
{ 0xd20, "Cortex-M23" },
{ 0xd21, "Cortex-M33" },
+ { 0xd41, "Cortex-A78" },
+ { 0xd42, "Cortex-A78AE" },
+ { 0xd4a, "Neoverse-E1" },
+ { 0xd4b, "Cortex-A78C" },
{ -1, "unknown" },
};
@@ -126,6 +135,7 @@ static const struct id_part samsung_part[] = {
static const struct id_part nvidia_part[] = {
{ 0x000, "Denver" },
{ 0x003, "Denver 2" },
+ { 0x004, "Carmel" },
{ -1, "unknown" },
};
@@ -167,6 +177,16 @@ static const struct id_part intel_part[] = {
{ -1, "unknown" },
};
+static const struct id_part fujitsu_part[] = {
+ { 0x001, "A64FX" },
+ { -1, "unknown" },
+};
+
+static const struct id_part hisi_part[] = {
+ { 0xd01, "Kunpeng-920" }, /* aka tsv110 */
+ { -1, "unknown" },
+};
+
static const struct id_part unknown_part[] = {
{ -1, "unknown" },
};
@@ -182,6 +202,8 @@ static const struct hw_impl hw_implementer[] = {
{ 0x42, brcm_part, "Broadcom" },
{ 0x43, cavium_part, "Cavium" },
{ 0x44, dec_part, "DEC" },
+ { 0x46, fujitsu_part, "FUJITSU" },
+ { 0x48, hisi_part, "HiSilicon" },
{ 0x4e, nvidia_part, "Nvidia" },
{ 0x50, apm_part, "APM" },
{ 0x51, qcom_part, "Qualcomm" },
@@ -191,7 +213,6 @@ static const struct hw_impl hw_implementer[] = {
{ 0x69, intel_part, "Intel" },
{ -1, unknown_part, "unknown" },
};
-
void arm_cpu_decode(struct lscpu_desc *desc)
{
int j, impl, part;
--
2.29.2

View File

@ -0,0 +1,214 @@
From 63d8d3e8d54326842677bc3d3a3e43a133846a71 Mon Sep 17 00:00:00 2001
From: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Date: Tue, 15 Dec 2020 12:07:38 +0100
Subject: [PATCH 51/55] lscpu: use cluster on aarch64 machine which doesn't
have ACPI PPTT
lscpu may show the wrong number of sockets if the machine is aarch64 and
doesn't have ACPI PPTT.
That's because lscpu show the number of sockets by using a sysfs entry
(cpu/cpuX/topology/core_siblings). The sysfs entry is set by MPIDR_EL1
register if the machine doesn't have ACPI PPTT. MPIDR_EL1 doesn't show
the physical socket information directly. It shows the affinity level.
According to linux/arch/arm64/kernel/topology.c:store_cpu_topology(),
the top level of affinity is called as 'Cluster'.
Use Cluster instead of Socket on the machine which doesn't have ACPI PPTT.
Note, ARM SBBR v1.2 requires ACPI PPTT, so this patch is needed for the
machine which is based on SBBR v1.0 and v1.1.
[kzak@redhat.com: - port to old code
- change semantic to be same as current upstream]
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883056
Upstream: 73c0a766ffbe60e013b55cfd716d531b5a6ae22a
Upstream: https://marc.info/?l=util-linux-ng&m=159984070611464&w=2
Signed-off-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/lscpu.1 | 3 +++
sys-utils/lscpu.c | 65 ++++++++++++++++++++++++++++++++++++++++++-----
sys-utils/lscpu.h | 3 +++
3 files changed, 65 insertions(+), 6 deletions(-)
diff --git a/sys-utils/lscpu.1 b/sys-utils/lscpu.1
index b70f2e151..cf981d708 100644
--- a/sys-utils/lscpu.1
+++ b/sys-utils/lscpu.1
@@ -47,6 +47,9 @@ The logical core number. A core can contain several CPUs.
.B SOCKET
The logical socket number. A socket can contain several cores.
.TP
+.B CLUSTER
+The logical cluster number. A cluster can contain several cores.
+.TP
.B BOOK
The logical book number. A book can contain several sockets.
.TP
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index 748d545b6..a8b448fa0 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -70,6 +70,7 @@
#define _PATH_SYS_HYP_FEATURES "/sys/hypervisor/properties/features"
#define _PATH_SYS_CPU _PATH_SYS_SYSTEM "/cpu"
#define _PATH_SYS_NODE _PATH_SYS_SYSTEM "/node"
+#define _PATH_ACPI_PPTT "/sys/firmware/acpi/tables/PPTT"
#define _PATH_PROC_XEN "/proc/xen"
#define _PATH_PROC_XENCAP _PATH_PROC_XEN "/capabilities"
#define _PATH_PROC_CPUINFO "/proc/cpuinfo"
@@ -168,6 +169,7 @@ enum {
COL_CPU,
COL_CORE,
COL_SOCKET,
+ COL_CLUSTER,
COL_NODE,
COL_BOOK,
COL_DRAWER,
@@ -194,6 +196,7 @@ static struct lscpu_coldesc coldescs[] =
[COL_CPU] = { "CPU", N_("logical CPU number"), 1 },
[COL_CORE] = { "CORE", N_("logical core number") },
[COL_SOCKET] = { "SOCKET", N_("logical socket number") },
+ [COL_CLUSTER] = { "CLUSTER", N_("logical cluster number") },
[COL_NODE] = { "NODE", N_("logical NUMA node number") },
[COL_BOOK] = { "BOOK", N_("logical book number") },
[COL_DRAWER] = { "DRAWER", N_("logical drawer number") },
@@ -383,6 +386,26 @@ static void read_physical_info_powerpc(
}
#endif
+static int is_fallback_to_cluster(struct lscpu_desc *desc)
+{
+ char *arch;
+ struct stat st;
+ struct utsname utsbuf;
+
+ if (desc)
+ arch = desc->arch;
+ else {
+ if (uname(&utsbuf) == -1)
+ err(EXIT_FAILURE, _("error: uname failed"));
+ arch = utsbuf.machine;
+ }
+
+ if (!(strcmp(arch, "aarch64")) && (stat(_PATH_ACPI_PPTT, &st) < 0))
+ return 1;
+ else
+ return 0;
+}
+
static void
read_basicinfo(struct lscpu_desc *desc, struct lscpu_modifier *mod)
@@ -1344,6 +1367,10 @@ get_cell_data(struct lscpu_desc *desc, int idx, int col,
snprintf(buf, bufsz, "%zu", i);
}
break;
+ case COL_CLUSTER:
+ if (!desc->is_cluster)
+ break;
+ /* fallthrough */
case COL_SOCKET:
if (mod->physical) {
if (desc->socketids[idx] == -1)
@@ -1799,12 +1826,18 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod)
if (fd)
fclose(fd);
}
+
+
if (desc->mtid)
threads_per_core = atoi(desc->mtid) + 1;
add_summary_n(tb, _("Thread(s) per core:"),
threads_per_core ?: desc->nthreads / desc->ncores);
- add_summary_n(tb, _("Core(s) per socket:"),
- cores_per_socket ?: desc->ncores / desc->nsockets);
+ if (desc->is_cluster)
+ add_summary_n(tb, _("Core(s) per cluster:"),
+ cores_per_socket ?: desc->ncores / desc->nsockets);
+ else
+ add_summary_n(tb, _("Core(s) per socket:"),
+ cores_per_socket ?: desc->ncores / desc->nsockets);
if (desc->nbooks) {
add_summary_n(tb, _("Socket(s) per book:"),
sockets_per_book ?: desc->nsockets / desc->nbooks);
@@ -1816,7 +1849,17 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod)
add_summary_n(tb, _("Book(s):"), books_per_drawer ?: desc->nbooks);
}
} else {
- add_summary_n(tb, _("Socket(s):"), sockets_per_book ?: desc->nsockets);
+ if (desc->is_cluster) {
+ if (desc->nr_socket_on_cluster > 0)
+ add_summary_n(tb, _("Socket(s):"), desc->nr_socket_on_cluster);
+ else
+ add_summary_s(tb, _("Socket(s):"), "-");
+
+ add_summary_n(tb, _("Cluster(s):"),
+ sockets_per_book ?: desc->nsockets);
+ } else
+ add_summary_n(tb, _("Socket(s):"),
+ sockets_per_book ?: desc->nsockets);
}
}
if (desc->nnodes)
@@ -2060,10 +2103,13 @@ int main(int argc, char *argv[])
qsort(desc->ecaches, desc->necaches,
sizeof(struct cpu_cache), cachecmp);
+ desc->is_cluster = is_fallback_to_cluster(desc);
+
read_nodes(desc);
read_hypervisor(desc, mod);
arm_cpu_decode(desc);
+
switch(mod->mode) {
case OUTPUT_SUMMARY:
print_summary(desc, mod);
@@ -2072,7 +2118,10 @@ int main(int argc, char *argv[])
if (!ncolumns) {
columns[ncolumns++] = COL_CPU;
columns[ncolumns++] = COL_CORE;
- columns[ncolumns++] = COL_SOCKET;
+ if (desc->is_cluster)
+ columns[ncolumns++] = COL_CLUSTER;
+ else
+ columns[ncolumns++] = COL_SOCKET;
columns[ncolumns++] = COL_NODE;
columns[ncolumns++] = COL_CACHE;
mod->compat = 1;
@@ -2089,8 +2138,12 @@ int main(int argc, char *argv[])
columns[ncolumns++] = COL_DRAWER;
if (desc->bookmaps)
columns[ncolumns++] = COL_BOOK;
- if (desc->socketmaps)
- columns[ncolumns++] = COL_SOCKET;
+ if (desc->socketmaps) {
+ if (desc->is_cluster)
+ columns[ncolumns++] = COL_CLUSTER;
+ else
+ columns[ncolumns++] = COL_SOCKET;
+ }
if (desc->coremaps)
columns[ncolumns++] = COL_CORE;
if (desc->caches)
diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h
index 3d1885a3e..bffa9df60 100644
--- a/sys-utils/lscpu.h
+++ b/sys-utils/lscpu.h
@@ -158,6 +158,9 @@ struct lscpu_desc {
int physsockets; /* Physical sockets (modules) */
int physchips; /* Physical chips */
int physcoresperchip; /* Physical cores per chip */
+
+ int is_cluster;
+ int nr_socket_on_cluster;
};
enum {
--
2.29.2

View File

@ -0,0 +1,115 @@
From 60a1a900b22e6d714fbbde03322569ad4732b4ba Mon Sep 17 00:00:00 2001
From: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Date: Fri, 11 Sep 2020 09:53:26 -0400
Subject: [PATCH 52/55] lscpu-dmi: split to parse dmi table
Split out a function to parse dmi table.
Signed-off-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
---
sys-utils/lscpu-dmi.c | 60 ++++++++++++++++++++++++++++---------------
1 file changed, 40 insertions(+), 20 deletions(-)
diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c
index 29bd2e4fc..9b57fe9e6 100644
--- a/sys-utils/lscpu-dmi.c
+++ b/sys-utils/lscpu-dmi.c
@@ -42,6 +42,12 @@ struct dmi_header
uint8_t *data;
};
+struct dmi_info {
+ char *vendor;
+ char *product;
+ char *manufacturer;
+};
+
static int checksum(const uint8_t *buf, size_t len)
{
uint8_t sum = 0;
@@ -105,20 +111,13 @@ static char *dmi_string(const struct dmi_header *dm, uint8_t s)
return bp;
}
-static int hypervisor_from_dmi_table(uint32_t base, uint16_t len,
- uint16_t num, const char *devmem)
+static int parse_dmi_table(uint16_t len, uint16_t num,
+ uint8_t *data,
+ struct dmi_info *di)
{
- uint8_t *buf;
- uint8_t *data;
+ uint8_t *buf = data;
+ int rc = -1;
int i = 0;
- char *vendor = NULL;
- char *product = NULL;
- char *manufacturer = NULL;
- int rc = HYPER_NONE;
-
- data = buf = get_mem_chunk(base, len, devmem);
- if (!buf)
- goto done;
/* 4 is the length of an SMBIOS structure header */
while (i < num && data + 4 <= buf + len) {
@@ -142,11 +141,11 @@ static int hypervisor_from_dmi_table(uint32_t base, uint16_t len,
next += 2;
switch (h.type) {
case 0:
- vendor = dmi_string(&h, data[0x04]);
+ di->vendor = dmi_string(&h, data[0x04]);
break;
case 1:
- manufacturer = dmi_string(&h, data[0x04]);
- product = dmi_string(&h, data[0x05]);
+ di->manufacturer = dmi_string(&h, data[0x04]);
+ di->product = dmi_string(&h, data[0x05]);
break;
default:
break;
@@ -155,15 +154,36 @@ static int hypervisor_from_dmi_table(uint32_t base, uint16_t len,
data = next;
i++;
}
- if (manufacturer && !strcmp(manufacturer, "innotek GmbH"))
+ rc = 0;
+done:
+ return rc;
+}
+
+static int hypervisor_from_dmi_table(uint32_t base, uint16_t len,
+ uint16_t num, const char *devmem)
+{
+ uint8_t *data;
+ int rc = HYPER_NONE;
+ struct dmi_info di;
+
+ data = get_mem_chunk(base, len, devmem);
+ if (!data)
+ return rc;
+
+ memset(&di, 0, sizeof(struct dmi_info));
+ rc = parse_dmi_table(len, num, data, &di);
+ if (rc < 0)
+ goto done;
+
+ if (di.manufacturer && !strcmp(di.manufacturer, "innotek GmbH"))
rc = HYPER_INNOTEK;
- else if (manufacturer && strstr(manufacturer, "HITACHI") &&
- product && strstr(product, "LPAR"))
+ else if (di.manufacturer && strstr(di.manufacturer, "HITACHI") &&
+ di.product && strstr(di.product, "LPAR"))
rc = HYPER_HITACHI;
- else if (vendor && !strcmp(vendor, "Parallels"))
+ else if (di.vendor && !strcmp(di.vendor, "Parallels"))
rc = HYPER_PARALLELS;
done:
- free(buf);
+ free(data);
return rc;
}
--
2.29.2

View File

@ -0,0 +1,91 @@
From 32c4fe66ae9107a7fae556be02c1401e5046071b Mon Sep 17 00:00:00 2001
From: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Date: Fri, 11 Sep 2020 09:53:27 -0400
Subject: [PATCH 53/55] lscpu: add helper to get physical sockets
Add a helper function, get_number_of_physical_sockets_from_dmi(),
to get physical sockets from DMI table in case of the sysfs for
cpu topology doesn't have the physical socket information.
get_number_of_physical_sockets_from_dmi() parse the DMI table
and counts the number of SMBIOS Processor Information (Type04)
structure.
Note, ARM SBBR v1.0 and newer requires SMBIOS Processor Information
(Type04). And ARM SBBR v1.2 requires ACPI PPTT which has physical socket
information. So the helper function is useful for the machine base on
SBBR v1.0 and v1.1.
Signed-off-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
---
sys-utils/lscpu-dmi.c | 30 ++++++++++++++++++++++++++++++
sys-utils/lscpu.h | 1 +
2 files changed, 31 insertions(+)
diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c
index 9b57fe9e6..31127f48a 100644
--- a/sys-utils/lscpu-dmi.c
+++ b/sys-utils/lscpu-dmi.c
@@ -46,6 +46,7 @@ struct dmi_info {
char *vendor;
char *product;
char *manufacturer;
+ int sockets;
};
static int checksum(const uint8_t *buf, size_t len)
@@ -147,6 +148,9 @@ static int parse_dmi_table(uint16_t len, uint16_t num,
di->manufacturer = dmi_string(&h, data[0x04]);
di->product = dmi_string(&h, data[0x05]);
break;
+ case 4:
+ di->sockets++;
+ break;
default:
break;
}
@@ -323,3 +327,29 @@ done:
free(buf);
return rc < 0 ? HYPER_NONE : rc;
}
+
+int get_number_of_physical_sockets_from_dmi(void)
+{
+ static char const sys_fw_dmi_tables[] = _PATH_SYS_DMI;
+ struct dmi_info di;
+ struct stat st;
+ uint8_t *data;
+ int rc = -1;
+
+ if (stat(sys_fw_dmi_tables, &st))
+ return rc;
+
+ data = get_mem_chunk(0, st.st_size, sys_fw_dmi_tables);
+ if (!data)
+ return rc;
+
+ memset(&di, 0, sizeof(struct dmi_info));
+ rc = parse_dmi_table(st.st_size, st.st_size/4, data, &di);
+
+ free(data);
+
+ if ((rc < 0) || !di.sockets)
+ return rc;
+ else
+ return di.sockets;
+}
diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h
index bffa9df60..b190afd21 100644
--- a/sys-utils/lscpu.h
+++ b/sys-utils/lscpu.h
@@ -186,6 +186,7 @@ struct lscpu_modifier {
};
extern int read_hypervisor_dmi(void);
+extern int get_number_of_physical_sockets_from_dmi(void);
extern void arm_cpu_decode(struct lscpu_desc *desc);
#endif /* LSCPU_H */
--
2.29.2

View File

@ -0,0 +1,51 @@
From ac6651b2bc599af707ccc96936bb028d31c1aea8 Mon Sep 17 00:00:00 2001
From: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Date: Fri, 11 Sep 2020 09:53:28 -0400
Subject: [PATCH 54/56] lscpu: show physical socket on aarch64 without ACPI
PPTT
Show the number of physical socket even if the sysfs doesn't have
the physical socket information.
Note, lscpu cannot show the number of socket info for unprivileged
users because it needs to access the DMI table.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883056
Signed-off-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/lscpu.c | 6 ++++--
sys-utils/lscpu.h | 1 -
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index a8b448fa0..dc6dc97c3 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -1850,8 +1850,10 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod)
}
} else {
if (desc->is_cluster) {
- if (desc->nr_socket_on_cluster > 0)
- add_summary_n(tb, _("Socket(s):"), desc->nr_socket_on_cluster);
+ int sockets = get_number_of_physical_sockets_from_dmi();
+
+ if (sockets > 0)
+ add_summary_n(tb, _("Socket(s):"), sockets);
else
add_summary_s(tb, _("Socket(s):"), "-");
diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h
index b190afd21..1aef8202d 100644
--- a/sys-utils/lscpu.h
+++ b/sys-utils/lscpu.h
@@ -160,7 +160,6 @@ struct lscpu_desc {
int physcoresperchip; /* Physical cores per chip */
int is_cluster;
- int nr_socket_on_cluster;
};
enum {
--
2.29.2

View File

@ -0,0 +1,137 @@
From 7089a63d03b35743de533686906c451b917d0909 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 16 Dec 2020 13:08:51 +0100
Subject: [PATCH 55/56] lscpu: (arm) read vendor and model from BIOS
This patch backports the current upstream code to read CPU vendor and
model name from BIOS.
Upstream: http://github.com/karelzak/util-linux/commit/8014104bea78f6f82cb82e16329b562e60ecdc87
Upstream: http://github.com/karelzak/util-linux/commit/367c85c472869b75eaf770d4be0b360e30710b95
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1883056
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1882740
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/lscpu-dmi.c | 44 +++++++++++++++++++++++++++++++++++++++++++
sys-utils/lscpu.c | 7 +++++++
sys-utils/lscpu.h | 3 +++
3 files changed, 54 insertions(+)
diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c
index 31127f48a..3bdd7dcb2 100644
--- a/sys-utils/lscpu-dmi.c
+++ b/sys-utils/lscpu-dmi.c
@@ -28,6 +28,7 @@
#include <stdio.h>
#include "lscpu.h"
+#include "all-io.h"
#define _PATH_SYS_DMI "/sys/firmware/dmi/tables/DMI"
@@ -353,3 +354,46 @@ int get_number_of_physical_sockets_from_dmi(void)
else
return di.sockets;
}
+
+
+#define _PATH_SYS_DMI_TYPE4 "/sys/firmware/dmi/entries/4-0/raw"
+#define PROC_MFR_OFFSET 0x07
+#define PROC_VERSION_OFFSET 0x10
+
+/*
+ * Use firmware to get human readable names
+ */
+int arm_smbios_decode(struct lscpu_desc *desc)
+{
+ uint8_t data[8192];
+ char buf[128], *str;
+ struct dmi_header h;
+ int fd;
+ ssize_t rs;
+
+ fd = open(_PATH_SYS_DMI_TYPE4, O_RDONLY);
+ if (fd < 0)
+ return fd;
+
+ rs = read_all(fd, (char *) data, 8192);
+ close(fd);
+
+ if (rs == -1)
+ return -1;
+
+ to_dmi_header(&h, data);
+
+ str = dmi_string(&h, data[PROC_MFR_OFFSET]);
+ if (str) {
+ xstrncpy(buf, str, 127);
+ desc->bios_vendor = xstrdup(buf);
+ }
+
+ str = dmi_string(&h, data[PROC_VERSION_OFFSET]);
+ if (str) {
+ xstrncpy(buf, str, 127);
+ desc->bios_modelname = xstrdup(buf);
+ }
+
+ return 0;
+}
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index dc6dc97c3..70a797dd6 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -1868,6 +1868,8 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod)
add_summary_n(tb, _("NUMA node(s):"), desc->nnodes);
if (desc->vendor)
add_summary_s(tb, _("Vendor ID:"), desc->vendor);
+ if (desc->bios_vendor)
+ add_summary_s(tb, _("BIOS Vendor ID:"), desc->bios_vendor);
if (desc->machinetype)
add_summary_s(tb, _("Machine type:"), desc->machinetype);
if (desc->family)
@@ -1876,6 +1878,8 @@ print_summary(struct lscpu_desc *desc, struct lscpu_modifier *mod)
add_summary_s(tb, _("Model:"), desc->revision ? desc->revision : desc->model);
if (desc->modelname || desc->cpu)
add_summary_s(tb, _("Model name:"), desc->cpu ? desc->cpu : desc->modelname);
+ if (desc->bios_modelname)
+ add_summary_s(tb, _("BIOS Model name:"), desc->bios_modelname);
if (desc->stepping)
add_summary_s(tb, _("Stepping:"), desc->stepping);
if (desc->mhz)
@@ -2109,6 +2113,9 @@ int main(int argc, char *argv[])
read_nodes(desc);
read_hypervisor(desc, mod);
+
+ if (mod->system == SYSTEM_LIVE)
+ arm_smbios_decode(desc);
arm_cpu_decode(desc);
diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h
index 1aef8202d..802719eeb 100644
--- a/sys-utils/lscpu.h
+++ b/sys-utils/lscpu.h
@@ -79,10 +79,12 @@ struct polarization_modes {
struct lscpu_desc {
char *arch;
char *vendor;
+ char *bios_vendor; /* aarch64 */
char *machinetype; /* s390 */
char *family;
char *model;
char *modelname;
+ char *bios_modelname; /* aarch64 */
char *revision; /* alternative for model (ppc) */
char *cpu; /* alternative for modelname (ppc, sparc) */
char *virtflag; /* virtualization flag (vmx, svm) */
@@ -187,5 +189,6 @@ struct lscpu_modifier {
extern int read_hypervisor_dmi(void);
extern int get_number_of_physical_sockets_from_dmi(void);
extern void arm_cpu_decode(struct lscpu_desc *desc);
+extern int arm_smbios_decode(struct lscpu_desc *desc);
#endif /* LSCPU_H */
--
2.29.2

View File

@ -0,0 +1,28 @@
From 2193cfc5ee3f417e276c181fe39455646399153b Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 17 Sep 2018 16:22:14 +0200
Subject: [PATCH 56/56] tests: update sfdisk resize
Upstream: http://github.com/karelzak/util-linux/commit/a1b463d94afdae65ab5bfb192a58f1ceeb13679a
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1900498
Signed-off-by: Karel Zak <kzak@redhat.com>
---
tests/expected/sfdisk/dos-resize-logical | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/expected/sfdisk/dos-resize-logical b/tests/expected/sfdisk/dos-resize-logical
index 9ceb9a327..a427ff010 100644
--- a/tests/expected/sfdisk/dos-resize-logical
+++ b/tests/expected/sfdisk/dos-resize-logical
@@ -26,7 +26,7 @@ Device Boot Start End Sectors Size Id Type
<removed>3 6144 8191 2048 1M 83 Linux
<removed>4 8192 28671 20480 10M 5 Extended
<removed>5 10240 12287 2048 1M 83 Linux
-<removed>6 14336 26623 12288 6M 83 Linux
+<removed>6 14336 28671 14336 7M 83 Linux
The partition table has been altered.
Calling ioctl() to re-read partition table.
--
2.29.2

View File

@ -0,0 +1,52 @@
From 7ad815523618c2a053d28061054a44ae9108ceb0 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 12 Apr 2021 09:39:59 +0200
Subject: [PATCH 57/63] mesg: use only stat() to get the current terminal
status
open()+stat() does not work for example after su(1) (from root to
non-root). It seems better to use only stat() to get the current
terminal status.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1906157
Upstream: http://github.com/karelzak/util-linux/commit/c0246ce059503bbc078122a50d564ca36a66f348
Signed-off-by: Karel Zak <kzak@redhat.com>
---
term-utils/mesg.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/term-utils/mesg.c b/term-utils/mesg.c
index 8714ad1aa..21a4a8581 100644
--- a/term-utils/mesg.c
+++ b/term-utils/mesg.c
@@ -123,13 +123,10 @@ int main(int argc, char *argv[])
if ((tty = ttyname(STDERR_FILENO)) == NULL)
err(MESG_EXIT_FAILURE, _("ttyname failed"));
- if ((fd = open(tty, O_RDONLY)) < 0)
- err(MESG_EXIT_FAILURE, _("cannot open %s"), tty);
- if (fstat(fd, &sb))
- err(MESG_EXIT_FAILURE, _("stat of %s failed"), tty);
if (!*argv) {
- close(fd);
+ if (stat(tty, &sb))
+ err(MESG_EXIT_FAILURE, _("stat of %s failed"), tty);
if (sb.st_mode & (S_IWGRP | S_IWOTH)) {
puts(_("is y"));
return IS_ALLOWED;
@@ -138,6 +135,11 @@ int main(int argc, char *argv[])
return IS_NOT_ALLOWED;
}
+ if ((fd = open(tty, O_RDONLY)) < 0)
+ err(MESG_EXIT_FAILURE, _("cannot open %s"), tty);
+ if (fstat(fd, &sb))
+ err(MESG_EXIT_FAILURE, _("stat of %s failed"), tty);
+
switch (rpmatch(argv[0])) {
case RPMATCH_YES:
#ifdef USE_TTY_GROUP
--
2.31.1

View File

@ -0,0 +1,212 @@
From 2f04609de018013a36396e6a10b317607fb0b625 Mon Sep 17 00:00:00 2001
From: Roberto Bergantinos Corpas <rbergant@redhat.com>
Date: Tue, 12 Jan 2021 11:58:53 +0100
Subject: [PATCH 58/63] findmnt: add option to list all fs-independent flags
It might be useful for security auditing purposes list all possible
mount flags/options including default set which are normally not listed.
This patch adds "--vfs-all" option to list all fs-independent flags
on VFS-OPTIONS column, as well as libmount funcionality to accomplish
it.
i.e.:
$ findmnt -o VFS-OPTIONS
VFS-OPTIONS
rw,relatime
rw,nosuid,nodev,noexec,relatime
rw,nosuid,nodev,noexec,relatime
ro,nosuid,nodev,noexec
...
$ findmnt --vfs-all -o VFS-OPTIONS
VFS-OPTIONS
rw,exec,suid,dev,async,loud,nomand,atime,noiversion,diratime,relatime,nostrictatime,nolazytime,symfollow
rw,noexec,nosuid,nodev,async,loud,nomand,atime,noiversion,diratime,relatime,nostrictatime,nolazytime,symfollow
rw,noexec,nosuid,nodev,async,loud,nomand,atime,noiversion,diratime,relatime,nostrictatime,nolazytime,symfollow
ro,noexec,nosuid,nodev,async,loud,nomand,atime,noiversion,diratime,norelatime,nostrictatime,nolazytime,symfollow
...
[kzak@redhat.com: - cleanup coding style and comments]
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1917852
Upstream: http://github.com/karelzak/util-linux/commit/ff21f476f85ac9855452f4aac43a231c3c1e2ebc
Signed-off-by: Roberto Bergantinos Corpas <rbergant@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/docs/libmount-sections.txt | 1 +
libmount/src/fs.c | 32 +++++++++++++++++++++++++++++
libmount/src/libmount.h.in | 1 +
libmount/src/libmount.sym | 4 ++++
misc-utils/findmnt.8 | 6 ++++++
misc-utils/findmnt.c | 15 +++++++++++---
misc-utils/findmnt.h | 2 ++
7 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/libmount/docs/libmount-sections.txt b/libmount/docs/libmount-sections.txt
index dea724b2f..f296c0611 100644
--- a/libmount/docs/libmount-sections.txt
+++ b/libmount/docs/libmount-sections.txt
@@ -224,6 +224,7 @@ mnt_fs_get_usedsize
mnt_fs_get_userdata
mnt_fs_get_user_options
mnt_fs_get_vfs_options
+mnt_fs_get_vfs_options_all
mnt_fs_is_kernel
mnt_fs_is_netfs
mnt_fs_is_pseudofs
diff --git a/libmount/src/fs.c b/libmount/src/fs.c
index aae4961c3..34c09d66b 100644
--- a/libmount/src/fs.c
+++ b/libmount/src/fs.c
@@ -924,6 +924,38 @@ const char *mnt_fs_get_vfs_options(struct libmnt_fs *fs)
return fs ? fs->vfs_optstr : NULL;
}
+/**
+ * mnt_fs_get_vfs_options_all:
+ * @fs: fstab/mtab entry pointer
+ *
+ * Returns: pointer to newlly allocated string (can be freed by free(3)) or
+ * NULL in case of error. The string contains all (including defaults) mount
+ * options.
+ */
+char *mnt_fs_get_vfs_options_all(struct libmnt_fs *fs)
+{
+ const struct libmnt_optmap *map = mnt_get_builtin_optmap(MNT_LINUX_MAP);
+ const struct libmnt_optmap *ent;
+ const char *opts = mnt_fs_get_options(fs);
+ char *result = NULL;
+ unsigned long flags = 0;
+
+ if (!opts || mnt_optstr_get_flags(opts, &flags, map))
+ return NULL;
+
+ for (ent = map ; ent && ent->name ; ent++){
+ if (ent->id & flags) { /* non-default value */
+ if (!(ent->mask & MNT_INVERT))
+ mnt_optstr_append_option(&result, ent->name, NULL);
+ else
+ continue;
+ } else if (ent->mask & MNT_INVERT)
+ mnt_optstr_append_option(&result, ent->name, NULL);
+ }
+
+ return result;
+}
+
/**
* mnt_fs_get_user_options:
* @fs: fstab/mtab entry pointer
diff --git a/libmount/src/libmount.h.in b/libmount/src/libmount.h.in
index c61514b59..1d9a053e0 100644
--- a/libmount/src/libmount.h.in
+++ b/libmount/src/libmount.h.in
@@ -452,6 +452,7 @@ extern int mnt_fs_get_option(struct libmnt_fs *fs, const char *name,
extern const char *mnt_fs_get_fs_options(struct libmnt_fs *fs);
extern const char *mnt_fs_get_vfs_options(struct libmnt_fs *fs);
extern const char *mnt_fs_get_user_options(struct libmnt_fs *fs);
+extern char *mnt_fs_get_vfs_options_all(struct libmnt_fs *fs);
extern const char *mnt_fs_get_attributes(struct libmnt_fs *fs);
extern int mnt_fs_set_attributes(struct libmnt_fs *fs, const char *optstr);
diff --git a/libmount/src/libmount.sym b/libmount/src/libmount.sym
index ca16cafa1..636c564eb 100644
--- a/libmount/src/libmount.sym
+++ b/libmount/src/libmount.sym
@@ -322,3 +322,7 @@ MOUNT_2.30 {
mnt_context_enable_rwonly_mount;
mnt_context_get_excode;
} MOUNT_2.28;
+
+MOUNT_2_37 {
+ mnt_fs_get_vfs_options_all;
+} MOUNT_2.30;
diff --git a/misc-utils/findmnt.8 b/misc-utils/findmnt.8
index 58dd38625..41a37cb5f 100644
--- a/misc-utils/findmnt.8
+++ b/misc-utils/findmnt.8
@@ -249,6 +249,12 @@ It's possible to specify source (device) or target (mountpoint) to filter mount
.TP
.BR "\-\-verbose"
Force findmnt to print more information (\fB\-\-verify\fP only for now).
+.TP
+.B \-\-vfs-all
+When used with
+.BR VFS-OPTIONS
+column, print all VFS (fs-independent) flags. This option is designed for auditing purposes to
+list also default VFS kernel mount options which are normally not listed.
.SH EXAMPLES
.IP "\fBfindmnt \-\-fstab \-t nfs\fP"
Prints all NFS filesystems defined in
diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c
index 184b6f7d7..a7b3af4f4 100644
--- a/misc-utils/findmnt.c
+++ b/misc-utils/findmnt.c
@@ -542,7 +542,10 @@ static char *get_data(struct libmnt_fs *fs, int num)
str = xstrdup(mnt_fs_get_options(fs));
break;
case COL_VFS_OPTIONS:
- str = xstrdup(mnt_fs_get_vfs_options(fs));
+ if (flags & FL_VFS_ALL)
+ str = mnt_fs_get_vfs_options_all(fs);
+ else if (mnt_fs_get_vfs_options(fs))
+ str = xstrdup(mnt_fs_get_vfs_options(fs));
break;
case COL_FS_OPTIONS:
str = xstrdup(mnt_fs_get_fs_options(fs));
@@ -1243,6 +1246,7 @@ static void __attribute__((__noreturn__)) usage(void)
fputc('\n', out);
fputs(_(" -x, --verify verify mount table content (default is fstab)\n"), out);
fputs(_(" --verbose print more details\n"), out);
+ fputs(_(" --vfs-all print all VFS options\n"), out);
fputs(USAGE_SEPARATOR, out);
printf(USAGE_HELP_OPTIONS(24));
@@ -1271,8 +1275,9 @@ int main(int argc, char *argv[])
struct libscols_table *table = NULL;
enum {
- FINDMNT_OPT_VERBOSE = CHAR_MAX + 1,
- FINDMNT_OPT_TREE
+ FINDMNT_OPT_VERBOSE = CHAR_MAX + 1,
+ FINDMNT_OPT_TREE,
+ FINDMNT_OPT_VFS_ALL
};
static const struct option longopts[] = {
@@ -1313,6 +1318,7 @@ int main(int argc, char *argv[])
{ "version", no_argument, NULL, 'V' },
{ "verbose", no_argument, NULL, FINDMNT_OPT_VERBOSE },
{ "tree", no_argument, NULL, FINDMNT_OPT_TREE },
+ { "vfs-all", no_argument, NULL, FINDMNT_OPT_VFS_ALL },
{ NULL, 0, NULL, 0 }
};
@@ -1479,6 +1485,9 @@ int main(int argc, char *argv[])
case FINDMNT_OPT_TREE:
force_tree = 1;
break;
+ case FINDMNT_OPT_VFS_ALL:
+ flags |= FL_VFS_ALL;
+ break;
default:
errtryhelp(EXIT_FAILURE);
}
diff --git a/misc-utils/findmnt.h b/misc-utils/findmnt.h
index fbaa38e82..9a277b68a 100644
--- a/misc-utils/findmnt.h
+++ b/misc-utils/findmnt.h
@@ -19,6 +19,8 @@ enum {
FL_STRICTTARGET = (1 << 15),
FL_VERBOSE = (1 << 16),
+ FL_VFS_ALL = (1 << 19),
+
/* basic table settings */
FL_ASCII = (1 << 20),
FL_RAW = (1 << 21),
--
2.31.1

View File

@ -0,0 +1,83 @@
From ae227f0eb3500b49fb78623f51ec9bd4366346ef Mon Sep 17 00:00:00 2001
From: Stanislav Brabec <sbrabec@suse.cz>
Date: Thu, 10 Oct 2019 01:08:25 +0200
Subject: [PATCH 59/63] nologin: Prevent error from su -c
"su -c" can pass "-c" to nologin. It causes ugly error:
su -c "echo OK" - man
-nologin: invalid option -- 'c'
Try '-nologin --help' for more information.
Accept -c to prevent this error.
Upstream: http://github.com/karelzak/util-linux/commit/a174eefb41a2ce8b467bb7e1546953c8bd1223dd
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1922299
Signed-off-by: Josef Cejka <jcejka@suse.com>
Signed-off-by: Stanislav Brabec <sbrabec@suse.cz>
---
login-utils/nologin.8 | 11 +++++++++--
login-utils/nologin.c | 9 +++++++--
2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/login-utils/nologin.8 b/login-utils/nologin.8
index ee5948443..9389a86c6 100644
--- a/login-utils/nologin.8
+++ b/login-utils/nologin.8
@@ -18,9 +18,16 @@ The exit code returned by
is always 1.
.PP
.SH OPTIONS
-.IP "\fB\-h, \-\-help\fP"
+
+
+.TP
+.IP "\fB\-c\fR, \fB\-\-command\fR \fIcommand\fR"
+Ignored. For compatibility with
+.I su -c "command" - user
+that would cause error otherwise.
+.IP "\fB\-h\fR, \fB\-\-help\fR"
Display help text and exit.
-.IP "\fB-V, \-\-version"
+.IP "\fB-V\fR, \fB\-\-version\fR"
Display version information and exit.
.SH NOTES
.B nologin
diff --git a/login-utils/nologin.c b/login-utils/nologin.c
index b0b6a721c..293f568c1 100644
--- a/login-utils/nologin.c
+++ b/login-utils/nologin.c
@@ -30,7 +30,8 @@ static void __attribute__((__noreturn__)) usage(void)
fputs(_("Politely refuse a login.\n"), out);
fputs(USAGE_OPTIONS, out);
- printf(USAGE_HELP_OPTIONS(16));
+ fputs(_(" -c, --command <command> does nothing (for compatibility with su -c)\n"), out);
+ printf(USAGE_HELP_OPTIONS(26));
printf(USAGE_MAN_TAIL("nologin(8)"));
exit(EXIT_FAILURE);
@@ -41,6 +42,7 @@ int main(int argc, char *argv[])
int c, fd = -1;
struct stat st;
static const struct option longopts[] = {
+ { "command", required_argument, NULL, 'c' },
{ "help", 0, NULL, 'h' },
{ "version", 0, NULL, 'V' },
{ NULL, 0, NULL, 0 }
@@ -50,8 +52,11 @@ int main(int argc, char *argv[])
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
- while ((c = getopt_long(argc, argv, "hV", longopts, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "c:hV", longopts, NULL)) != -1) {
switch (c) {
+ case 'c':
+ /* Ignore the command, just don't print unknown option error. */
+ break;
case 'h':
usage();
break;
--
2.31.1

View File

@ -0,0 +1,124 @@
From bfa7d299f8a497a835bc250bd765094ee06b8a01 Mon Sep 17 00:00:00 2001
From: Sami Kerola <kerolasa@iki.fi>
Date: Sun, 17 Nov 2019 08:33:04 +0000
Subject: [PATCH 60/63] nologin: silently ignore well known shell command-line
options
nologin is typically used in /etc/passwd as a shell replacement. Hence it
is reasonable to ignore well known command-line options silently to avoid
unwanted ugly error messages.
Addresses: https://github.com/karelzak/util-linux/issues/895
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1922299
Upstream: http://github.com/karelzak/util-linux/commit/beb61b07c20ab902fec883a4bd087c45d2742dea
Requested-by: Lennart Poettering <lennart@poettering.net>
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
---
login-utils/nologin.8 | 32 ++++++++++++++++++++++++--------
login-utils/nologin.c | 33 ++++++++++++++++++++++++++++-----
2 files changed, 52 insertions(+), 13 deletions(-)
diff --git a/login-utils/nologin.8 b/login-utils/nologin.8
index 9389a86c6..d3882e2b1 100644
--- a/login-utils/nologin.8
+++ b/login-utils/nologin.8
@@ -1,4 +1,4 @@
-.TH NOLOGIN 8 "September 2013" "util-linux" "System Administration"
+.TH NOLOGIN 8 "November 2019" "util-linux" "System Administration"
.SH NAME
nologin \- politely refuse a login
.SH SYNOPSIS
@@ -18,13 +18,29 @@ The exit code returned by
is always 1.
.PP
.SH OPTIONS
-
-
-.TP
-.IP "\fB\-c\fR, \fB\-\-command\fR \fIcommand\fR"
-Ignored. For compatibility with
-.I su -c "command" - user
-that would cause error otherwise.
+\fB\-c\fR, \fB\-\-command\fR \fIcommand\fR
+.br
+\fB\-\-init-file\fR
+.br
+\fB\-i\fR \fB\-\-interactive\fR
+.br
+\fB\-\-init-file\fR \fIfile\fR
+.br
+\fB\-i\fR, \fB\-\-interactive\fR
+.br
+\fB\-l\fR, \fB\-\-login\fR
+.br
+\fB\-\-noprofile\fR
+.br
+\fB\-\-norc\fR
+.br
+\fB\-\-posix\fR
+.br
+\fB\-\-rcfile\fR \fIfile\fR
+.br
+\fB\-r\fR, \fB\-\-restricted\fR
+.IP
+These shell command-line options are ignored to avoid nologin error.
.IP "\fB\-h\fR, \fB\-\-help\fR"
Display help text and exit.
.IP "\fB-V\fR, \fB\-\-version\fR"
diff --git a/login-utils/nologin.c b/login-utils/nologin.c
index 293f568c1..567a9a2ca 100644
--- a/login-utils/nologin.c
+++ b/login-utils/nologin.c
@@ -41,10 +41,25 @@ int main(int argc, char *argv[])
{
int c, fd = -1;
struct stat st;
+ enum {
+ OPT_INIT_FILE = CHAR_MAX + 1,
+ OPT_NOPROFILE,
+ OPT_NORC,
+ OPT_POSIX,
+ OPT_RCFILE
+ };
static const struct option longopts[] = {
- { "command", required_argument, NULL, 'c' },
- { "help", 0, NULL, 'h' },
- { "version", 0, NULL, 'V' },
+ { "command", required_argument, NULL, 'c' },
+ { "init-file", required_argument, NULL, OPT_INIT_FILE },
+ { "interactive", no_argument, NULL, 'i' },
+ { "login", no_argument, NULL, 'l' },
+ { "noprofile", no_argument, NULL, OPT_NOPROFILE },
+ { "norc", no_argument, NULL, OPT_NORC },
+ { "posix", no_argument, NULL, OPT_POSIX },
+ { "rcfile", required_argument, NULL, OPT_RCFILE },
+ { "restricted", no_argument, NULL, 'r' },
+ { "help", no_argument, NULL, 'h' },
+ { "version", no_argument, NULL, 'V' },
{ NULL, 0, NULL, 0 }
};
@@ -52,10 +67,18 @@ int main(int argc, char *argv[])
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
- while ((c = getopt_long(argc, argv, "c:hV", longopts, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "c:ilrhV", longopts, NULL)) != -1) {
switch (c) {
case 'c':
- /* Ignore the command, just don't print unknown option error. */
+ case OPT_INIT_FILE:
+ case 'i':
+ case 'l':
+ case OPT_NOPROFILE:
+ case OPT_NORC:
+ case OPT_POSIX:
+ case OPT_RCFILE:
+ case 'r':
+ /* Ignore well known shell command-line options */
break;
case 'h':
usage();
--
2.31.1

View File

@ -0,0 +1,213 @@
From 543e87865c5b9b7cb08ce8d55da1ef414154d213 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 24 Mar 2021 12:43:17 +0100
Subject: [PATCH 61/63] libsmartcols: introduce default sort column
* add default sort column, set by scols_sort_table()
* sort tree according to default sort column also in scols_sort_table_by_tree()
The function scols_sort_table() does not sort tree branches if tree
is not enabled. The function scols_sort_table_by_tree() does not care
if tree is enabled and it always follows parent->child relations. For
scols_sort_table_by_tree() we need to follow order in branches if
previously scols_sort_table() has been called.
For example lsblk calls
scols_sort_table(tb, cl);
scols_sort_table_by_tree(tb);
for list-like output (for example lsblk -P) and users assume the
same order as for tree (lsblk --tree).
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1940607
Upstream: http://github.com/karelzak/util-linux/commit/529b51706ef06611a8165023f14e6593e06901de
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libsmartcols/src/smartcolsP.h | 3 ++
libsmartcols/src/table.c | 60 ++++++++++++++++++++++++----------
libsmartcols/src/table_print.c | 6 ++--
misc-utils/lsblk.c | 6 ++--
4 files changed, 52 insertions(+), 23 deletions(-)
diff --git a/libsmartcols/src/smartcolsP.h b/libsmartcols/src/smartcolsP.h
index 510e7a980..8037fb9f5 100644
--- a/libsmartcols/src/smartcolsP.h
+++ b/libsmartcols/src/smartcolsP.h
@@ -160,6 +160,9 @@ struct libscols_table {
struct list_head tb_columns;
struct list_head tb_lines;
+
+ struct libscols_column *dflt_sort_column; /* default sort column, set by scols_sort_table() */
+
struct libscols_symbols *symbols;
struct libscols_cell title; /* optional table title (for humans) */
diff --git a/libsmartcols/src/table.c b/libsmartcols/src/table.c
index 979a09a39..bbabc0817 100644
--- a/libsmartcols/src/table.c
+++ b/libsmartcols/src/table.c
@@ -224,6 +224,8 @@ int scols_table_remove_column(struct libscols_table *tb,
if (cl->flags & SCOLS_FL_TREE)
tb->ntreecols--;
+ if (tb->dflt_sort_column == cl)
+ tb->dflt_sort_column = NULL;
DBG(TAB, ul_debugobj(tb, "remove column"));
list_del_init(&cl->cl_columns);
@@ -1362,41 +1364,63 @@ static int sort_line_children(struct libscols_line *ln, struct libscols_column *
return 0;
}
+static int __scols_sort_tree(struct libscols_table *tb, struct libscols_column *cl)
+{
+ struct libscols_line *ln;
+ struct libscols_iter itr;
+
+ if (!tb || !cl || !cl->cmpfunc)
+ return -EINVAL;
+
+ scols_reset_iter(&itr, SCOLS_ITER_FORWARD);
+ while (scols_table_next_line(tb, &itr, &ln) == 0)
+ sort_line_children(ln, cl);
+ return 0;
+}
+
/**
* scols_sort_table:
* @tb: table
- * @cl: order by this column
+ * @cl: order by this column or NULL
*
* Orders the table by the column. See also scols_column_set_cmpfunc(). If the
* tree output is enabled then children in the tree are recursively sorted too.
*
+ * The column @cl is saved as the default sort column to the @tb and the next time
+ * is possible to call scols_sort_table(tb, NULL). The saved column is also used by
+ * scols_sort_table_by_tree().
+ *
* Returns: 0, a negative value in case of an error.
*/
int scols_sort_table(struct libscols_table *tb, struct libscols_column *cl)
{
- if (!tb || !cl || !cl->cmpfunc)
+ if (!tb)
+ return -EINVAL;
+ if (!cl)
+ cl = tb->dflt_sort_column;
+ if (!cl || !cl->cmpfunc)
return -EINVAL;
- DBG(TAB, ul_debugobj(tb, "sorting table"));
+ DBG(TAB, ul_debugobj(tb, "sorting table by %zu column", cl->seqnum));
list_sort(&tb->tb_lines, cells_cmp_wrapper_lines, cl);
- if (scols_table_is_tree(tb)) {
- struct libscols_line *ln;
- struct libscols_iter itr;
+ if (scols_table_is_tree(tb))
+ __scols_sort_tree(tb, cl);
- scols_reset_iter(&itr, SCOLS_ITER_FORWARD);
- while (scols_table_next_line(tb, &itr, &ln) == 0)
- sort_line_children(ln, cl);
- }
+ if (cl && cl != tb->dflt_sort_column)
+ tb->dflt_sort_column = cl;
return 0;
}
+/*
+ * Move all @ln's children after @ln in the table.
+ */
static struct libscols_line *move_line_and_children(struct libscols_line *ln, struct libscols_line *pre)
{
if (pre) {
list_del_init(&ln->ln_lines); /* remove from old position */
- list_add(&ln->ln_lines, &pre->ln_lines); /* add to the new place (behind @pre) */
+ list_add(&ln->ln_lines, &pre->ln_lines); /* add to the new place (after @pre) */
}
pre = ln;
@@ -1418,7 +1442,10 @@ static struct libscols_line *move_line_and_children(struct libscols_line *ln, st
* @tb: table
*
* Reorders lines in the table by parent->child relation. Note that order of
- * the lines in the table is independent on the tree hierarchy.
+ * the lines in the table is independent on the tree hierarchy by default.
+ *
+ * The children of the lines are sorted according to the default sort column
+ * if scols_sort_table() has been previously called.
*
* Since: 2.30
*
@@ -1434,13 +1461,12 @@ int scols_sort_table_by_tree(struct libscols_table *tb)
DBG(TAB, ul_debugobj(tb, "sorting table by tree"));
- scols_reset_iter(&itr, SCOLS_ITER_FORWARD);
- while (scols_table_next_line(tb, &itr, &ln) == 0) {
- if (ln->parent)
- continue;
+ if (tb->dflt_sort_column)
+ __scols_sort_tree(tb, tb->dflt_sort_column);
+ scols_reset_iter(&itr, SCOLS_ITER_FORWARD);
+ while (scols_table_next_line(tb, &itr, &ln) == 0)
move_line_and_children(ln, NULL);
- }
return 0;
}
diff --git a/libsmartcols/src/table_print.c b/libsmartcols/src/table_print.c
index 8ecfc30e2..337dbbd84 100644
--- a/libsmartcols/src/table_print.c
+++ b/libsmartcols/src/table_print.c
@@ -585,11 +585,9 @@ static int cell_to_buffer(struct libscols_table *tb,
ce = scols_line_get_cell(ln, cl->seqnum);
data = ce ? scols_cell_get_data(ce) : NULL;
- if (!data)
- return 0;
if (!scols_column_is_tree(cl))
- return buffer_set_data(buf, data);
+ return data ? buffer_set_data(buf, data) : 0;
/*
* Tree stuff
@@ -605,7 +603,7 @@ static int cell_to_buffer(struct libscols_table *tb,
buffer_set_art_index(buf);
}
- if (!rc)
+ if (!rc && data)
rc = buffer_append_data(buf, data);
return rc;
}
diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c
index d0369d3e7..cc7894ecf 100644
--- a/misc-utils/lsblk.c
+++ b/misc-utils/lsblk.c
@@ -1894,10 +1894,12 @@ int main(int argc, char *argv[])
* /sys is no more sorted */
lsblk->sort_id = COL_MAJMIN;
- /* For --inverse --list we still follow parent->child relation */
- if (lsblk->inverse && !(lsblk->flags & LSBLK_TREE))
+ /* For --{inverse,raw,pairs} --list we still follow parent->child relation */
+ if (!(lsblk->flags & LSBLK_TREE)
+ && (lsblk->inverse || lsblk->flags & LSBLK_EXPORT || lsblk->flags & LSBLK_RAW))
lsblk->force_tree_order = 1;
+
if (lsblk->sort_id >= 0 && column_id_to_number(lsblk->sort_id) < 0) {
/* the sort column is not between output columns -- add as hidden */
add_column(lsblk->sort_id);
--
2.31.1

View File

@ -0,0 +1,120 @@
From 8681757ee08361d78e4c74da8abae9d6df8623e7 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 28 May 2018 15:46:28 +0200
Subject: [PATCH 62/63] libmount: accept another flags on MS_REMOUNT|MS_BIND
The current libmount MS_REMOUNT|MS_BIND support is restricted to
MS_RDONLY (read-only bind mount). This is too restrictive as Linux
kernel supports bind-remount for arbitrary VFS flags.
After this update you can use
# mount /dev/sdc1 /mnt/A
# mount --bind -onosuid,noexec /mnt/A /mnt/B
# findmnt /dev/sdc1 -oTARGET,SOURCE,FS-OPTIONS,VFS-OPTIONS
TARGET SOURCE FS-OPTIONS VFS-OPTIONS
/mnt/A /dev/sdc1 rw,stripe=512,data=ordered rw,relatime
/mnt/B /dev/sdc1 rw,stripe=512,data=ordered rw,nosuid,noexec,relatime
The "mount --bind" is composed from two syscalls of course (1st is
bind, 2nd is bind,remount,nosuid,noexec).
Addresses: https://github.com/karelzak/util-linux/issues/637
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1919529
Upstream: http://github.com/karelzak/util-linux/commit/e82b77e9696a6dada96a7f3ea3ec20a63e8e7b9e
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/context_mount.c | 22 ++++++++--------------
libmount/src/mountP.h | 3 +++
sys-utils/mount.8 | 5 +++--
3 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c
index a6de36178..b88e60507 100644
--- a/libmount/src/context_mount.c
+++ b/libmount/src/context_mount.c
@@ -107,22 +107,16 @@ static int init_propagation(struct libmnt_context *cxt)
}
/*
- * add additional mount(2) syscall request to implement "ro,bind", the first regular
- * mount(2) is the "bind" operation, the second is "remount,ro,bind" call.
- *
- * Note that we don't remove "ro" from the first syscall (kernel silently
- * ignores this flags for bind operation) -- maybe one day kernel will support
- * read-only binds in one step and then all will be done by the first mount(2) and the
- * second remount will be noop...
+ * add additional mount(2) syscall request to implement "bind,<flags>", the first regular
+ * mount(2) is the "bind" operation, the second is "remount,bind,<flags>" call.
*/
-static int init_robind(struct libmnt_context *cxt)
+static int init_bind_remount(struct libmnt_context *cxt)
{
struct libmnt_addmount *ad;
int rc;
assert(cxt);
assert(cxt->mountflags & MS_BIND);
- assert(cxt->mountflags & MS_RDONLY);
assert(!(cxt->mountflags & MS_REMOUNT));
DBG(CXT, ul_debugobj(cxt, "mount: initialize additional ro,bind mount"));
@@ -131,9 +125,9 @@ static int init_robind(struct libmnt_context *cxt)
if (!ad)
return -ENOMEM;
- ad->mountflags = MS_REMOUNT | MS_BIND | MS_RDONLY;
- if (cxt->mountflags & MS_REC)
- ad->mountflags |= MS_REC;
+ ad->mountflags = cxt->mountflags;
+ ad->mountflags |= (MS_REMOUNT | MS_BIND);
+
rc = mnt_context_append_additional_mount(cxt, ad);
if (rc)
return rc;
@@ -254,9 +248,9 @@ static int fix_optstr(struct libmnt_context *cxt)
return rc;
}
if ((cxt->mountflags & MS_BIND)
- && (cxt->mountflags & MS_RDONLY)
+ && (cxt->mountflags & MNT_BIND_SETTABLE)
&& !(cxt->mountflags & MS_REMOUNT)) {
- rc = init_robind(cxt);
+ rc = init_bind_remount(cxt);
if (rc)
return rc;
}
diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h
index 52a238ef3..64a507e61 100644
--- a/libmount/src/mountP.h
+++ b/libmount/src/mountP.h
@@ -363,6 +363,9 @@ struct libmnt_context
/* default flags */
#define MNT_FL_DEFAULT 0
+/* Flags usable with MS_BIND|MS_REMOUNT */
+#define MNT_BIND_SETTABLE (MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_NOATIME|MS_NODIRATIME|MS_RELATIME|MS_RDONLY)
+
/* lock.c */
extern int mnt_lock_use_simplelock(struct libmnt_lock *ml, int enable);
diff --git a/sys-utils/mount.8 b/sys-utils/mount.8
index a4d7de2c0..291e65cb1 100644
--- a/sys-utils/mount.8
+++ b/sys-utils/mount.8
@@ -410,8 +410,9 @@ will be writable, but the
will be read-only.
It's also possible to change nosuid, nodev, noexec, noatime, nodiratime and
-relatime VFS entry flags by "remount,bind" operation. It's impossible to change
-mount options recursively (for example with \fB-o rbind,ro\fR).
+relatime VFS entry flags by "remount,bind" operation. The another (for example
+filesystem specific flags) are silently ignored. It's impossible to change mount
+options recursively (for example with \fB-o rbind,ro\fR).
.BR mount (8)
since v2.31 ignores the \fBbind\fR flag from
--
2.31.1

View File

@ -0,0 +1,135 @@
From 9f7fe1b83fcc508dc3e05815d03dbbb752a1cfba Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 1 Jun 2018 12:16:19 +0200
Subject: [PATCH 63/63] libmount: improve MS_REC usage
libmount allows to split one library (mount(8)) call to multiple mount(2)
syscalls, for example
--rbind --make-rslave
in this case we have to be careful with MS_REC because the flag is
applied to multiple operations.
# strace -e mount mount --rbind --make-rslave /mnt/A /mnt/B
Old version:
mount("/mnt/A", "/mnt/B", 0x13ecac0, MS_MGC_VAL|MS_BIND, NULL) = 0
mount("none", "/mnt/B", NULL, MS_REC|MS_SLAVE, NULL) = 0
Fixed version:
mount("/mnt/A", "/mnt/B", 0x1f22ac0, MS_MGC_VAL|MS_BIND|MS_REC, NULL) = 0
mount("none", "/mnt/B", NULL, MS_REC|MS_SLAVE, NULL) = 0
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1946921
Upstream: http://github.com/karelzak/util-linux/commit/816773b475900909d42c2c8282a6ac50252cac22
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/context.c | 5 +++++
libmount/src/context_mount.c | 25 ++++++++++++++++++++++---
libmount/src/optstr.c | 9 ++++++---
3 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/libmount/src/context.c b/libmount/src/context.c
index e7f1ee934..8e00b75a9 100644
--- a/libmount/src/context.c
+++ b/libmount/src/context.c
@@ -1375,6 +1375,11 @@ struct libmnt_lock *mnt_context_get_lock(struct libmnt_context *cxt)
*
* both of these calls have the same effect.
*
+ * Be careful if you want to use MS_REC flag -- in this case the bit is applied
+ * to all bind/slave/etc. options. If you want to mix more propadation flags
+ * and/or bind, move operations than it's better to specify mount options by
+ * strings.
+ *
* Returns: 0 on success, negative number in case of error.
*/
int mnt_context_set_mflags(struct libmnt_context *cxt, unsigned long flags)
diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c
index b88e60507..a8e84127c 100644
--- a/libmount/src/context_mount.c
+++ b/libmount/src/context_mount.c
@@ -73,6 +73,7 @@ static int init_propagation(struct libmnt_context *cxt)
char *opts = (char *) mnt_fs_get_vfs_options(cxt->fs);
size_t namesz;
struct libmnt_optmap const *maps[1];
+ int rec_count = 0;
if (!opts)
return 0;
@@ -86,9 +87,19 @@ static int init_propagation(struct libmnt_context *cxt)
struct libmnt_addmount *ad;
int rc;
- if (!mnt_optmap_get_entry(maps, 1, name, namesz, &ent)
- || !ent
- || !(ent->id & MS_PROPAGATION))
+ if (!mnt_optmap_get_entry(maps, 1, name, namesz, &ent) || !ent)
+ continue;
+
+ DBG(CXT, ul_debugobj(cxt, " checking %s", ent->name));
+
+ /* Note that MS_REC may be used for more flags, so we have to keep
+ * track about number of recursive options to keep the MS_REC in the
+ * mountflags if necessary.
+ */
+ if (ent->id & MS_REC)
+ rec_count++;
+
+ if (!(ent->id & MS_PROPAGATION))
continue;
ad = mnt_new_addmount();
@@ -96,13 +107,21 @@ static int init_propagation(struct libmnt_context *cxt)
return -ENOMEM;
ad->mountflags = ent->id;
+ DBG(CXT, ul_debugobj(cxt, " adding extra mount(2) call for %s", ent->name));
rc = mnt_context_append_additional_mount(cxt, ad);
if (rc)
return rc;
+ DBG(CXT, ul_debugobj(cxt, " removing %s from primary mount(2) call", ent->name));
cxt->mountflags &= ~ent->id;
+
+ if (ent->id & MS_REC)
+ rec_count--;
}
+ if (rec_count)
+ cxt->mountflags |= MS_REC;
+
return 0;
}
diff --git a/libmount/src/optstr.c b/libmount/src/optstr.c
index 8248f0dee..cc077ffd9 100644
--- a/libmount/src/optstr.c
+++ b/libmount/src/optstr.c
@@ -800,14 +800,17 @@ int mnt_optstr_apply_flags(char **optstr, unsigned long flags,
if (rc)
goto err;
}
- if (!(ent->mask & MNT_INVERT))
+ if (!(ent->mask & MNT_INVERT)) {
fl &= ~ent->id;
+ if (ent->id & MS_REC)
+ fl |= MS_REC;
+ }
}
}
}
- /* add missing options */
- if (fl) {
+ /* add missing options (but ignore fl if contains MS_REC only) */
+ if (fl && fl != MS_REC) {
const struct libmnt_optmap *ent;
char *p;
--
2.31.1

View File

@ -0,0 +1,49 @@
From 84009d2236c73efe7dc4b74372734d5b3306670b Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 5 Sep 2018 11:51:22 +0200
Subject: [PATCH 64/72] script: be sensitive to another SIGCHLD ssi_codes
The current signalfd handler cares on CLD_EXITED only. It's pretty
insufficient as there is more situations (and codes) when child no
more running.
Addresses: https://github.com/karelzak/util-linux/issues/686
Upstream: http://github.com/util-linux/util-linux/commit/27afe5016842c22d256ea9f88b598d637ca0df84
Signed-off-by: Karel Zak <kzak@redhat.com>
---
term-utils/script.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/term-utils/script.c b/term-utils/script.c
index d5ffa27f1..ff5f808de 100644
--- a/term-utils/script.c
+++ b/term-utils/script.c
@@ -402,10 +402,15 @@ static void handle_signal(struct script_control *ctl, int fd)
switch (info.ssi_signo) {
case SIGCHLD:
- DBG(SIGNAL, ul_debug(" get signal SIGCHLD"));
- if (info.ssi_code == CLD_EXITED) {
+ DBG(SIGNAL, ul_debug(" get signal SIGCHLD [ssi_code=%d, ssi_status=%d]",
+ info.ssi_code, info.ssi_status));
+ if (info.ssi_code == CLD_EXITED
+ || info.ssi_code == CLD_KILLED
+ || info.ssi_code == CLD_DUMPED) {
wait_for_child(ctl, 0);
ctl->poll_timeout = 10;
+
+ /* In case of ssi_code is CLD_TRAPPED, CLD_STOPPED, or CLD_CONTINUED */
} else if (info.ssi_status == SIGSTOP && ctl->child) {
DBG(SIGNAL, ul_debug(" child stop by SIGSTOP -- stop parent too"));
kill(getpid(), SIGSTOP);
@@ -433,6 +438,7 @@ static void handle_signal(struct script_control *ctl, int fd)
default:
abort();
}
+ DBG(SIGNAL, ul_debug("signal handle on FD %d done", fd));
}
static void do_io(struct script_control *ctl)
--
2.31.1

View File

@ -0,0 +1,60 @@
From be29de8b5dfe15972455d25e15068dc31d4376ac Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 6 May 2020 13:32:46 +0200
Subject: [PATCH 65/72] libfdisk: fix partition calculation for BLKPG_* ioctls
The include/partx.h interface we use in util-linux uses 512-byte
sectors, but libfdisk uses real sector sizes.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2016229
Upstream: http://github.com/util-linux/util-linux/commit/6a4d53ce6466fc97c0ee13846cd1bf7bdd7bfef0
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libfdisk/src/context.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c
index 779a9a889..fe7eb9e7e 100644
--- a/libfdisk/src/context.c
+++ b/libfdisk/src/context.c
@@ -813,6 +813,7 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org)
struct fdisk_partition **rem = NULL, **add = NULL, **upd = NULL;
int change, rc = 0, err = 0;
size_t nparts, i, nadds = 0, nupds = 0, nrems = 0;
+ unsigned int ssf;
DBG(CXT, ul_debugobj(cxt, "rereading changes"));
@@ -845,6 +846,9 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org)
goto done;
}
+ /* sector size factor -- used to recount from real to 512-byte sectors */
+ ssf = cxt->sector_size / 512;
+
for (i = 0; i < nrems; i++) {
pa = rem[i];
DBG(PART, ul_debugobj(pa, "#%zu calling BLKPG_DEL_PARTITION", pa->partno));
@@ -856,7 +860,8 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org)
for (i = 0; i < nupds; i++) {
pa = upd[i];
DBG(PART, ul_debugobj(pa, "#%zu calling BLKPG_RESIZE_PARTITION", pa->partno));
- if (partx_resize_partition(cxt->dev_fd, pa->partno + 1, pa->start, pa->size) != 0) {
+ if (partx_resize_partition(cxt->dev_fd, pa->partno + 1,
+ pa->start * ssf, pa->size * ssf) != 0) {
fdisk_warn(cxt, _("Failed to update system information about partition %zu"), pa->partno + 1);
err++;
}
@@ -864,7 +869,8 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org)
for (i = 0; i < nadds; i++) {
pa = add[i];
DBG(PART, ul_debugobj(pa, "#%zu calling BLKPG_ADD_PARTITION", pa->partno));
- if (partx_add_partition(cxt->dev_fd, pa->partno + 1, pa->start, pa->size) != 0) {
+ if (partx_add_partition(cxt->dev_fd, pa->partno + 1,
+ pa->start * ssf, pa->size * ssf) != 0) {
fdisk_warn(cxt, _("Failed to add partition %zu to system"), pa->partno + 1);
err++;
}
--
2.31.1

View File

@ -0,0 +1,48 @@
From aecaffc55dd763c34f61937b2047f0aaaeb4e6fc Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 6 Aug 2020 11:32:33 +0200
Subject: [PATCH 66/74] libfdisk: fix fdisk_reread_changes() for extended
partitions
Linux kernel assumes only 1KiB extended partition to avoid overlapping
with nested logical partitions. We need to follow this rule for
BLKPG_ADD_PARTITION.
Addresses: https://github.com/karelzak/util-linux/issues/1112
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2041498
Upstream: http://github.com/util-linux/util-linux/commit/33f50706fd7c1c5e53f8f355f12b685c6935f5a4
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libfdisk/src/context.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c
index fe7eb9e7e..114101980 100644
--- a/libfdisk/src/context.c
+++ b/libfdisk/src/context.c
@@ -867,10 +867,21 @@ int fdisk_reread_changes(struct fdisk_context *cxt, struct fdisk_table *org)
}
}
for (i = 0; i < nadds; i++) {
+ uint64_t sz;
+
pa = add[i];
+ sz = pa->size * ssf;
+
DBG(PART, ul_debugobj(pa, "#%zu calling BLKPG_ADD_PARTITION", pa->partno));
+
+ if (fdisk_is_label(cxt, DOS) && fdisk_partition_is_container(pa))
+ /* Let's follow the Linux kernel and reduce
+ * DOS extended partition to 1 or 2 sectors.
+ */
+ sz = min(sz, (uint64_t) 2);
+
if (partx_add_partition(cxt->dev_fd, pa->partno + 1,
- pa->start * ssf, pa->size * ssf) != 0) {
+ pa->start * ssf, sz) != 0) {
fdisk_warn(cxt, _("Failed to add partition %zu to system"), pa->partno + 1);
err++;
}
--
2.31.1

View File

@ -0,0 +1,76 @@
From 7cc5bcfcb2340266a6b42370c9c4c02d8a325d5f Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 21 Oct 2021 18:47:40 +0200
Subject: [PATCH 67/74] logger: fix --size use for stdin
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The stdin version counts log header into the message size, but
for example when it reads message from argv[] it counts only message
itself.
$ logger --stderr --size 3 "abcd"
<13>Oct 21 18:48:29 kzak: abc
$ echo "abcd" | logger --stderr --size 3
logger: cannot allocate 18446744073709551597 bytes: Cannot allocate memory
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2011602
Upstream: http://github.com/util-linux/util-linux/commit/58e4ee082bca100034791a4a74481f263bb30a25
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/logger.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)
diff --git a/misc-utils/logger.c b/misc-utils/logger.c
index ebdc56ec2..c20ef05f1 100644
--- a/misc-utils/logger.c
+++ b/misc-utils/logger.c
@@ -957,11 +957,9 @@ static void logger_stdin(struct logger_ctl *ctl)
* update header timestamps and to reflect possible priority changes.
* The initial header is generated by logger_open().
*/
- int has_header = 1;
int default_priority = ctl->pri;
int last_pri = default_priority;
- size_t max_usrmsg_size = ctl->max_message_size - strlen(ctl->hdr);
- char *const buf = xmalloc(max_usrmsg_size + 2 + 2);
+ char *buf = xmalloc(ctl->max_message_size + 2 + 2);
int pri;
int c;
size_t i;
@@ -988,27 +986,21 @@ static void logger_stdin(struct logger_ctl *ctl)
ctl->pri = default_priority;
if (ctl->pri != last_pri) {
- has_header = 0;
- max_usrmsg_size =
- ctl->max_message_size - strlen(ctl->hdr);
+ generate_syslog_header(ctl);
last_pri = ctl->pri;
}
if (c != EOF && c != '\n')
c = getchar();
}
- while (c != EOF && c != '\n' && i < max_usrmsg_size) {
+ while (c != EOF && c != '\n' && i < ctl->max_message_size) {
buf[i++] = c;
c = getchar();
}
buf[i] = '\0';
- if (i > 0 || !ctl->skip_empty_lines) {
- if (!has_header)
- generate_syslog_header(ctl);
+ if (i > 0 || !ctl->skip_empty_lines)
write_output(ctl, buf);
- has_header = 0;
- }
if (c == '\n') /* discard line terminator */
c = getchar();
--
2.31.1

View File

@ -0,0 +1,32 @@
From ebb628f8b6e9564c036fce152f67512e5755dcfc Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 6 Dec 2021 13:20:37 +0100
Subject: [PATCH 68/74] fstrim: improve timer setting
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1916151
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/fstrim.timer | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sys-utils/fstrim.timer b/sys-utils/fstrim.timer
index 3a3762d5c..54b3c18f5 100644
--- a/sys-utils/fstrim.timer
+++ b/sys-utils/fstrim.timer
@@ -1,11 +1,13 @@
[Unit]
Description=Discard unused blocks once a week
Documentation=man:fstrim
+ConditionVirtualization=!container
[Timer]
OnCalendar=weekly
AccuracySec=1h
Persistent=true
+RandomizedDelaySec=6000
[Install]
WantedBy=timers.target
--
2.31.1

View File

@ -0,0 +1,185 @@
From 0b421290e05862e1abbb5a82654bd2de9829dd58 Mon Sep 17 00:00:00 2001
From: Patrick Steinhardt <ps@pks.im>
Date: Tue, 10 Apr 2018 12:08:21 +0100
Subject: [PATCH 69/74] setpriv: implement option to set parent death signal
When a process uses the syscall `prctl(PR_SET_PDEATHSIG, ...)`, it will
get notified with a process-defined signal as soon as its parent process
dies. This is for example being used by unshare(1)'s recently added
"--kill-child" option, causing the forked child to be killed as soon as
unshare itself dies.
Unfortunately, some LSMs will cause the parent death signal to be reset
when a process changes credentials, with the most important ones being
SELinux and AppArmor. The following command will thus not work as
expected:
unshare --fork --kill-child setpriv --reuid user <executable>
As soon as setpriv changes UID, the parent death signal is cleared and
the child will never get signalled when unshare gets killed.
Add a new option "--pdeathsig keep|clear|<signal>". Setting this flag
will cause us to either
- restore the previously active parent death signal as soon as the
setpriv has applied all credential changes
- clear the parent death signal
- set the parent death signal to "<signal>"
Furthermore, print out the currently set signal when dumping process
state.
[kzak@redhat.com: - small changes in codding style]
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1894192
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/setpriv.1 | 6 ++++++
sys-utils/setpriv.c | 49 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 55 insertions(+)
diff --git a/sys-utils/setpriv.1 b/sys-utils/setpriv.1
index b900f6e08..f989bf33c 100644
--- a/sys-utils/setpriv.1
+++ b/sys-utils/setpriv.1
@@ -139,6 +139,12 @@ is cleared by
.BR execve (2)
and is therefore not allowed.
.TP
+.BR "\-\-pdeathsig keep" | clear | <signal>
+Keep, clear or set the parent death signal. Some LSMs, most notably SELinux and
+AppArmor, clear the signal when the process' credentials change. Using
+\fB--pdeathsig keep\fR will restore the parent death signal after changing
+credentials to remedy that situation.
+.TP
.BI \-\-selinux\-label " label"
Request a particular SELinux transition (using a transition on exec, not
dyntrans). This will fail and cause
diff --git a/sys-utils/setpriv.c b/sys-utils/setpriv.c
index 4147978cc..0d3a3b3c9 100644
--- a/sys-utils/setpriv.c
+++ b/sys-utils/setpriv.c
@@ -38,6 +38,7 @@
#include "strutils.h"
#include "xalloc.h"
#include "pathnames.h"
+#include "signames.h"
#ifndef PR_SET_NO_NEW_PRIVS
# define PR_SET_NO_NEW_PRIVS 38
@@ -102,6 +103,8 @@ struct privctx {
/* securebits */
int securebits;
+ /* parent death signal (<0 clear, 0 nothing, >0 signal) */
+ int pdeathsig;
/* LSMs */
const char *selinux_label;
@@ -135,6 +138,8 @@ static void __attribute__((__noreturn__)) usage(void)
fputs(_(" --init-groups initialize supplementary groups\n"), out);
fputs(_(" --groups <group,...> set supplementary groups\n"), out);
fputs(_(" --securebits <bits> set securebits\n"), out);
+ fputs(_(" --pdeathsig keep|clear|<signame>\n"
+ " set or clear parent death signal\n"), out);
fputs(_(" --selinux-label <label> set SELinux label\n"), out);
fputs(_(" --apparmor-profile <pr> set AppArmor profile\n"), out);
@@ -329,6 +334,24 @@ static void dump_groups(void)
free(groups);
}
+static void dump_pdeathsig(void)
+{
+ int pdeathsig;
+
+ if (prctl(PR_GET_PDEATHSIG, &pdeathsig) != 0) {
+ warn(_("get pdeathsig failed"));
+ return;
+ }
+
+ printf("Parent death signal: ");
+ if (pdeathsig && signum_to_signame(pdeathsig) != NULL)
+ printf("%s\n", signum_to_signame(pdeathsig));
+ else if (pdeathsig)
+ printf("%d\n", pdeathsig);
+ else
+ printf("[none]\n");
+}
+
static void dump(int dumplevel)
{
int x;
@@ -392,6 +415,7 @@ static void dump(int dumplevel)
printf("\n");
dump_securebits();
+ dump_pdeathsig();
if (access(_PATH_SYS_SELINUX, F_OK) == 0)
dump_label(_("SELinux label"));
@@ -438,6 +462,19 @@ static void parse_groups(struct privctx *opts, const char *str)
free(groups);
}
+static void parse_pdeathsig(struct privctx *opts, const char *str)
+{
+ if (!strcmp(str, "keep")) {
+ if (prctl(PR_GET_PDEATHSIG, &opts->pdeathsig) != 0)
+ errx(SETPRIV_EXIT_PRIVERR,
+ _("failed to get parent death signal"));
+ } else if (!strcmp(str, "clear")) {
+ opts->pdeathsig = -1;
+ } else if ((opts->pdeathsig = signame_to_signum(str)) < 0) {
+ errx(EXIT_FAILURE, _("unknown signal: %s"), str);
+ }
+}
+
static void do_setresuid(const struct privctx *opts)
{
uid_t ruid, euid, suid;
@@ -711,6 +748,7 @@ int main(int argc, char **argv)
LISTCAPS,
CAPBSET,
SECUREBITS,
+ PDEATHSIG,
SELINUX_LABEL,
APPARMOR_PROFILE
};
@@ -734,6 +772,7 @@ int main(int argc, char **argv)
{ "groups", required_argument, NULL, GROUPS },
{ "bounding-set", required_argument, NULL, CAPBSET },
{ "securebits", required_argument, NULL, SECUREBITS },
+ { "pdeathsig", required_argument, NULL, PDEATHSIG, },
{ "selinux-label", required_argument, NULL, SELINUX_LABEL },
{ "apparmor-profile", required_argument, NULL, APPARMOR_PROFILE },
{ "help", no_argument, NULL, 'h' },
@@ -844,6 +883,12 @@ int main(int argc, char **argv)
_("duplicate --groups option"));
parse_groups(&opts, optarg);
break;
+ case PDEATHSIG:
+ if (opts.pdeathsig)
+ errx(EXIT_FAILURE,
+ _("duplicate --keep-pdeathsig option"));
+ parse_pdeathsig(&opts, optarg);
+ break;
case LISTCAPS:
list_caps = 1;
break;
@@ -989,6 +1034,10 @@ int main(int argc, char **argv)
do_caps(CAP_TYPE_AMBIENT, opts.ambient_caps);
}
+ /* Clear or set parent death signal */
+ if (opts.pdeathsig && prctl(PR_SET_PDEATHSIG, opts.pdeathsig < 0 ? 0 : opts.pdeathsig) != 0)
+ err(SETPRIV_EXIT_PRIVERR, _("set parent death signal failed"));
+
execvp(argv[optind], argv + optind);
errexec(argv[optind]);
}
--
2.31.1

View File

@ -0,0 +1,86 @@
From 0db1f9965e6791c651d0bccd095cbe3a87c6579c Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 25 Nov 2021 11:52:46 +0100
Subject: [PATCH 70/74] lib/sys: add sysfs_chrdev_devno_to_devname()
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2026511
Upstream: http://github.com/util-linux/util-linux/commit/ab5304a7a34bfa45d9bee205ca4e26f03db6e79d
Signed-off-by: Karel Zak <kzak@redhat.com>
---
include/pathnames.h | 1 +
include/sysfs.h | 2 ++
lib/sysfs.c | 33 +++++++++++++++++++++++++++++++++
3 files changed, 36 insertions(+)
diff --git a/include/pathnames.h b/include/pathnames.h
index 59cc66736..77f8b6e85 100644
--- a/include/pathnames.h
+++ b/include/pathnames.h
@@ -102,6 +102,7 @@
#define _PATH_SYS_BLOCK "/sys/block"
#define _PATH_SYS_DEVBLOCK "/sys/dev/block"
+#define _PATH_SYS_DEVCHAR "/sys/dev/char"
#define _PATH_SYS_CLASS "/sys/class"
#define _PATH_SYS_SCSI "/sys/bus/scsi"
diff --git a/include/sysfs.h b/include/sysfs.h
index 9a72a2009..e2fd0c1ba 100644
--- a/include/sysfs.h
+++ b/include/sysfs.h
@@ -92,6 +92,8 @@ extern int sysfs_scsi_host_is(struct sysfs_cxt *cxt, const char *type);
extern int sysfs_scsi_has_attribute(struct sysfs_cxt *cxt, const char *attr);
extern int sysfs_scsi_path_contains(struct sysfs_cxt *cxt, const char *pattern);
+extern char *sysfs_chrdev_devno_to_devname(dev_t devno, char *buf, size_t bufsiz);
+
/**
* sysfs_devname_sys_to_dev:
* @name: devname to be converted in place
diff --git a/lib/sysfs.c b/lib/sysfs.c
index e5437f43a..ceec41d10 100644
--- a/lib/sysfs.c
+++ b/lib/sysfs.c
@@ -1036,6 +1036,39 @@ int sysfs_scsi_path_contains(struct sysfs_cxt *cxt, const char *pattern)
return strstr(linkc, pattern) != NULL;
}
+char *sysfs_chrdev_devno_to_devname(dev_t devno, char *buf, size_t bufsiz)
+{
+ char link[PATH_MAX];
+ char path[PATH_MAX];
+ char *name;
+ ssize_t sz;
+
+ sz = snprintf(path, sizeof(path),
+ _PATH_SYS_DEVCHAR "/%u:%u", major(devno), minor(devno));
+ if (sz <= 0)
+ return NULL;
+
+ /* read /sys/dev/char/<maj:min> link */
+ sz = readlink(path, link, sizeof(link) - 1);
+ if (sz < 0)
+ return NULL;
+ link[sz] = '\0';
+
+ name = strrchr(link, '/');
+ if (!name)
+ return NULL;
+
+ name++;
+ sz = strlen(name);
+ if ((size_t) sz + 1 > bufsiz)
+ return NULL;
+
+ memcpy(buf, name, sz + 1);
+ sysfs_devname_sys_to_dev(buf);
+ return buf;
+
+}
+
#ifdef TEST_PROGRAM_SYSFS
#include <errno.h>
#include <err.h>
--
2.31.1

View File

@ -0,0 +1,39 @@
From 7ce318610afcbb793e438332687c2f09844a86c2 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 25 Nov 2021 11:54:11 +0100
Subject: [PATCH 71/74] libblkid: check UBI char device name
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2026511
Upstream: http://github.com/util-linux/util-linux/commit/7eb6d9ce4526b968e30f7e538cbbbdf9938e5891
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/probe.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c
index a6dc8416a..49a62c47f 100644
--- a/libblkid/src/probe.c
+++ b/libblkid/src/probe.c
@@ -915,9 +915,17 @@ int blkid_probe_set_device(blkid_probe pr, int fd,
DBG(LOWPROBE, ul_debug("failed to get device size"));
goto err;
}
- } else if (S_ISCHR(sb.st_mode))
+ } else if (S_ISCHR(sb.st_mode)) {
+ char buf[PATH_MAX];
+
+ if (!sysfs_chrdev_devno_to_devname(sb.st_rdev, buf, sizeof(buf))
+ || strncmp(buf, "ubi", 3) != 0) {
+ DBG(LOWPROBE, ul_debug("no UBI char device"));
+ errno = EINVAL;
+ goto err;
+ }
devsiz = 1; /* UBI devices are char... */
- else if (S_ISREG(sb.st_mode))
+ } else if (S_ISREG(sb.st_mode))
devsiz = sb.st_size; /* regular file */
pr->size = size ? (uint64_t)size : devsiz;
--
2.31.1

View File

@ -0,0 +1,63 @@
From 90783d6294351229efdee5469dd8cd08d0057731 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 25 Nov 2021 11:54:26 +0100
Subject: [PATCH 72/74] blkid: check device type and name before probe
For calls "blkid /dev/*", it seems better to check the
device type and name before we open the device in libblkid.
Upstream: http://github.com/util-linux/util-linux/commit/64cfe6ac37631a6347bd4005c72dd2d37e737f5e
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2026511
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/blkid.c | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c
index 61a6994c2..bd4ce4a39 100644
--- a/misc-utils/blkid.c
+++ b/misc-utils/blkid.c
@@ -46,6 +46,8 @@
#define XALLOC_EXIT_CODE BLKID_EXIT_OTHER /* x.*alloc(), xstrndup() */
#include "xalloc.h"
+#include "sysfs.h"
+
struct blkid_control {
int output;
uintmax_t offset;
@@ -813,8 +815,29 @@ int main(int argc, char **argv)
/* The rest of the args are device names */
if (optind < argc) {
devices = xcalloc(argc - optind, sizeof(char *));
- while (optind < argc)
- devices[numdev++] = argv[optind++];
+ while (optind < argc) {
+ char *dev = argv[optind++];
+ struct stat sb;
+
+ if (stat(dev, &sb) != 0)
+ continue;
+ else if (S_ISBLK(sb.st_mode))
+ ;
+ else if (S_ISREG(sb.st_mode))
+ ;
+ else if (S_ISCHR(sb.st_mode)) {
+ char buf[PATH_MAX];
+
+ if (!sysfs_chrdev_devno_to_devname(
+ sb.st_rdev, buf, sizeof(buf)))
+ continue;
+ if (strncmp(buf, "ubi", 3) != 0)
+ continue;
+ } else
+ continue;
+
+ devices[numdev++] = dev;
+ }
}
/* convert LABEL/UUID lookup to evaluate request */
--
2.31.1

View File

@ -0,0 +1,40 @@
From aa57abc10273f250a7ab6525bd45dc2bdc5e4b41 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 10 Jan 2022 16:32:44 +0100
Subject: [PATCH 73/74] blkid: don't print all devices if only garbage
specified
There is small regression. The old version (before
64cfe6ac37631a6347bd4005c72dd2d37e737f5e) returns nothing when
# blkid /dontexist
specified on command line.
Upstream: http://github.com/util-linux/util-linux/commit/9e882685a3db3fd5e0870e7b94a4ea25ddc199c7
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2026511
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/blkid.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/misc-utils/blkid.c b/misc-utils/blkid.c
index bd4ce4a39..bc0d3465d 100644
--- a/misc-utils/blkid.c
+++ b/misc-utils/blkid.c
@@ -838,6 +838,12 @@ int main(int argc, char **argv)
devices[numdev++] = dev;
}
+
+ if (!numdev) {
+ /* only unsupported devices specified */
+ err = BLKID_EXIT_NOTFOUND;
+ goto exit;
+ }
}
/* convert LABEL/UUID lookup to evaluate request */
--
2.31.1

View File

@ -0,0 +1,54 @@
From 9e7cedda86e5356d1723e6bd0bab5e38c4fe4a34 Mon Sep 17 00:00:00 2001
From: "Andrew G. Morgan" <morgan@kernel.org>
Date: Sat, 27 Nov 2021 21:00:22 -0800
Subject: [PATCH 74/74] Complete Linux-PAM compliance for forked child in su
and login.
As documented here:
http://www.linux-pam.org/Linux-PAM-html/adg-interface-by-app-expected.html#adg-pam_end
The child that is about to exec*() the user shell is supposed to pam_end()
with PAM_DATA_SILENT. This gives the modules a last chance to do a minor
cleanup of the module state before the user's shell is launched.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1950187
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2033566
Upstream: http://github.com/util-linux/util-linux/commit/4660286e9cdff6d95b49295674b96f83af10ea36
Signed-off-by: Andrew G. Morgan <morgan@kernel.org>
---
login-utils/login.c | 3 +++
login-utils/su-common.c | 3 +++
2 files changed, 6 insertions(+)
diff --git a/login-utils/login.c b/login-utils/login.c
index 8c9e43292..9f50fe03b 100644
--- a/login-utils/login.c
+++ b/login-utils/login.c
@@ -1370,6 +1370,9 @@ int main(int argc, char **argv)
childArgv[childArgc++] = NULL;
+ /* http://www.linux-pam.org/Linux-PAM-html/adg-interface-by-app-expected.html#adg-pam_end */
+ (void) pam_end(cxt.pamh, PAM_SUCCESS|PAM_DATA_SILENT);
+
execvp(childArgv[0], childArgv + 1);
if (!strcmp(childArgv[0], "/bin/sh"))
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
index c1b1a04e4..825ff1d5a 100644
--- a/login-utils/su-common.c
+++ b/login-utils/su-common.c
@@ -1428,6 +1428,9 @@ int su_main(int argc, char **argv, int mode)
if (su->simulate_login && chdir(su->pwd->pw_dir) != 0)
warn(_("warning: cannot change directory to %s"), su->pwd->pw_dir);
+ /* http://www.linux-pam.org/Linux-PAM-html/adg-interface-by-app-expected.html#adg-pam_end */
+ (void) pam_end(su->pamh, PAM_SUCCESS|PAM_DATA_SILENT);
+
if (shell)
run_shell(su, shell, command, argv + optind, max(0, argc - optind));
--
2.31.1

View File

@ -0,0 +1,109 @@
From 97a5abd36eeab4e07a31b27f6a2c2078d42e2e33 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 8 Mar 2022 11:40:58 +0100
Subject: lib/loopdev: retry LOOP_SET_STATUS64 and LOOP_SET_BLOCK_SIZE on
EAGAIN
Upstream: http://github.com/util-linux/util-linux/commit/0ae7bb11c29aa11c8ef25b1ef2f82ee4701b856d
Upstream: http://github.com/util-linux/util-linux/commit/eab90ef8d4f66394285e0cff1dfc0a27242c05aa
Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=2058176
Signed-off-by: Karel Zak <kzak@redhat.com>
---
lib/loopdev.c | 42 +++++++++++++++++++++++++++++++++++++-----
1 file changed, 37 insertions(+), 5 deletions(-)
diff --git a/lib/loopdev.c b/lib/loopdev.c
index 54d337ea3..48af82aef 100644
--- a/lib/loopdev.c
+++ b/lib/loopdev.c
@@ -42,6 +42,8 @@
#include "blkdev.h"
#include "debug.h"
+#define LOOPDEV_MAX_TRIES 10
+
/*
* Debug stuff (based on include/debug.h)
*/
@@ -1260,6 +1262,7 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
{
int file_fd, dev_fd, mode = O_RDWR, rc = -1, cnt = 0;
int errsv = 0;
+ int err, again;
if (!lc || !*lc->device || !lc->filename)
return -EINVAL;
@@ -1331,7 +1334,17 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
DBG(SETUP, ul_debugobj(lc, "LOOP_SET_FD: OK"));
- if (ioctl(dev_fd, LOOP_SET_STATUS64, &lc->info)) {
+ cnt = 0;
+ do {
+ err = ioctl(dev_fd, LOOP_SET_STATUS64, &lc->info);
+ again = err && errno == EAGAIN;
+ if (again) {
+ xusleep(250000);
+ cnt++;
+ }
+ } while (again && cnt <= LOOPDEV_MAX_TRIES);
+
+ if (err) {
rc = -errno;
errsv = errno;
DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64 failed: %m"));
@@ -1376,7 +1389,7 @@ err:
*/
int loopcxt_set_status(struct loopdev_cxt *lc)
{
- int dev_fd, rc = -1;
+ int dev_fd, rc = -1, err, again, tries = 0;
errno = 0;
dev_fd = loopcxt_get_fd(lc);
@@ -1387,7 +1400,16 @@ int loopcxt_set_status(struct loopdev_cxt *lc)
}
DBG(SETUP, ul_debugobj(lc, "device open: OK"));
- if (ioctl(dev_fd, LOOP_SET_STATUS64, &lc->info)) {
+ do {
+ err = ioctl(dev_fd, LOOP_SET_STATUS64, &lc->info);
+ again = err && errno == EAGAIN;
+ if (again) {
+ xusleep(250000);
+ tries++;
+ }
+ } while (again && tries <= LOOPDEV_MAX_TRIES);
+
+ if (err) {
rc = -errno;
DBG(SETUP, ul_debugobj(lc, "LOOP_SET_STATUS64 failed: %m"));
return rc;
@@ -1440,12 +1462,22 @@ int loopcxt_set_dio(struct loopdev_cxt *lc, unsigned long use_dio)
int loopcxt_set_blocksize(struct loopdev_cxt *lc, uint64_t blocksize)
{
int fd = loopcxt_get_fd(lc);
+ int err, again, tries = 0;
if (fd < 0)
return -EINVAL;
- /* Kernels prior to v4.14 don't support this ioctl */
- if (ioctl(fd, LOOP_SET_BLOCK_SIZE, (unsigned long) blocksize) < 0) {
+ do {
+ /* Kernels prior to v4.14 don't support this ioctl */
+ err = ioctl(fd, LOOP_SET_BLOCK_SIZE, (unsigned long) blocksize);
+ again = err && errno == EAGAIN;
+ if (again) {
+ xusleep(250000);
+ tries++;
+ }
+ } while (again && tries <= LOOPDEV_MAX_TRIES);
+
+ if (err) {
int rc = -errno;
DBG(CXT, ul_debugobj(lc, "LOOP_SET_BLOCK_SIZE failed: %m"));
return rc;
--
2.34.1

1
EMPTY
View File

@ -1 +0,0 @@

2
adjtime Normal file
View File

@ -0,0 +1,2 @@
0.0 0 0.0
0

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (util-linux-2.32.1.tar.xz) = 267fedae24a874ee4dc558081f6b8d07b33b955b0635f3348f021c111c17f2e95c01b2cbf909fe13c6ca448cbcf23c658c75f72f25749aa65e99f68fabb94698

8
util-linux-60-raw.rules Normal file
View File

@ -0,0 +1,8 @@
#
# Enter raw device bindings here.
#
# An example would be:
# ACTION=="add", KERNEL=="sda", RUN+="/usr/bin/raw /dev/raw/raw1 %N"
# to bind /dev/raw/raw1 to /dev/sda, or
# ACTION=="add", ENV{MAJOR}=="8", ENV{MINOR}=="1", RUN+="/usr/bin/raw /dev/raw/raw2 %M %m"
# to bind /dev/raw/raw2 to the device with major 8, minor 1.

View File

@ -0,0 +1,6 @@
#%PAM-1.0
auth sufficient pam_rootok.so
auth include system-auth
account include system-auth
password include system-auth
session include system-auth

17
util-linux-login.pamd Normal file
View File

@ -0,0 +1,17 @@
#%PAM-1.0
auth substack system-auth
auth include postlogin
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so

15
util-linux-remote.pamd Normal file
View File

@ -0,0 +1,15 @@
#%PAM-1.0
auth substack password-auth
auth include postlogin
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin

View File

@ -0,0 +1,5 @@
#%PAM-1.0
auth include runuser
session optional pam_keyinit.so force revoke
-session optional pam_systemd.so
session include runuser

5
util-linux-runuser.pamd Normal file
View File

@ -0,0 +1,5 @@
#%PAM-1.0
auth sufficient pam_rootok.so
session optional pam_keyinit.so revoke
session required pam_limits.so
session required pam_unix.so

6
util-linux-su-l.pamd Normal file
View File

@ -0,0 +1,6 @@
#%PAM-1.0
auth include su
account include su
password include su
session optional pam_keyinit.so force revoke
session include su

15
util-linux-su.pamd Normal file
View File

@ -0,0 +1,15 @@
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so

3282
util-linux.spec Normal file

File diff suppressed because it is too large Load Diff