!171 util-linux: upgrade to 2.39.1

From: @zhang-yao-2022 
Reviewed-by: @openeuler-basic 
Signed-off-by: @openeuler-basic
This commit is contained in:
openeuler-ci-bot 2023-07-20 02:44:39 +00:00 committed by Gitee
commit 5397bbec3c
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
92 changed files with 75 additions and 5180 deletions

View File

@ -1,34 +0,0 @@
From 72466ac801928c205604b99fe01f830809bda930 Mon Sep 17 00:00:00 2001
From: Liquor <lirui130@huawei.com>
Date: Thu, 17 Dec 2020 15:04:56 +0800
Subject: [PATCH] Add check to resolve uname26-version test failed
The uname command is modified in packages uname-build-checks,
but the uname26-version test case needs to use the uname -r query
result.As a result,the test fails.
So we add a judgment to check whether uname-build-checks is installed.
---
tests/ts/misc/setarch | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/tests/ts/misc/setarch b/tests/ts/misc/setarch
index 7c99cca..25d02c1 100755
--- a/tests/ts/misc/setarch
+++ b/tests/ts/misc/setarch
@@ -77,7 +77,12 @@ ts_finalize_subtest "$finmsg"
# conditional subtest
if [ "$uname26_seems_supported" = "yes" ]; then
ts_init_subtest uname26-version
- tmp=$($TS_CMD_SETARCH $ARCH --uname-2.6 uname -r)
+ rpm -qa | grep -q "uname-build-checks"
+ if [ $? -eq 0 ]; then
+ tmp=$($TS_CMD_SETARCH $ARCH --uname-2.6 uname.bin -r)
+ else
+ tmp=$($TS_CMD_SETARCH $ARCH --uname-2.6 uname -r)
+ fi
if echo "$tmp" | grep -q "^2\.6\."; then
echo "kernel version changed to 2.6" >> $TS_OUTPUT
else
--
2.27.0

View File

@ -8,11 +8,11 @@ Subject: [PATCH] unshare: SKIPPED (no root permissions)
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/ts/lsns/ioctl_ns b/tests/ts/lsns/ioctl_ns
index ef63606..a979893 100755
index 6f306d5..9d436c7 100755
--- a/tests/ts/lsns/ioctl_ns
+++ b/tests/ts/lsns/ioctl_ns
@@ -21,7 +21,7 @@ TS_DESC="ownership and hierarchy"
. $TS_TOPDIR/functions.sh
. "$TS_TOPDIR"/functions.sh
ts_init "$*"
-# ts_skip_nonroot
@ -21,5 +21,5 @@ index ef63606..a979893 100755
[ -r /proc/self/ns/user ] || ts_skip "no USER namespace kernel support"
--
2.27.0
2.33.0

View File

@ -1,138 +0,0 @@
From f3db9bd609494099f0c1b95231c5dfe383346929 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 24 Nov 2021 13:53:25 +0100
Subject: [PATCH] libmount: fix UID check for FUSE umount [CVE-2021-3995]
Improper UID check allows an unprivileged user to unmount FUSE
filesystems of users with similar UID.
Signed-off-by: Karel Zak <kzak@redhat.com>
Reference:https://github.com/util-linux/util-linux/commit/f3db9bd609494099f0c1b95231c5dfe383346929
Conflict:NA
---
include/strutils.h | 2 +-
libmount/src/context_umount.c | 13 +++--------
libmount/src/mountP.h | 1 +
libmount/src/optstr.c | 42 +++++++++++++++++++++++++++++++++++
4 files changed, 47 insertions(+), 11 deletions(-)
diff --git a/include/strutils.h b/include/strutils.h
index 4b3182f..50e493a 100644
--- a/include/strutils.h
+++ b/include/strutils.h
@@ -88,8 +88,8 @@ static inline char *mem2strcpy(char *dest, const void *src, size_t n, size_t nma
if (n + 1 > nmax)
n = nmax - 1;
+ memset(dest, '\0', nmax);
memcpy(dest, src, n);
- dest[nmax-1] = '\0';
return dest;
}
diff --git a/libmount/src/context_umount.c b/libmount/src/context_umount.c
index 94f824b..0d77fff 100644
--- a/libmount/src/context_umount.c
+++ b/libmount/src/context_umount.c
@@ -393,10 +393,7 @@ static int is_fuse_usermount(struct libmnt_context *cxt, int *errsv)
struct libmnt_ns *ns_old;
const char *type = mnt_fs_get_fstype(cxt->fs);
const char *optstr;
- char *user_id = NULL;
- size_t sz;
- uid_t uid;
- char uidstr[sizeof(stringify_value(ULONG_MAX))];
+ uid_t uid, entry_uid;
*errsv = 0;
@@ -414,10 +411,7 @@ static int is_fuse_usermount(struct libmnt_context *cxt, int *errsv)
if (!optstr)
return 0;
- if (mnt_optstr_get_option(optstr, "user_id", &user_id, &sz) != 0)
- return 0;
-
- if (sz == 0 || user_id == NULL)
+ if (mnt_optstr_get_uid(optstr, "user_id", &entry_uid) != 0)
return 0;
/* get current user */
@@ -434,8 +428,7 @@ static int is_fuse_usermount(struct libmnt_context *cxt, int *errsv)
return 0;
}
- snprintf(uidstr, sizeof(uidstr), "%lu", (unsigned long) uid);
- return strncmp(user_id, uidstr, sz) == 0;
+ return uid == entry_uid;
}
/*
diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h
index d8ba0ab..4a2ddb3 100644
--- a/libmount/src/mountP.h
+++ b/libmount/src/mountP.h
@@ -401,6 +401,7 @@ extern const struct libmnt_optmap *mnt_optmap_get_entry(
const struct libmnt_optmap **mapent);
/* optstr.c */
+extern int mnt_optstr_get_uid(const char *optstr, const char *name, uid_t *uid);
extern int mnt_optstr_remove_option_at(char **optstr, char *begin, char *end);
extern int mnt_optstr_fix_gid(char **optstr, char *value, size_t valsz, char **next);
extern int mnt_optstr_fix_uid(char **optstr, char *value, size_t valsz, char **next);
diff --git a/libmount/src/optstr.c b/libmount/src/optstr.c
index eea952b..8a92c32 100644
--- a/libmount/src/optstr.c
+++ b/libmount/src/optstr.c
@@ -1090,6 +1090,48 @@ int mnt_optstr_fix_user(char **optstr)
return rc;
}
+/*
+ * Converts value from @optstr addressed by @name to uid.
+ *
+ * Returns: 0 on success, 1 if not found, <0 on error
+ */
+int mnt_optstr_get_uid(const char *optstr, const char *name, uid_t *uid)
+{
+ char *value = NULL;
+ size_t valsz = 0;
+ char buf[sizeof(stringify_value(UINT64_MAX))];
+ int rc;
+ uint64_t num;
+
+ assert(optstr);
+ assert(name);
+ assert(uid);
+
+ rc = mnt_optstr_get_option(optstr, name, &value, &valsz);
+ if (rc != 0)
+ goto fail;
+
+ if (valsz > sizeof(buf) - 1) {
+ rc = -ERANGE;
+ goto fail;
+ }
+ mem2strcpy(buf, value, valsz, sizeof(buf));
+
+ rc = ul_strtou64(buf, &num, 10);
+ if (rc != 0)
+ goto fail;
+ if (num > ULONG_MAX || (uid_t) num != num) {
+ rc = -ERANGE;
+ goto fail;
+ }
+ *uid = (uid_t) num;
+
+ return 0;
+fail:
+ DBG(UTILS, ul_debug("failed to convert '%s'= to number [rc=%d]", name, rc));
+ return rc;
+}
+
/**
* mnt_match_options:
* @optstr: options string
--
2.27.0

View File

@ -1,226 +0,0 @@
From 018a10907fa9885093f6d87401556932c2d8bd2b Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 4 Jan 2022 10:54:20 +0100
Subject: [PATCH] libmount: fix (deleted) suffix issue [CVE-2021-3996]
This issue is related to parsing the /proc/self/mountinfo file allows an
unprivileged user to unmount other user's filesystems that are either
world-writable themselves or mounted in a world-writable directory.
The support for "(deleted)" is no more necessary as the Linux kernel does
not use it in /proc/self/mountinfo and /proc/self/mount files anymore.
Signed-off-by: Karel Zak <kzak@redhat.com>
Reference:https://github.com/util-linux/util-linux/commit/018a10907fa9885093f6d87401556932c2d8bd2b
Conflict:NA
---
libmount/src/tab_parse.c | 5 -----
tests/expected/findmnt/filter-options | 1 -
tests/expected/findmnt/filter-options-nameval-neg | 3 +--
tests/expected/findmnt/filter-types-neg | 1 -
tests/expected/findmnt/outputs-default | 3 +--
tests/expected/findmnt/outputs-force-tree | 3 +--
tests/expected/findmnt/outputs-kernel | 3 +--
tests/expected/libmount/tabdiff-mount | 1 -
tests/expected/libmount/tabdiff-move | 1 -
tests/expected/libmount/tabdiff-remount | 1 -
tests/expected/libmount/tabdiff-umount | 1 -
tests/expected/libmount/tabfiles-parse-mountinfo | 11 -----------
tests/expected/libmount/tabfiles-py-parse-mountinfo | 11 -----------
tests/ts/findmnt/files/mountinfo | 1 -
tests/ts/findmnt/files/mountinfo-nonroot | 1 -
tests/ts/libmount/files/mountinfo | 1 -
16 files changed, 4 insertions(+), 44 deletions(-)
diff --git a/libmount/src/tab_parse.c b/libmount/src/tab_parse.c
index 3a2cc0d..eec9758 100644
--- a/libmount/src/tab_parse.c
+++ b/libmount/src/tab_parse.c
@@ -225,11 +225,6 @@ static int mnt_parse_mountinfo_line(struct libmnt_fs *fs, const char *s)
goto fail;
}
- /* remove "\040(deleted)" suffix */
- p = (char *) endswith(fs->target, PATH_DELETED_SUFFIX);
- if (p && *p)
- *p = '\0';
-
s = skip_separator(s);
/* (6) vfs options (fs-independent) */
diff --git a/tests/expected/findmnt/filter-options b/tests/expected/findmnt/filter-options
index 2606bce..97b0ead 100644
--- a/tests/expected/findmnt/filter-options
+++ b/tests/expected/findmnt/filter-options
@@ -28,5 +28,4 @@ TARGET SOURCE FSTYPE OPTIONS
/home/kzak/.gvfs gvfs-fuse-daemon fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=500,group_id=500
/var/lib/nfs/rpc_pipefs sunrpc rpc_pipefs rw,relatime
/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
-/mnt/foo /fooooo bar rw,relatime
rc=0
diff --git a/tests/expected/findmnt/filter-options-nameval-neg b/tests/expected/findmnt/filter-options-nameval-neg
index 5471d65..f0467ef 100644
--- a/tests/expected/findmnt/filter-options-nameval-neg
+++ b/tests/expected/findmnt/filter-options-nameval-neg
@@ -29,6 +29,5 @@ TARGET SOURCE FSTYPE OPTIO
|-/home/kzak /dev/mapper/kzak-home ext4 rw,noatime,barrier=1,data=ordered
| `-/home/kzak/.gvfs gvfs-fuse-daemon fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=500,group_id=500
|-/var/lib/nfs/rpc_pipefs sunrpc rpc_pipefs rw,relatime
-|-/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
-`-/mnt/foo /fooooo bar rw,relatime
+`-/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
rc=0
diff --git a/tests/expected/findmnt/filter-types-neg b/tests/expected/findmnt/filter-types-neg
index 2606bce..97b0ead 100644
--- a/tests/expected/findmnt/filter-types-neg
+++ b/tests/expected/findmnt/filter-types-neg
@@ -28,5 +28,4 @@ TARGET SOURCE FSTYPE OPTIONS
/home/kzak/.gvfs gvfs-fuse-daemon fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=500,group_id=500
/var/lib/nfs/rpc_pipefs sunrpc rpc_pipefs rw,relatime
/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
-/mnt/foo /fooooo bar rw,relatime
rc=0
diff --git a/tests/expected/findmnt/outputs-default b/tests/expected/findmnt/outputs-default
index 5949579..0159935 100644
--- a/tests/expected/findmnt/outputs-default
+++ b/tests/expected/findmnt/outputs-default
@@ -30,6 +30,5 @@ TARGET SOURCE FSTYPE OPTIO
|-/home/kzak /dev/mapper/kzak-home ext4 rw,noatime,barrier=1,data=ordered
| `-/home/kzak/.gvfs gvfs-fuse-daemon fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=500,group_id=500
|-/var/lib/nfs/rpc_pipefs sunrpc rpc_pipefs rw,relatime
-|-/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
-`-/mnt/foo /fooooo bar rw,relatime
+`-/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
rc=0
diff --git a/tests/expected/findmnt/outputs-force-tree b/tests/expected/findmnt/outputs-force-tree
index 5949579..0159935 100644
--- a/tests/expected/findmnt/outputs-force-tree
+++ b/tests/expected/findmnt/outputs-force-tree
@@ -30,6 +30,5 @@ TARGET SOURCE FSTYPE OPTIO
|-/home/kzak /dev/mapper/kzak-home ext4 rw,noatime,barrier=1,data=ordered
| `-/home/kzak/.gvfs gvfs-fuse-daemon fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=500,group_id=500
|-/var/lib/nfs/rpc_pipefs sunrpc rpc_pipefs rw,relatime
-|-/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
-`-/mnt/foo /fooooo bar rw,relatime
+`-/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
rc=0
diff --git a/tests/expected/findmnt/outputs-kernel b/tests/expected/findmnt/outputs-kernel
index 5949579..0159935 100644
--- a/tests/expected/findmnt/outputs-kernel
+++ b/tests/expected/findmnt/outputs-kernel
@@ -30,6 +30,5 @@ TARGET SOURCE FSTYPE OPTIO
|-/home/kzak /dev/mapper/kzak-home ext4 rw,noatime,barrier=1,data=ordered
| `-/home/kzak/.gvfs gvfs-fuse-daemon fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=500,group_id=500
|-/var/lib/nfs/rpc_pipefs sunrpc rpc_pipefs rw,relatime
-|-/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
-`-/mnt/foo /fooooo bar rw,relatime
+`-/mnt/sounds //foo.home/bar/ cifs rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
rc=0
diff --git a/tests/expected/libmount/tabdiff-mount b/tests/expected/libmount/tabdiff-mount
index 420aeac..3c18f8d 100644
--- a/tests/expected/libmount/tabdiff-mount
+++ b/tests/expected/libmount/tabdiff-mount
@@ -1,3 +1,2 @@
/dev/mapper/kzak-home on /home/kzak: MOUNTED
-/fooooo on /mnt/foo: MOUNTED
tmpfs on /mnt/test/foo bar: MOUNTED
diff --git a/tests/expected/libmount/tabdiff-move b/tests/expected/libmount/tabdiff-move
index 24f9bc7..95820d9 100644
--- a/tests/expected/libmount/tabdiff-move
+++ b/tests/expected/libmount/tabdiff-move
@@ -1,3 +1,2 @@
//foo.home/bar/ on /mnt/music: MOVED to /mnt/music
-/fooooo on /mnt/foo: UMOUNTED
tmpfs on /mnt/test/foo bar: UMOUNTED
diff --git a/tests/expected/libmount/tabdiff-remount b/tests/expected/libmount/tabdiff-remount
index 82ebeab..876bfd9 100644
--- a/tests/expected/libmount/tabdiff-remount
+++ b/tests/expected/libmount/tabdiff-remount
@@ -1,4 +1,3 @@
/dev/mapper/kzak-home on /home/kzak: REMOUNTED from 'rw,noatime,barrier=1,data=ordered' to 'ro,noatime,barrier=1,data=ordered'
//foo.home/bar/ on /mnt/sounds: REMOUNTED from 'rw,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344' to 'ro,relatime,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344'
-/fooooo on /mnt/foo: UMOUNTED
tmpfs on /mnt/test/foo bar: UMOUNTED
diff --git a/tests/expected/libmount/tabdiff-umount b/tests/expected/libmount/tabdiff-umount
index a3e0fe4..c7be725 100644
--- a/tests/expected/libmount/tabdiff-umount
+++ b/tests/expected/libmount/tabdiff-umount
@@ -1,3 +1,2 @@
/dev/mapper/kzak-home on /home/kzak: UMOUNTED
-/fooooo on /mnt/foo: UMOUNTED
tmpfs on /mnt/test/foo bar: UMOUNTED
diff --git a/tests/expected/libmount/tabfiles-parse-mountinfo b/tests/expected/libmount/tabfiles-parse-mountinfo
index 47eb770..d5ba524 100644
--- a/tests/expected/libmount/tabfiles-parse-mountinfo
+++ b/tests/expected/libmount/tabfiles-parse-mountinfo
@@ -351,17 +351,6 @@ id: 47
parent: 20
devno: 0:38
------ fs:
-source: /fooooo
-target: /mnt/foo
-fstype: bar
-optstr: rw,relatime
-VFS-optstr: rw,relatime
-FS-opstr: rw
-root: /
-id: 48
-parent: 20
-devno: 0:39
------- fs:
source: tmpfs
target: /mnt/test/foo bar
fstype: tmpfs
diff --git a/tests/expected/libmount/tabfiles-py-parse-mountinfo b/tests/expected/libmount/tabfiles-py-parse-mountinfo
index 47eb770..d5ba524 100644
--- a/tests/expected/libmount/tabfiles-py-parse-mountinfo
+++ b/tests/expected/libmount/tabfiles-py-parse-mountinfo
@@ -351,17 +351,6 @@ id: 47
parent: 20
devno: 0:38
------ fs:
-source: /fooooo
-target: /mnt/foo
-fstype: bar
-optstr: rw,relatime
-VFS-optstr: rw,relatime
-FS-opstr: rw
-root: /
-id: 48
-parent: 20
-devno: 0:39
------- fs:
source: tmpfs
target: /mnt/test/foo bar
fstype: tmpfs
diff --git a/tests/ts/findmnt/files/mountinfo b/tests/ts/findmnt/files/mountinfo
index 475ea1a..ff1e664 100644
--- a/tests/ts/findmnt/files/mountinfo
+++ b/tests/ts/findmnt/files/mountinfo
@@ -30,4 +30,3 @@
44 41 0:36 / /home/kzak/.gvfs rw,nosuid,nodev,relatime - fuse.gvfs-fuse-daemon gvfs-fuse-daemon rw,user_id=500,group_id=500
45 20 0:37 / /var/lib/nfs/rpc_pipefs rw,relatime - rpc_pipefs sunrpc rw
47 20 0:38 / /mnt/sounds rw,relatime - cifs //foo.home/bar/ rw,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
-48 20 0:39 / /mnt/foo\040(deleted) rw,relatime - bar /fooooo rw
diff --git a/tests/ts/findmnt/files/mountinfo-nonroot b/tests/ts/findmnt/files/mountinfo-nonroot
index e15b467..87b421d 100644
--- a/tests/ts/findmnt/files/mountinfo-nonroot
+++ b/tests/ts/findmnt/files/mountinfo-nonroot
@@ -29,4 +29,3 @@
44 41 0:36 / /home/kzak/.gvfs rw,nosuid,nodev,relatime - fuse.gvfs-fuse-daemon gvfs-fuse-daemon rw,user_id=500,group_id=500
45 20 0:37 / /var/lib/nfs/rpc_pipefs rw,relatime - rpc_pipefs sunrpc rw
47 20 0:38 / /mnt/sounds rw,relatime - cifs //foo.home/bar/ rw,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
-48 20 0:39 / /mnt/foo\040(deleted) rw,relatime - bar /fooooo rw
diff --git a/tests/ts/libmount/files/mountinfo b/tests/ts/libmount/files/mountinfo
index c063071..2b01740 100644
--- a/tests/ts/libmount/files/mountinfo
+++ b/tests/ts/libmount/files/mountinfo
@@ -30,5 +30,4 @@
44 41 0:36 / /home/kzak/.gvfs rw,nosuid,nodev,relatime - fuse.gvfs-fuse-daemon gvfs-fuse-daemon rw,user_id=500,group_id=500
45 20 0:37 / /var/lib/nfs/rpc_pipefs rw,relatime - rpc_pipefs sunrpc rw
47 20 0:38 / /mnt/sounds rw,relatime - cifs //foo.home/bar/ rw,unc=\\foo.home\bar,username=kzak,domain=SRGROUP,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.111.1,posixpaths,serverino,acl,rsize=16384,wsize=57344
-48 20 0:39 / /mnt/foo\040(deleted) rw,relatime - bar /fooooo rw
49 20 0:56 / /mnt/test/foo bar rw,relatime shared:323 - tmpfs tmpfs rw
--
2.27.0

View File

@ -1,169 +0,0 @@
From faa5a3a83ad0cb5e2c303edbfd8cd823c9d94c17 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 10 Feb 2022 12:03:17 +0100
Subject: [PATCH] chsh, chfn: remove readline support [CVE-2022-0563]
The readline library uses INPUTRC= environment variable to get a path
to the library config file. When the library cannot parse the
specified file, it prints an error message containing data from the
file.
Unfortunately, the library does not use secure_getenv() (or a similar
concept) to avoid vulnerabilities that could occur if set-user-ID or
set-group-ID programs.
Reported-by: Rory Mackie <rory.mackie@trailofbits.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
login-utils/Makemodule.am | 2 +-
login-utils/chfn.c | 16 ++++----------
login-utils/chsh.c | 45 ++++-----------------------------------
3 files changed, 9 insertions(+), 54 deletions(-)
diff --git a/login-utils/Makemodule.am b/login-utils/Makemodule.am
index 75c0a67..2d0547a 100644
--- a/login-utils/Makemodule.am
+++ b/login-utils/Makemodule.am
@@ -109,7 +109,7 @@ chfn_chsh_sources = \
login-utils/ch-common.c
chfn_chsh_cflags = $(SUID_CFLAGS) $(AM_CFLAGS)
chfn_chsh_ldflags = $(SUID_LDFLAGS) $(AM_LDFLAGS)
-chfn_chsh_ldadd = libcommon.la $(READLINE_LIBS)
+chfn_chsh_ldadd = libcommon.la
if CHFN_CHSH_PASSWORD
chfn_chsh_ldadd += -lpam
diff --git a/login-utils/chfn.c b/login-utils/chfn.c
index ece5cdc..8f00d15 100644
--- a/login-utils/chfn.c
+++ b/login-utils/chfn.c
@@ -56,11 +56,6 @@
# include "auth.h"
#endif
-#ifdef HAVE_LIBREADLINE
-# define _FUNCTION_DEF
-# include <readline/readline.h>
-#endif
-
struct finfo {
char *full_name;
char *office;
@@ -228,24 +223,21 @@ static char *ask_new_field(struct chfn_control *ctl, const char *question,
{
int len;
char *buf = NULL; /* leave initialized to NULL or getline segfaults */
-#ifndef HAVE_LIBREADLINE
size_t dummy = 0;
-#endif
if (!def_val)
def_val = "";
+
while (true) {
printf("%s [%s]:", question, def_val);
__fpurge(stdin);
-#ifdef HAVE_LIBREADLINE
- rl_bind_key('\t', rl_insert);
- if ((buf = readline(" ")) == NULL)
-#else
+
putchar(' ');
fflush(stdout);
+
if (getline(&buf, &dummy, stdin) < 0)
-#endif
errx(EXIT_FAILURE, _("Aborted."));
+
/* remove white spaces from string end */
ltrim_whitespace((unsigned char *) buf);
len = rtrim_whitespace((unsigned char *) buf);
diff --git a/login-utils/chsh.c b/login-utils/chsh.c
index 3b446be..b7e7017 100644
--- a/login-utils/chsh.c
+++ b/login-utils/chsh.c
@@ -50,7 +50,6 @@
# include "selinux-utils.h"
#endif
-
#ifdef HAVE_LIBUSER
# include <libuser/user.h>
# include "libuser.h"
@@ -58,11 +57,6 @@
# include "auth.h"
#endif
-#ifdef HAVE_LIBREADLINE
-# define _FUNCTION_DEF
-# include <readline/readline.h>
-#endif
-
struct sinfo {
char *username;
char *shell;
@@ -121,33 +115,6 @@ static void print_shells(void)
endusershell();
}
-#ifdef HAVE_LIBREADLINE
-static char *shell_name_generator(const char *text, int state)
-{
- static size_t len;
- char *s;
-
- if (!state) {
- setusershell();
- len = strlen(text);
- }
-
- while ((s = getusershell())) {
- if (strncmp(s, text, len) == 0)
- return xstrdup(s);
- }
- return NULL;
-}
-
-static char **shell_name_completion(const char *text,
- int start __attribute__((__unused__)),
- int end __attribute__((__unused__)))
-{
- rl_attempted_completion_over = 1;
- return rl_completion_matches(text, shell_name_generator);
-}
-#endif
-
/*
* parse_argv () --
* parse the command line arguments, and fill in "pinfo" with any
@@ -198,22 +165,18 @@ static char *ask_new_shell(char *question, char *oldshell)
{
int len;
char *ans = NULL;
-#ifdef HAVE_LIBREADLINE
- rl_attempted_completion_function = shell_name_completion;
-#else
size_t dummy = 0;
-#endif
+
if (!oldshell)
oldshell = "";
printf("%s [%s]:", question, oldshell);
-#ifdef HAVE_LIBREADLINE
- if ((ans = readline(" ")) == NULL)
-#else
+
putchar(' ');
fflush(stdout);
+
if (getline(&ans, &dummy, stdin) < 0)
-#endif
return NULL;
+
/* remove the newline at the end of ans. */
ltrim_whitespace((unsigned char *) ans);
len = rtrim_whitespace((unsigned char *) ans);
--
2.27.0

View File

@ -1,22 +0,0 @@
From db5aa5e5d8932c73f1b9f01fe567fa343898b825 Mon Sep 17 00:00:00 2001
From: chanthmiao <chanthmiao@outlook.com>
Date: Sun, 5 Dec 2021 16:58:17 +0800
Subject: [PATCH] Fix integer overflow for alpha like linux
---
sys-utils/swapon.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sys-utils/swapon.c b/sys-utils/swapon.c
index ed6be244ec..76c5cac51b 100644
--- a/sys-utils/swapon.c
+++ b/sys-utils/swapon.c
@@ -543,7 +543,7 @@ static int swapon_checks(const struct swapon_ctl *ctl, struct swap_device *dev)
/* test for holes by LBT */
if (S_ISREG(st.st_mode)) {
- if (st.st_blocks * 512 < st.st_size) {
+ if (st.st_blocks * 512L < st.st_size) {
warnx(_("%s: skipping - it appears to have holes."),
dev->path);
goto err;

View File

@ -1,24 +0,0 @@
From 8757959ac2b64aa30cb748822c858c0c2d0410dd Mon Sep 17 00:00:00 2001
From: jiazhenyuan <jiazhenyuan@uniontech.com>
Date: Mon, 6 Sep 2021 16:50:27 +0800
Subject: [PATCH] Fix memory leaks in the chcpu
---
sys-utils/chcpu.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/sys-utils/chcpu.c b/sys-utils/chcpu.c
index c4e5bc7..527bce5 100644
--- a/sys-utils/chcpu.c
+++ b/sys-utils/chcpu.c
@@ -383,6 +383,7 @@ int main(int argc, char *argv[])
break;
}
+ CPU_FREE(cpu_set);
ul_unref_path(sys);
return rc == 0 ? EXIT_SUCCESS :
--
1.8.3.1

View File

@ -1,29 +0,0 @@
From 9b1d5d040d82db567c9ab0ea2b271b6d12e8969f Mon Sep 17 00:00:00 2001
From: Nicolas Melot <nicolas.melot@ericsson.com>
Date: Sun, 1 Aug 2021 19:20:58 +0200
Subject: [PATCH] Forward value of sector_size instead of its address in
blkdev_get_physector_size
---
lib/blkdev.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/blkdev.c b/lib/blkdev.c
index c22853d..2d02fb8 100644
--- a/lib/blkdev.c
+++ b/lib/blkdev.c
@@ -222,8 +222,10 @@ int blkdev_get_sector_size(int fd __attribute__((__unused__)), int *sector_size)
#ifdef BLKPBSZGET
int blkdev_get_physector_size(int fd, int *sector_size)
{
- if (ioctl(fd, BLKPBSZGET, &sector_size) >= 0)
+ if (ioctl(fd, BLKPBSZGET, sector_size) >= 0)
+ {
return 0;
+ }
return -1;
}
#else
--
1.8.3.1

View File

@ -1,26 +0,0 @@
From 6ff67988785af818b97a7175c8ca80f2ee2d039f Mon Sep 17 00:00:00 2001
From: csbo98 <boliu98@foxmail.com>
Date: Sun, 22 May 2022 14:47:13 +0800
Subject: [PATCH] Maybe there is a little mistake in do_taskset() function in
taskset.c. In the first call of sched_getaffinity(), if the call is failed we
should use err_affinity(ts->pid, 0) other than err_affinity(ts->pid, 1).
---
schedutils/taskset.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/schedutils/taskset.c b/schedutils/taskset.c
index 224cfbe23..0ab7d12e2 100644
--- a/schedutils/taskset.c
+++ b/schedutils/taskset.c
@@ -117,7 +117,7 @@ static void do_taskset(struct taskset *ts, size_t setsize, cpu_set_t *set)
/* read the current mask */
if (ts->pid) {
if (sched_getaffinity(ts->pid, ts->setsize, ts->set) < 0)
- err_affinity(ts->pid, 1);
+ err_affinity(ts->pid, 0);
print_affinity(ts, FALSE);
}
--
2.33.0

View File

@ -1,28 +0,0 @@
From 1ade162b7773ffd3a1c83ad9f4ce529ac69d619c Mon Sep 17 00:00:00 2001
From: Stefan Radu <stefan270101@gmail.com>
Date: Tue, 25 Apr 2023 15:00:36 +0300
Subject: [PATCH] add return in supam_conv function
Added return statement to ensure that all execution paths end with a
return statement.
Signed-off-by: Stefan Radu <stefan270101@gmail.com>
---
login-utils/su-common.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
index 4b284995e..67c4fa271 100644
--- a/login-utils/su-common.c
+++ b/login-utils/su-common.c
@@ -344,6 +344,7 @@ static int supam_conv( int num_msg,
#elif defined(HAVE_SECURITY_OPENPAM_H)
return openpam_ttyconv(num_msg, msg, resp, data);
#endif
+ return PAM_CONV_ERR;
}
static void supam_cleanup(struct su_context *su, int retcode)
--
2.27.0

View File

@ -1,103 +0,0 @@
From fd75b96898c455c35c045bc59a2a4a546e79f223 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 23 Mar 2022 12:50:07 +0100
Subject: [PATCH] column: don't require column name for JSON
The "--table-hide -" hides all unnamed columns, but this does not work
for JSON output. This patch fixes this issue.
Signed-off-by: Karel Zak <kzak@redhat.com>
---
text-utils/column.c | 37 +++++++++++++++++++++++++++++++++----
1 file changed, 33 insertions(+), 4 deletions(-)
diff --git a/text-utils/column.c b/text-utils/column.c
index f9878e4..0fc4708 100644
--- a/text-utils/column.c
+++ b/text-utils/column.c
@@ -96,6 +96,7 @@ struct column_control {
unsigned int greedy :1,
json :1,
header_repeat :1,
+ hide_unnamed :1,
keep_empty_lines :1, /* --keep-empty-lines */
tab_noheadings :1;
};
@@ -196,7 +197,10 @@ static char **split_or_error(const char *str, const char *errmsg)
if (!res) {
if (errno == ENOMEM)
err_oom();
- errx(EXIT_FAILURE, "%s: '%s'", errmsg, str);
+ if (errmsg)
+ errx(EXIT_FAILURE, "%s: '%s'", errmsg, str);
+ else
+ return NULL;
}
return res;
}
@@ -275,6 +279,29 @@ static int column_set_flag(struct libscols_column *cl, int fl)
return scols_column_set_flags(cl, cur | fl);
}
+static int has_unnamed(const char *list)
+{
+ char **all, **one;
+
+ if (!list)
+ return 0;
+ if (strcmp(list, "-") == 0)
+ return 1;
+ if (!strchr(list, ','))
+ return 0;
+
+ all = split_or_error(list, NULL);
+ if (all) {
+ STRV_FOREACH(one, all) {
+ if (strcmp(*one, "-") == 0)
+ return 1;
+ }
+ strv_free(all);
+ }
+
+ return 0;
+}
+
static void apply_columnflag_from_list(struct column_control *ctl, const char *list,
int flag, const char *errmsg)
{
@@ -300,7 +327,7 @@ static void apply_columnflag_from_list(struct column_control *ctl, const char *l
/* apply to columns specified by name */
STRV_FOREACH(one, all) {
- if (flag == SCOLS_FL_HIDDEN && strcmp(*one, "-") == 0) {
+ if (strcmp(*one, "-") == 0) {
unnamed = 1;
continue;
}
@@ -461,12 +488,13 @@ static int add_line_to_table(struct column_control *ctl, wchar_t *wcs0)
if (!wcdata)
break;
if (scols_table_get_ncols(ctl->tab) < n + 1) {
- if (scols_table_is_json(ctl->tab))
+ if (scols_table_is_json(ctl->tab) && !ctl->hide_unnamed)
errx(EXIT_FAILURE, _("line %zu: for JSON the name of the "
"column %zu is required"),
scols_table_get_nlines(ctl->tab) + 1,
n + 1);
- scols_table_new_column(ctl->tab, NULL, 0, 0);
+ scols_table_new_column(ctl->tab, NULL, 0,
+ ctl->hide_unnamed ? SCOLS_FL_HIDDEN : 0);
}
if (!ln) {
ln = scols_table_new_line(ctl->tab, NULL);
@@ -774,6 +802,7 @@ int main(int argc, char **argv)
break;
case 'H':
ctl.tab_colhide = optarg;
+ ctl.hide_unnamed = has_unnamed(ctl.tab_colhide);
break;
case 'i':
ctl.tree_id = optarg;
--
2.27.0

View File

@ -1,30 +0,0 @@
From c9667633f1f6b7a84116f2af067d1d15c72e6382 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 20 Apr 2022 14:42:32 +0200
Subject: [PATCH] dmesg: fix --since and --until
Now --since and --until requires any time field in the output (e.g.
--ctime,-T), it means "dmesg --since '1 day ago'" doesn't work, but
"dmesg -T --since '1 day ago'" works as expected.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2076829
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/dmesg.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c
index 7cca88f2bb..017936255f 100644
--- a/sys-utils/dmesg.c
+++ b/sys-utils/dmesg.c
@@ -1592,7 +1592,9 @@ int main(int argc, char *argv[])
if ((is_timefmt(&ctl, RELTIME) ||
is_timefmt(&ctl, CTIME) ||
- is_timefmt(&ctl, ISO8601))) {
+ is_timefmt(&ctl, ISO8601)) ||
+ ctl.since ||
+ ctl.until) {
if (dmesg_get_boot_time(&ctl.boot_time) != 0)
ctl.time_fmt = DMESG_TIMEFTM_NONE;
else

View File

@ -1,28 +0,0 @@
From 55ef593842d94d657c8209042491c7590ea3bdf0 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 24 Oct 2022 09:57:07 +0200
Subject: [PATCH] fdisk: fix --output option parsing
Fixes: https://github.com/util-linux/util-linux/issues/1859
Addresses: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1022249
Signed-off-by: Karel Zak <kzak@redhat.com>
---
disk-utils/fdisk.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/disk-utils/fdisk.c b/disk-utils/fdisk.c
index 2bd2ef41b..79b904f25 100644
--- a/disk-utils/fdisk.c
+++ b/disk-utils/fdisk.c
@@ -928,7 +928,7 @@ int main(int argc, char **argv)
{ "type", required_argument, NULL, 't' },
{ "units", optional_argument, NULL, 'u' },
{ "version", no_argument, NULL, 'V' },
- { "output", no_argument, NULL, 'o' },
+ { "output", required_argument, NULL, 'o' },
{ "protect-boot", no_argument, NULL, 'B' },
{ "wipe", required_argument, NULL, 'w' },
{ "wipe-partitions",required_argument, NULL, 'W' },
--
2.27.0

View File

@ -1,28 +0,0 @@
From 0a08200bd5664d1849e477f7f776ab4d13bb8422 Mon Sep 17 00:00:00 2001
From: Lorenzo Beretta <vc.net.loreb@gmail.com>
Date: Mon, 25 Oct 2021 15:28:02 +0200
Subject: [PATCH] chsh: fflush stdout before reading from stdin
Same problem as described in https://github.com/karelzak/util-linux/pull/1481
Signed-off-by: Lorenzo Beretta <vc.net.loreb@gmail.com>
---
login-utils/chsh.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/login-utils/chsh.c b/login-utils/chsh.c
index 3497120..3b446be 100644
--- a/login-utils/chsh.c
+++ b/login-utils/chsh.c
@@ -210,6 +210,7 @@ static char *ask_new_shell(char *question, char *oldshell)
if ((ans = readline(" ")) == NULL)
#else
putchar(' ');
+ fflush(stdout);
if (getline(&ans, &dummy, stdin) < 0)
#endif
return NULL;
--
2.27.0

View File

@ -1,40 +0,0 @@
From 1961dccea09176a401bc8fc5e1769ab426308314 Mon Sep 17 00:00:00 2001
From: benaryorg <binary@benary.org>
Date: Fri, 4 Jun 2021 12:34:52 +0000
Subject: [PATCH] fix #648 by ignoring EINVAL on-remount of proc
When using --mount-proc=/some/path then unshare fails if the path provided is not already mounted due to the mount(2) call to change the propagation of the mount.
In such a case mount(2) returns EINVAL, which however is used for a variety of other errors.
If this error is ignored mistakenly the effects however should be neglible since:
1. the mount of proc afterwards happens regardless, errors of which are not ignored
2. the propagation change of root uses MS_REC, which shold already change the propagation of all mounts recursively
Furthermore /proc is not touched if --mount-proc specifies a different mount point.
This should not cause too much unexpected behaviour due to point 2 from above in any case.
Specifying --mount-proc with a different path also means that unshare(3) is not instructed to touch /proc, thus /proc not being touched should not be unexpected.
As a side note, if unshare is called with /proc as an (implicit) parameter to --mount-proc then /proc is a stacked mount, meaning if /proc is unmounted it in the namespace the host /proc is visible again, thus not touching /proc with a different parameter does not constitute more information leakage than the alternative, quite contary it may even be the desired behaviour.
Signed-off-by: benaryorg <binary@benary.org>
---
sys-utils/unshare.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/sys-utils/unshare.c b/sys-utils/unshare.c
index e5627d3c64..820691ba35 100644
--- a/sys-utils/unshare.c
+++ b/sys-utils/unshare.c
@@ -650,8 +650,11 @@ int main(int argc, char *argv[])
err(EXIT_FAILURE, _("cannot chdir to '%s'"), newdir);
if (procmnt) {
- if (!newroot && mount("none", procmnt, NULL, MS_PRIVATE|MS_REC, NULL) != 0)
- err(EXIT_FAILURE, _("cannot change %s filesystem propagation"), procmnt);
+ if (!newroot && mount("none", procmnt, NULL, MS_PRIVATE|MS_REC, NULL))
+ /* custom procmnt means that proc is very likely not mounted, causing EINVAL
+ ignoring the error in this specific instance is safe */
+ if(errno != EINVAL)
+ err(EXIT_FAILURE, _("cannot change %s filesystem propagation"), procmnt);
if (mount("proc", procmnt, "proc", MS_NOSUID|MS_NOEXEC|MS_NODEV, NULL) != 0)
err(EXIT_FAILURE, _("mount %s failed"), procmnt);
}

View File

@ -1,38 +0,0 @@
From 05907d0d9e7c85f33e168feab1eb36b464425054 Mon Sep 17 00:00:00 2001
From: Lorenzo Beretta <vc.net.loreb@gmail.com>
Date: Mon, 25 Oct 2021 14:06:00 +0200
Subject: [PATCH] chfn: flush stdout before reading stdin and fix uninitialized
variable
Same problem as described in https://github.com/karelzak/util-linux/pull/1481
Signed-off-by: Lorenzo Beretta <vc.net.loreb@gmail.com>
---
login-utils/chfn.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/login-utils/chfn.c b/login-utils/chfn.c
index 2508e14..ece5cdc 100644
--- a/login-utils/chfn.c
+++ b/login-utils/chfn.c
@@ -227,7 +227,7 @@ static char *ask_new_field(struct chfn_control *ctl, const char *question,
char *def_val)
{
int len;
- char *buf;
+ char *buf = NULL; /* leave initialized to NULL or getline segfaults */
#ifndef HAVE_LIBREADLINE
size_t dummy = 0;
#endif
@@ -242,6 +242,7 @@ static char *ask_new_field(struct chfn_control *ctl, const char *question,
if ((buf = readline(" ")) == NULL)
#else
putchar(' ');
+ fflush(stdout);
if (getline(&buf, &dummy, stdin) < 0)
#endif
errx(EXIT_FAILURE, _("Aborted."));
--
2.27.0

View File

@ -1,35 +0,0 @@
From 240f2ea95724a2045afebef703f9a7e62326b603 Mon Sep 17 00:00:00 2001
From: zhanchengbin <zhanchengbin1@huawei.com>
Date: Mon, 10 Oct 2022 17:23:24 +0800
Subject: [PATCH] fsck: Processes may kill other processes.
A error in disk-utils/fsck.c, if run the fsck -N command, processes
don't execute, just show what would be done. However, the pid whose
value is -1 is added to the instance_list list in the execute
function,if the kill_all function is called later, kill(-1, signum)
is executed, Signals are sent to all processes except the number one
process and itself. Other processes will be killed if they use the
default signal processing function.
Signed-off-by: zhanchengbin <zhanchengbin1@huawei.com>
Reviewed-by: Lukas Czerner <lczerner@redhat.com>
---
disk-utils/fsck.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/disk-utils/fsck.c b/disk-utils/fsck.c
index 505952c81..800d3ce08 100644
--- a/disk-utils/fsck.c
+++ b/disk-utils/fsck.c
@@ -730,6 +730,8 @@ static int kill_all(int signum)
for (inst = instance_list; inst; inst = inst->next) {
if (inst->flags & FLAG_DONE)
continue;
+ if (inst->pid <= 0)
+ continue;
kill(inst->pid, signum);
n++;
}
--
2.27.0

View File

@ -1,34 +0,0 @@
From 2f26f8aae1ece618ff7ade997609509f0b60d400 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 6 Sep 2021 11:52:09 +0200
Subject: [PATCH] lib/path: fstat dir itself
Signed-off-by: Karel Zak <kzak@redhat.com>
---
lib/path.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/lib/path.c b/lib/path.c
index 21f9bd1..f0b010e 100644
--- a/lib/path.c
+++ b/lib/path.c
@@ -350,10 +350,12 @@ int ul_path_stat(struct path_cxt *pc, struct stat *sb, const char *path)
int dir = ul_path_get_dirfd(pc);
if (dir < 0)
return dir;
- if (*path == '/')
- path++;
-
- rc = fstatat(dir, path, sb, 0);
+ if (path) {
+ if (*path == '/')
+ path++;
+ rc = fstatat(dir, path, sb, 0);
+ } else
+ rc = fstat(dir, sb); /* dir itself */
if (rc && errno == ENOENT
&& pc->redirect_on_enoent
--
2.33.0

View File

@ -1,45 +0,0 @@
From e9aa06bad334b3a90ebe883dfc19b1e165a7c6cf Mon Sep 17 00:00:00 2001
From: Ronan Pigott <ronan@rjp.ie>
Date: Thu, 23 Mar 2023 15:18:00 -0700
Subject: [PATCH] hexdump-parse: handle truncated format pattern
If the fmt being parsed by block_size is exactly '%', *++fmt is the
terminator and strchr will return a valid pointer to the terminator of
spec rather than NULL, the while condition will pass and subsequent
strchr will read past the end of fmt until a spec character is found
again
ASAN aborts with the following error on the first buffer overread:
AddressSanitizer: heap-buffer-overflow on address 0x602000000212 at pc 0x55bf1c4b2d78 bp 0x7ffe33c8cff0 sp 0x7ffe33c8cfe0
READ of size 1 at 0x602000000212 thread T0
#0 0x55bf1c4b2d77 in block_size ../text-utils/hexdump-parse.c:207
#1 0x55bf1c4ad36f in main ../text-utils/hexdump.c:214
#2 0x7f15f063c78f (/usr/lib/libc.so.6+0x2378f)
#3 0x7f15f063c849 in __libc_start_main (/usr/lib/libc.so.6+0x23849)
#4 0x55bf1c4ac6c4 in _start (../build/hexdump+0x86c4)
---
text-utils/hexdump-parse.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/text-utils/hexdump-parse.c b/text-utils/hexdump-parse.c
index 0ceff8f21..272bb24e3 100644
--- a/text-utils/hexdump-parse.c
+++ b/text-utils/hexdump-parse.c
@@ -204,10 +204,12 @@ int block_size(struct hexdump_fs *fs)
* skip any special chars -- save precision in
* case it's a %s format.
*/
- while (strchr(spec + 1, *++fmt))
+ while (strchr(spec + 1, *++fmt) && *fmt != '\0')
;
if (*fmt == '.' && isdigit(*++fmt))
fmt = next_number(fmt, &prec);
+ if (*fmt == '\0')
+ badfmt(fu->fmt);
if (first_letter(fmt, "diouxX"))
bcnt += 4;
else if (first_letter(fmt, "efgEG"))
--
2.27.0

View File

@ -1,25 +0,0 @@
From 970ed62e716d1cb347e983c9a96647be5455e713 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
Date: Sat, 7 Jan 2023 14:36:11 +0000
Subject: [PATCH] ipc_msg_get_limits: always initialize memory
---
sys-utils/ipcutils.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sys-utils/ipcutils.c b/sys-utils/ipcutils.c
index 226a43111..305ddd700 100644
--- a/sys-utils/ipcutils.c
+++ b/sys-utils/ipcutils.c
@@ -18,6 +18,8 @@
int ipc_msg_get_limits(struct ipc_limits *lim)
{
+ memset(lim, 0, sizeof(*lim));
+
if (access(_PATH_PROC_IPC_MSGMNI, F_OK) == 0 &&
access(_PATH_PROC_IPC_MSGMNB, F_OK) == 0 &&
access(_PATH_PROC_IPC_MSGMAX, F_OK) == 0) {
--
2.27.0

View File

@ -1,37 +0,0 @@
From 893fe60d0b8f14d9a3022f6f95637e43b17f1b8b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
Date: Tue, 13 Dec 2022 02:40:02 +0000
Subject: [PATCH] iso9660.h: avoid undefined signed integer shift
When the high bit in p[3] is set we would overflow our signed 4-byte
integer result value.
Force an unsigned type instead.
---
include/iso9660.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/iso9660.h b/include/iso9660.h
index cbc45dbb4..ed402d8c8 100644
--- a/include/iso9660.h
+++ b/include/iso9660.h
@@ -34,7 +34,7 @@ static inline uint32_t isonum_731(const unsigned char *p)
return ((p[0] & 0xff)
| ((p[1] & 0xff) << 8)
| ((p[2] & 0xff) << 16)
- | ((p[3] & 0xff) << 24));
+ | (((uint32_t) p[3] & 0xff) << 24));
}
static inline uint32_t isonum_732(const unsigned char *p)
@@ -42,7 +42,7 @@ static inline uint32_t isonum_732(const unsigned char *p)
return ((p[3] & 0xff)
| ((p[2] & 0xff) << 8)
| ((p[1] & 0xff) << 16)
- | ((p[0] & 0xff) << 24));
+ | (((uint32_t) p[0] & 0xff) << 24));
}
static inline uint32_t isonum_733(const unsigned char *p, bool check_match)
--
2.27.0

View File

@ -1,80 +0,0 @@
From 9fc18efe956956be078fbbcea2144f0bb1b33b30 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
Date: Tue, 13 Dec 2022 02:38:27 +0000
Subject: [PATCH] iso9660.h: use more correct function types
---
include/iso9660.h | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/include/iso9660.h b/include/iso9660.h
index 73decd998..cbc45dbb4 100644
--- a/include/iso9660.h
+++ b/include/iso9660.h
@@ -2,25 +2,26 @@
#define UTIL_LINUX_ISO_H
#include <stdbool.h>
+#include <stdint.h>
#include "c.h"
-static inline int isonum_721(unsigned char *p)
+static inline uint16_t isonum_721(const unsigned char *p)
{
return ((p[0] & 0xff)
| ((p[1] & 0xff) << 8));
}
-static inline int isonum_722(unsigned char *p)
+static inline uint16_t isonum_722(const unsigned char *p)
{
return ((p[1] & 0xff)
| ((p[0] & 0xff) << 8));
}
-static inline int isonum_723(unsigned char *p, bool check_match)
+static inline uint16_t isonum_723(const unsigned char *p, bool check_match)
{
- int le = isonum_721(p);
- int be = isonum_722(p + 2);
+ uint16_t le = isonum_721(p);
+ uint16_t be = isonum_722(p + 2);
if (check_match && le != be)
/* translation is useless */
@@ -28,7 +29,7 @@ static inline int isonum_723(unsigned char *p, bool check_match)
return (le);
}
-static inline int isonum_731(unsigned char *p)
+static inline uint32_t isonum_731(const unsigned char *p)
{
return ((p[0] & 0xff)
| ((p[1] & 0xff) << 8)
@@ -36,7 +37,7 @@ static inline int isonum_731(unsigned char *p)
| ((p[3] & 0xff) << 24));
}
-static inline int isonum_732(unsigned char *p)
+static inline uint32_t isonum_732(const unsigned char *p)
{
return ((p[3] & 0xff)
| ((p[2] & 0xff) << 8)
@@ -44,10 +45,10 @@ static inline int isonum_732(unsigned char *p)
| ((p[0] & 0xff) << 24));
}
-static inline int isonum_733(unsigned char *p, bool check_match)
+static inline uint32_t isonum_733(const unsigned char *p, bool check_match)
{
- int le = isonum_731(p);
- int be = isonum_732(p + 4);
+ uint32_t le = isonum_731(p);
+ uint32_t be = isonum_732(p + 4);
if (check_match && le != be)
/* translation is useless */
--
2.27.0

View File

@ -1,35 +0,0 @@
From 6cd0043221b31a344db8f5dcb82822a2519a2e74 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 7 Feb 2022 13:34:43 +0100
Subject: [PATCH] last: don't assume zero terminate strings
Detected by fuzzer and AddressSanitizer. The utmp strings do not
have to be zero terminated.
Signed-off-by: Karel Zak <kzak@redhat.com>
---
login-utils/last.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/login-utils/last.c b/login-utils/last.c
index c7aec4c116..84629278e5 100644
--- a/login-utils/last.c
+++ b/login-utils/last.c
@@ -757,7 +757,7 @@ static void process_wtmp_file(const struct last_control *ctl,
else {
if (ut.ut_type != DEAD_PROCESS &&
ut.ut_user[0] && ut.ut_line[0] &&
- strcmp(ut.ut_user, "LOGIN") != 0)
+ strncmp(ut.ut_user, "LOGIN", 5) != 0)
ut.ut_type = USER_PROCESS;
/*
* Even worse, applications that write ghost
@@ -770,7 +770,7 @@ static void process_wtmp_file(const struct last_control *ctl,
/*
* Clock changes.
*/
- if (strcmp(ut.ut_user, "date") == 0) {
+ if (strncmp(ut.ut_user, "date", 4) == 0) {
if (ut.ut_line[0] == '|')
ut.ut_type = OLD_TIME;
if (ut.ut_line[0] == '{')

View File

@ -1,31 +0,0 @@
From 5bd28f494ece506daa58861bf46e726c3958021e Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 5 Dec 2022 12:36:42 +0100
Subject: [PATCH] ldattach: fix --intro-command and --pause
The long version of the command line options should not ignore arguments.
Fixes: https://github.com/util-linux/util-linux/issues/1940
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/ldattach.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sys-utils/ldattach.c b/sys-utils/ldattach.c
index 3c853f829..0a6b6f2d2 100644
--- a/sys-utils/ldattach.c
+++ b/sys-utils/ldattach.c
@@ -303,8 +303,8 @@ int main(int argc, char **argv)
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
{"debug", no_argument, NULL, 'd'},
- {"intro-command", no_argument, NULL, 'c'},
- {"pause", no_argument, NULL, 'p'},
+ {"intro-command", required_argument, NULL, 'c'},
+ {"pause", required_argument, NULL, 'p'},
{NULL, 0, NULL, 0}
};
--
2.27.0

View File

@ -1,30 +0,0 @@
From 16a2e0603f15c4a8f4517264930c7bdea5885bae Mon Sep 17 00:00:00 2001
From: Mike Gilbert <floppym@gentoo.org>
Date: Tue, 26 Apr 2022 13:58:12 -0400
Subject: [PATCH] lib: allow safe_getenv to work for non-root users
This allows users to override settings like BLKID_FILE, as is done in
the e2fsprogs test suite.
Bug: https://bugs.gentoo.org/839825
Fixes: 035507c84b53bceb143d0923e65916cbf90979c7
Signed-off-by: Mike Gilbert <floppym@gentoo.org>
---
lib/env.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/lib/env.c b/lib/env.c
index a3dd335bfe..37125f4d5a 100644
--- a/lib/env.c
+++ b/lib/env.c
@@ -161,9 +161,7 @@ void sanitize_env(void)
char *safe_getenv(const char *arg)
{
- uid_t ruid = getuid();
-
- if (ruid != 0 || (ruid != geteuid()) || (getgid() != getegid()))
+ if ((getuid() != geteuid()) || (getgid() != getegid()))
return NULL;
#ifdef HAVE_PRCTL
if (prctl(PR_GET_DUMPABLE, 0, 0, 0, 0) == 0)

View File

@ -1,39 +0,0 @@
From 518a0ad4d9c586ca69d3cf924a4328361f6b2a80 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cristian=20Rodr=C3=ADguez?= <crrodriguez@opensuse.org>
Date: Sun, 15 Jan 2023 01:33:14 +0000
Subject: [PATCH] lib:pager: fix signal safety issues
- Cannot use stdio in signal handlers, so you cannot safely call
fflush.
- cannot call exit() but only _exit()
---
lib/pager.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/pager.c b/lib/pager.c
index e5bd07a47..8f62310c0 100644
--- a/lib/pager.c
+++ b/lib/pager.c
@@ -114,7 +114,9 @@ static int wait_or_whine(pid_t pid)
if (waiting < 0) {
if (errno == EINTR)
continue;
- err(EXIT_FAILURE, _("waitpid failed (%s)"), strerror(errno));
+ /* Can't err() on signal handler */
+ ignore_result(write(STDERR_FILENO, "waitpid failed", 14));
+ _exit(EXIT_FAILURE);
}
if (waiting != pid)
return -1;
@@ -163,8 +165,6 @@ static void wait_for_pager(void)
if (pager_process.pid == 0)
return;
- fflush(stdout);
- fflush(stderr);
/* signal EOF to pager */
close(STDOUT_FILENO);
close(STDERR_FILENO);
--
2.27.0

View File

@ -1,57 +0,0 @@
From 41a27709e9028940578a5cdae17292e432fa23fa Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 29 Nov 2021 13:25:16 +0100
Subject: [PATCH] lib/path: make path use more robust [coverity scan]
*** CID 374365: Null pointer dereferences (FORWARD_NULL)
/lib/path.c: 364 in ul_path_stat()
Signed-off-by: Karel Zak <kzak@redhat.com>
---
lib/path.c | 5 ++++-
lib/sysfs.c | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/lib/path.c b/lib/path.c
index 0d357966f3..8a2b882fe4 100644
--- a/lib/path.c
+++ b/lib/path.c
@@ -344,7 +344,7 @@ int ul_path_stat(struct path_cxt *pc, struct stat *sb, int flags, const char *pa
int rc;
if (!pc) {
- rc = stat(path, sb);
+ rc = path ? stat(path, sb) : -EINVAL;
DBG(CXT, ul_debug("stat '%s' [no context, rc=%d]", path, rc));
} else {
int dir = ul_path_get_dirfd(pc);
@@ -359,6 +359,7 @@ int ul_path_stat(struct path_cxt *pc, struct stat *sb, int flags, const char *pa
rc = fstat(dir, sb); /* dir itself */
if (rc && errno == ENOENT
+ && path
&& pc->redirect_on_enoent
&& pc->redirect_on_enoent(pc, path, &dir) == 0)
rc = fstatat(dir, path, sb, 0);
@@ -372,6 +373,8 @@ int ul_path_open(struct path_cxt *pc, int flags, const char *path)
{
int fd;
+ if (!path)
+ return -EINVAL;
if (!pc) {
fd = open(path, flags);
DBG(CXT, ul_debug("opening '%s' [no context]", path));
diff --git a/lib/sysfs.c b/lib/sysfs.c
index d8206be7ab..84af4fe3cb 100644
--- a/lib/sysfs.c
+++ b/lib/sysfs.c
@@ -165,7 +165,7 @@ static int sysfs_blkdev_enoent_redirect(struct path_cxt *pc, const char *path, i
{
struct sysfs_blkdev *blk = ul_path_get_dialect(pc);
- if (blk && blk->parent && strncmp(path, "queue/", 6) == 0) {
+ if (blk && blk->parent && path && strncmp(path, "queue/", 6) == 0) {
*dirfd = ul_path_get_dirfd(blk->parent);
if (*dirfd >= 0) {
DBG(CXT, ul_debugobj(pc, "%s redirected to parent", path));

View File

@ -1,42 +0,0 @@
From ea459dcf95d0bb04c816b71d2b85fbcd8cfc5ee4 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 17 Mar 2022 12:18:03 +0100
Subject: [PATCH] lib/path: make ul_path_read_buffer() more robust [coverity
scan]
Make sure we never call buf[rc - 1] for rc=0.
Signed-off-by: Karel Zak <kzak@redhat.com>
---
lib/path.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/lib/path.c b/lib/path.c
index 8a2b882fe4..20a3ea15d2 100644
--- a/lib/path.c
+++ b/lib/path.c
@@ -672,14 +672,17 @@ int ul_path_readf_string(struct path_cxt *pc, char **str, const char *path, ...)
int ul_path_read_buffer(struct path_cxt *pc, char *buf, size_t bufsz, const char *path)
{
int rc = ul_path_read(pc, buf, bufsz - 1, path);
- if (rc < 0)
- return rc;
- /* Remove tailing newline (usual in sysfs) */
- if (rc > 0 && *(buf + rc - 1) == '\n')
- buf[--rc] = '\0';
- else
- buf[rc - 1] = '\0';
+ if (rc == 0)
+ buf[0] = '\0';
+
+ else if (rc > 0) {
+ /* Remove tailing newline (usual in sysfs) */
+ if (*(buf + rc - 1) == '\n')
+ buf[--rc] = '\0';
+ else
+ buf[rc - 1] = '\0';
+ }
return rc;
}

View File

@ -1,90 +0,0 @@
From 3b888573661d43ea069e98a083bd10e33a2ece69 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 19 Apr 2022 11:38:57 +0200
Subject: [PATCH] lib/strutils: improve strtoul_or_err() for negative numbers
Let's use the same code for strtoul_or_err() and strtol_or_err() as we
already use for strtoxXX_or_err() functions. It resolves issue with
negative numbers.
This problem has been discovered by "./eject -x -1 -v" where -x is
based on strtoul_or_err(), but accepts negative number (-1).
Reported-by: Enze Li <lienze@kylinos.cn>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
include/strutils.h | 4 ++--
lib/strutils.c | 42 ------------------------------------------
2 files changed, 2 insertions(+), 44 deletions(-)
diff --git a/include/strutils.h b/include/strutils.h
index a84d295..2849ef3 100644
--- a/include/strutils.h
+++ b/include/strutils.h
@@ -42,8 +42,8 @@ extern uint64_t str2unum_or_err(const char *str, int base, const char *errmesg,
extern double strtod_or_err(const char *str, const char *errmesg);
extern long double strtold_or_err(const char *str, const char *errmesg);
-extern long strtol_or_err(const char *str, const char *errmesg);
-extern unsigned long strtoul_or_err(const char *str, const char *errmesg);
+#define strtol_or_err(_s, _e) (long) str2num_or_err(_s, 10, _e, LONG_MIN, LONG_MAX)
+#define strtoul_or_err(_s, _e) (unsigned long) str2unum_or_err(_s, 10, _e, ULONG_MAX)
extern void strtotimeval_or_err(const char *str, struct timeval *tv,
const char *errmesg);
diff --git a/lib/strutils.c b/lib/strutils.c
index 096aaf5..4117e03 100644
--- a/lib/strutils.c
+++ b/lib/strutils.c
@@ -471,48 +471,6 @@ err:
errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
}
-long strtol_or_err(const char *str, const char *errmesg)
-{
- long num;
- char *end = NULL;
-
- errno = 0;
- if (str == NULL || *str == '\0')
- goto err;
- num = strtol(str, &end, 10);
-
- if (errno || str == end || (end && *end))
- goto err;
-
- return num;
-err:
- if (errno == ERANGE)
- err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
-
- errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
-}
-
-unsigned long strtoul_or_err(const char *str, const char *errmesg)
-{
- unsigned long num;
- char *end = NULL;
-
- errno = 0;
- if (str == NULL || *str == '\0')
- goto err;
- num = strtoul(str, &end, 10);
-
- if (errno || str == end || (end && *end))
- goto err;
-
- return num;
-err:
- if (errno == ERANGE)
- err(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
-
- errx(STRTOXX_EXIT_CODE, "%s: '%s'", errmesg, str);
-}
-
uintmax_t strtosize_or_err(const char *str, const char *errmesg)
{
uintmax_t num;
--
2.27.0

View File

@ -1,39 +0,0 @@
From d7fa8ed63891b0058c5df8aa809e34de61008f51 Mon Sep 17 00:00:00 2001
From: Milan Broz <gmazyland@gmail.com>
Date: Sun, 9 Oct 2022 20:20:45 +0200
Subject: [PATCH] libblkid: avoid buffer overflow in ocfs superblock parsing
Label and mount values are checked only according to on-disk
values and not checked against the real structure size.
This can lead to reading of memory outside of superblock
struct and subsequent crash.
Reproducer found with OSS-Fuzz (issue 52270) running over
cryptsetup project (blkid is used in header init).
Signed-off-by: Milan Broz <gmazyland@gmail.com>
---
libblkid/src/superblocks/ocfs.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/libblkid/src/superblocks/ocfs.c b/libblkid/src/superblocks/ocfs.c
index 28df6ddfa4..e213d66b44 100644
--- a/libblkid/src/superblocks/ocfs.c
+++ b/libblkid/src/superblocks/ocfs.c
@@ -129,10 +129,12 @@ static int probe_ocfs(blkid_probe pr, const struct blkid_idmag *mag)
blkid_probe_set_value(pr, "SEC_TYPE",
(unsigned char *) "ntocfs", sizeof("ntocfs"));
- blkid_probe_set_label(pr, (unsigned char *) ovl.label,
- ocfslabellen(ovl));
- blkid_probe_set_value(pr, "MOUNT", (unsigned char *) ovh.mount,
- ocfsmountlen(ovh));
+ if (ocfslabellen(ovl) < sizeof(ovl.label))
+ blkid_probe_set_label(pr, (unsigned char *) ovl.label,
+ ocfslabellen(ovl));
+ if (ocfsmountlen(ovh) < sizeof(ovh.mount))
+ blkid_probe_set_value(pr, "MOUNT", (unsigned char *) ovh.mount,
+ ocfsmountlen(ovh));
blkid_probe_set_uuid(pr, ovl.vol_id);
blkid_probe_sprintf_version(pr, "%u.%u", maj, min);
return 0;

View File

@ -1,24 +0,0 @@
From 0a0630133055c3b3daa3072a3fd9944a1a149401 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 2 Jun 2022 16:02:54 +0200
Subject: [PATCH] libblkid: (bsd) fix buffer pointer use [fuzzing]
Reported-by: Thibault Guittet <tguittet@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/partitions/bsd.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libblkid/src/partitions/bsd.c b/libblkid/src/partitions/bsd.c
index c74517334f..7a0b23195e 100644
--- a/libblkid/src/partitions/bsd.c
+++ b/libblkid/src/partitions/bsd.c
@@ -50,7 +50,7 @@ static int probe_bsd_pt(blkid_probe pr, const struct blkid_idmag *mag)
goto nothing;
}
- l = (struct bsd_disklabel *) data + BLKID_MAG_LASTOFFSET(mag);
+ l = (struct bsd_disklabel *) (data + BLKID_MAG_LASTOFFSET(mag));
ls = blkid_probe_get_partlist(pr);
if (!ls)

View File

@ -1,59 +0,0 @@
From 133a0d70f637b4f4e4337811e452153b04f2bdcf Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 19 Apr 2022 09:44:07 +0200
Subject: [PATCH] libblkid: check fsync() return code
Since 39f5af25982d8b0244000e92a9d0e0e6557d0e17 libblkid uses
O_NONBLOCK. Now it's more obvious that check fsync() (and close())
return value after write() is always a good idea ...
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2074486
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/probe.c | 3 ++-
misc-utils/wipefs.c | 8 ++++++--
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c
index 80db524..3e8a7a0 100644
--- a/libblkid/src/probe.c
+++ b/libblkid/src/probe.c
@@ -1299,7 +1299,8 @@ int blkid_do_wipe(blkid_probe pr, int dryrun)
/* wipen on device */
if (write_all(fd, buf, len))
return -1;
- fsync(fd);
+ if (fsync(fd) != 0)
+ return -1;
pr->flags &= ~BLKID_FL_MODIF_BUFF; /* be paranoid */
return blkid_probe_step_back(pr);
diff --git a/misc-utils/wipefs.c b/misc-utils/wipefs.c
index 78dc63e..f08a9ba 100644
--- a/misc-utils/wipefs.c
+++ b/misc-utils/wipefs.c
@@ -615,7 +615,9 @@ static int do_wipe(struct wipe_control *ctl)
if (need_force)
warnx(_("Use the --force option to force erase."));
- fsync(blkid_probe_get_fd(pr));
+ if (fsync(blkid_probe_get_fd(pr)) != 0)
+ err(EXIT_FAILURE, _("%s: cannot flush modified buffers"),
+ ctl->devname);
#ifdef BLKRRPART
if (reread && (mode & O_EXCL)) {
@@ -635,7 +637,9 @@ static int do_wipe(struct wipe_control *ctl)
}
#endif
- close(blkid_probe_get_fd(pr));
+ if (close(blkid_probe_get_fd(pr)) != 0)
+ err(EXIT_FAILURE, _("%s: close device failed"), ctl->devname);
+
blkid_free_probe(pr);
free(backup);
return 0;
--
2.27.0

View File

@ -1,32 +0,0 @@
From c7471d8b3d4e796eee8ae041e5cbb55c5619318e Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 19 Oct 2022 11:24:30 +0200
Subject: [PATCH] libblkid: cleanup indentation
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/superblocks/jmicron_raid.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/libblkid/src/superblocks/jmicron_raid.c b/libblkid/src/superblocks/jmicron_raid.c
index 9ef8cd3f8..ab2c829f0 100644
--- a/libblkid/src/superblocks/jmicron_raid.c
+++ b/libblkid/src/superblocks/jmicron_raid.c
@@ -17,10 +17,10 @@
#include "superblocks.h"
#define JM_SIGNATURE "JM"
-#define JM_MINOR_VERSION(_x) ((_x)->version & 0xFF)
-#define JM_MAJOR_VERSION(_x) ((_x)->version >> 8)
-#define JM_SPARES 2
-#define JM_MEMBERS 8
+#define JM_MINOR_VERSION(_x) ((_x)->version & 0xFF)
+#define JM_MAJOR_VERSION(_x) ((_x)->version >> 8)
+#define JM_SPARES 2
+#define JM_MEMBERS 8
struct jm_metadata {
int8_t signature[2]; /* 0x0 - 0x01 */
--
2.27.0

View File

@ -1,70 +0,0 @@
From 22769acf56daf6683d635fe92e06ceb52e0433ff Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 4 Apr 2023 11:04:51 +0200
Subject: [PATCH] libblkid: copy BLKID_PARTS_FORCE_GPT to whole-disk prober
Addresses: https://github.com/util-linux/util-linux/discussions/2146
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/blkidP.h | 3 +++
libblkid/src/partitions/partitions.c | 5 +++++
libblkid/src/probe.c | 6 ++++++
3 files changed, 14 insertions(+)
diff --git a/libblkid/src/blkidP.h b/libblkid/src/blkidP.h
index 5d2a02055..007cc357b 100644
--- a/libblkid/src/blkidP.h
+++ b/libblkid/src/blkidP.h
@@ -544,6 +544,9 @@ extern int blkid_probe_get_hint(blkid_probe pr, const char *name, uint64_t *valu
__attribute__((nonnull(1,2)))
__attribute__((warn_unused_result));
+extern int blkid_probe_get_partitions_flags(blkid_probe pr)
+ __attribute__((nonnull));
+
/* filter bitmap macros */
#define blkid_bmp_wordsize (8 * sizeof(unsigned long))
#define blkid_bmp_idx_bit(item) (1UL << ((item) % blkid_bmp_wordsize))
diff --git a/libblkid/src/partitions/partitions.c b/libblkid/src/partitions/partitions.c
index ae63a38cc..1c344fd30 100644
--- a/libblkid/src/partitions/partitions.c
+++ b/libblkid/src/partitions/partitions.c
@@ -234,6 +234,11 @@ int blkid_probe_set_partitions_flags(blkid_probe pr, int flags)
return 0;
}
+int blkid_probe_get_partitions_flags(blkid_probe pr)
+{
+ return pr->chains[BLKID_CHAIN_PARTS].flags;
+}
+
/**
* blkid_probe_reset_partitions_filter:
* @pr: prober
diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c
index 35de30334..b4299493f 100644
--- a/libblkid/src/probe.c
+++ b/libblkid/src/probe.c
@@ -1930,6 +1930,7 @@ blkid_probe blkid_probe_get_wholedisk_probe(blkid_probe pr)
if (!pr->disk_probe) {
/* Open a new disk prober */
char *disk_path = blkid_devno_to_devname(disk);
+ int flags;
if (!disk_path)
return NULL;
@@ -1942,6 +1943,11 @@ blkid_probe blkid_probe_get_wholedisk_probe(blkid_probe pr)
if (!pr->disk_probe)
return NULL; /* ENOMEM? */
+
+ flags = blkid_probe_get_partitions_flags(pr);
+ if (flags & BLKID_PARTS_FORCE_GPT)
+ blkid_probe_set_partitions_flags(pr->disk_probe,
+ BLKID_PARTS_FORCE_GPT);
}
return pr->disk_probe;
--
2.27.0

View File

@ -1,140 +0,0 @@
From 84d38ae3eca523ef990cb848563cc63de25266e6 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 19 Nov 2021 14:19:03 +0100
Subject: [PATCH] libblkid: don't mark cache as "probed" if /sys not available
For "mount --all" we need to read the cache more than once in a short
time. The library checks the delay between probes, and if the delay is
too short, it does not read devices. This is a problem on boot when there
are no /sys, and the cache is empty. In this case, we need to check
for /sys until it's available constantly.
https://github.com/util-linux/util-linux/issues/1492
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/devname.c | 26 +++++++++++++++++---------
libblkid/src/resolve.c | 2 +-
libblkid/src/tag.c | 8 +++++---
3 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/libblkid/src/devname.c b/libblkid/src/devname.c
index c541d30..80574f3 100644
--- a/libblkid/src/devname.c
+++ b/libblkid/src/devname.c
@@ -456,6 +456,8 @@ sysfs_probe_all(blkid_cache cache, int only_if_new, int only_removable)
if (!sysfs)
return -BLKID_ERR_SYSFS;
+ DBG(DEVNAME, ul_debug(" probe /sys/block"));
+
/* scan /sys/block */
while ((dev = xreaddir(sysfs))) {
DIR *dir = NULL;
@@ -560,14 +562,18 @@ sysfs_probe_all(blkid_cache cache, int only_if_new, int only_removable)
/*
* Read the device data for all available block devices in the system.
*/
-static int probe_all(blkid_cache cache, int only_if_new)
+static int probe_all(blkid_cache cache, int only_if_new, int update_interval)
{
+ int rc;
+
if (!cache)
return -BLKID_ERR_PARAM;
if (cache->bic_flags & BLKID_BIC_FL_PROBED &&
- time(NULL) - cache->bic_time < BLKID_PROBE_INTERVAL)
+ time(NULL) - cache->bic_time < BLKID_PROBE_INTERVAL) {
+ DBG(PROBE, ul_debug("don't re-probe [delay < %d]", BLKID_PROBE_INTERVAL));
return 0;
+ }
blkid_read_cache(cache);
@@ -577,7 +583,13 @@ static int probe_all(blkid_cache cache, int only_if_new)
#endif
ubi_probe_all(cache, only_if_new);
- sysfs_probe_all(cache, only_if_new, 0);
+ rc = sysfs_probe_all(cache, only_if_new, 0);
+
+ /* Don't mark the change as "probed" if /sys not avalable */
+ if (update_interval && rc == 0) {
+ cache->bic_time = time(NULL);
+ cache->bic_flags |= BLKID_BIC_FL_PROBED;
+ }
blkid_flush_cache(cache);
return 0;
@@ -596,11 +608,7 @@ int blkid_probe_all(blkid_cache cache)
int ret;
DBG(PROBE, ul_debug("Begin blkid_probe_all()"));
- ret = probe_all(cache, 0);
- if (ret == 0) {
- cache->bic_time = time(NULL);
- cache->bic_flags |= BLKID_BIC_FL_PROBED;
- }
+ ret = probe_all(cache, 0, 1);
DBG(PROBE, ul_debug("End blkid_probe_all() [rc=%d]", ret));
return ret;
}
@@ -618,7 +626,7 @@ int blkid_probe_all_new(blkid_cache cache)
int ret;
DBG(PROBE, ul_debug("Begin blkid_probe_all_new()"));
- ret = probe_all(cache, 1);
+ ret = probe_all(cache, 1, 0);
DBG(PROBE, ul_debug("End blkid_probe_all_new() [rc=%d]", ret));
return ret;
}
diff --git a/libblkid/src/resolve.c b/libblkid/src/resolve.c
index 641b022..16653fa 100644
--- a/libblkid/src/resolve.c
+++ b/libblkid/src/resolve.c
@@ -32,7 +32,7 @@ char *blkid_get_tag_value(blkid_cache cache, const char *tagname,
blkid_cache c = cache;
char *ret = NULL;
- DBG(TAG, ul_debug("looking for %s on %s", tagname, devname));
+ DBG(TAG, ul_debug("looking for tag %s on %s device", tagname, devname));
if (!devname)
return NULL;
diff --git a/libblkid/src/tag.c b/libblkid/src/tag.c
index 390a648..1783365 100644
--- a/libblkid/src/tag.c
+++ b/libblkid/src/tag.c
@@ -326,14 +326,14 @@ blkid_dev blkid_find_dev_with_tag(blkid_cache cache,
blkid_dev dev;
int pri;
struct list_head *p;
- int probe_new = 0;
+ int probe_new = 0, probe_all = 0;
if (!cache || !type || !value)
return NULL;
blkid_read_cache(cache);
- DBG(TAG, ul_debug("looking for %s=%s in cache", type, value));
+ DBG(TAG, ul_debug("looking for tag %s=%s in cache", type, value));
try_again:
pri = -1;
@@ -366,9 +366,11 @@ try_again:
goto try_again;
}
- if (!dev && !(cache->bic_flags & BLKID_BIC_FL_PROBED)) {
+ if (!dev && !probe_all
+ && !(cache->bic_flags & BLKID_BIC_FL_PROBED)) {
if (blkid_probe_all(cache) < 0)
return NULL;
+ probe_all++;
goto try_again;
}
return dev;
--
2.27.0

View File

@ -1,26 +0,0 @@
From 48229f8e7f19c1b61a089fc9ede18d417a895454 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 24 Oct 2022 10:54:24 +0200
Subject: [PATCH] libblkid: (exfat) fix divide by zero [coverity scan]
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/superblocks/exfat.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libblkid/src/superblocks/exfat.c b/libblkid/src/superblocks/exfat.c
index 9d1309425..398619477 100644
--- a/libblkid/src/superblocks/exfat.c
+++ b/libblkid/src/superblocks/exfat.c
@@ -101,7 +101,7 @@ static struct exfat_entry_label *find_label(blkid_probe pr,
return (struct exfat_entry_label *) entry;
offset += EXFAT_ENTRY_SIZE;
- if (offset % CLUSTER_SIZE(sb) == 0) {
+ if (CLUSTER_SIZE(sb) && (offset % CLUSTER_SIZE(sb)) == 0) {
cluster = next_cluster(pr, sb, cluster);
if (cluster < EXFAT_FIRST_DATA_CLUSTER)
return NULL;
--
2.27.0

View File

@ -1,92 +0,0 @@
From cb92f0d82ae634e46989d3dae673ae3f542f7dd9 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 21 Oct 2022 18:11:59 +0200
Subject: [PATCH] libblkid: fix jmicron checksum and LE to CPU
- don't cast packed struct to uint16_t pointer, use temporary value
- calculate real count for the loop
- convert all to LE for checksum calculation (jm_to_cpu() ignores fillers)
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/superblocks/jmicron_raid.c | 44 ++++++++++++++-----------
1 file changed, 25 insertions(+), 19 deletions(-)
diff --git a/libblkid/src/superblocks/jmicron_raid.c b/libblkid/src/superblocks/jmicron_raid.c
index ab2c829f0..580c38533 100644
--- a/libblkid/src/superblocks/jmicron_raid.c
+++ b/libblkid/src/superblocks/jmicron_raid.c
@@ -55,35 +55,38 @@ static void jm_to_cpu(struct jm_metadata *jm)
{
unsigned int i;
- le16_to_cpu(jm->version);
- le16_to_cpu(jm->checksum);
- le32_to_cpu(jm->identity);
+ jm->version = le16_to_cpu(jm->version);
+ jm->checksum = le16_to_cpu(jm->checksum);
+ jm->identity = le32_to_cpu(jm->identity);
+ jm->segment.base = le32_to_cpu(jm->segment.base);
+ jm->segment.range = le32_to_cpu(jm->segment.range);
+ jm->segment.range2 = le16_to_cpu(jm->segment.range2);
- le32_to_cpu(jm->segment.base);
- le32_to_cpu(jm->segment.range);
- le16_to_cpu(jm->segment.range2);
-
- le16_to_cpu(jm->attribute);
+ jm->attribute = le16_to_cpu(jm->attribute);
for (i = 0; i < JM_SPARES; i++)
- le32_to_cpu(jm->spare[i]);
+ jm->spare[i] = le32_to_cpu(jm->spare[i]);
for (i = 0; i < JM_MEMBERS; i++)
- le32_to_cpu(jm->member[i]);
+ jm->member[i] = le32_to_cpu(jm->member[i]);
}
-static int jm_checksum(struct jm_metadata *jm)
+static int jm_checksum(const struct jm_metadata *jm)
{
- size_t count = 64;
- char *buf = (char *) jm;
- uint16_t *p = (uint16_t *) buf, sum = 0;
+ size_t count = sizeof(*jm) / sizeof(uint16_t);
+ uint16_t sum = 0;
+ unsigned char *ptr = (unsigned char *) jm;
+
+ while (count--) {
+ uint16_t val;
- assert(count <= sizeof(struct jm_metadata));
+ memcpy(&val, ptr, sizeof(uint16_t));
+ sum += le16_to_cpu(val);
- while (count--)
- sum += *p++;
+ ptr += sizeof(uint16_t);
+ }
- return !sum || sum == 1;
+ return sum == 0 || sum == 1;
}
static int probe_jmraid(blkid_probe pr,
@@ -108,9 +111,12 @@ static int probe_jmraid(blkid_probe pr,
if (memcmp(jm->signature, JM_SIGNATURE, sizeof(JM_SIGNATURE) - 1) != 0)
return 1;
+ if (!jm_checksum(jm))
+ return 1;
+
jm_to_cpu(jm);
- if (!jm_checksum(jm))
+ if (jm->mode > 5)
return 1;
if (blkid_probe_sprintf_version(pr, "%u.%u",
--
2.27.0

View File

@ -1,42 +0,0 @@
From 2a71e291d0fe247d7ca62775e47865dda4b2acfd Mon Sep 17 00:00:00 2001
From: Milan Broz <gmazyland@gmail.com>
Date: Thu, 24 Nov 2022 10:54:01 +0100
Subject: [PATCH] libblkid: fix misaligned-address in probe_exfat
Value checked in le32_to_cpu() needs to be properly
aligned. Just copy the value temporarily for conversion.
Fix OSS-Fuzz issue 53696
---
libblkid/src/superblocks/exfat.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/libblkid/src/superblocks/exfat.c b/libblkid/src/superblocks/exfat.c
index 323e375..34b7ef3 100644
--- a/libblkid/src/superblocks/exfat.c
+++ b/libblkid/src/superblocks/exfat.c
@@ -69,16 +69,17 @@ static uint64_t cluster_to_offset(const struct exfat_super_block *sb,
static uint32_t next_cluster(blkid_probe pr,
const struct exfat_super_block *sb, uint32_t cluster)
{
- uint32_t *next;
+ uint32_t *nextp, next;
uint64_t fat_offset;
fat_offset = block_to_offset(sb, le32_to_cpu(sb->fat_block_start))
+ (uint64_t) cluster * sizeof(cluster);
- next = (uint32_t *) blkid_probe_get_buffer(pr, fat_offset,
+ nextp = (uint32_t *) blkid_probe_get_buffer(pr, fat_offset,
sizeof(uint32_t));
- if (!next)
+ if (!nextp)
return 0;
- return le32_to_cpu(*next);
+ memcpy(&next, nextp, sizeof(next));
+ return le32_to_cpu(next);
}
static struct exfat_entry_label *find_label(blkid_probe pr,
--
2.33.0

View File

@ -1,27 +0,0 @@
From 74e48269ee9a15e230e25d0e3d2e50f5b0ba2b04 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 2 Jun 2022 16:02:54 +0200
Subject: [PATCH] libblkid: (hfs) fix label use [fuzzing]
Reported-by: Thibault Guittet <tguittet@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/superblocks/hfs.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/libblkid/src/superblocks/hfs.c b/libblkid/src/superblocks/hfs.c
index 9674b1481f..68cb30edbb 100644
--- a/libblkid/src/superblocks/hfs.c
+++ b/libblkid/src/superblocks/hfs.c
@@ -173,7 +173,10 @@ static int probe_hfs(blkid_probe pr, const struct blkid_idmag *mag)
hfs_set_uuid(pr, hfs->finder_info.id, sizeof(hfs->finder_info.id));
- blkid_probe_set_label(pr, hfs->label, hfs->label_len);
+ size = hfs->label_len;
+ if ((size_t) size > sizeof(hfs->label))
+ size = sizeof(hfs->label);
+ blkid_probe_set_label(pr, hfs->label, size);
return 0;
}

View File

@ -1,24 +0,0 @@
From 7ebfe9b411c12223a2500ca62d6be37c48e2d83d Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 2 Jun 2022 16:02:54 +0200
Subject: [PATCH] libblkid: (hfs) fix make sure buffer is large enough
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/superblocks/ntfs.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/libblkid/src/superblocks/ntfs.c b/libblkid/src/superblocks/ntfs.c
index 9f1927cf74..b5799c3e33 100644
--- a/libblkid/src/superblocks/ntfs.c
+++ b/libblkid/src/superblocks/ntfs.c
@@ -158,6 +158,9 @@ static int __probe_ntfs(blkid_probe pr, const struct blkid_idmag *mag, int save_
sectors_per_cluster, nr_clusters,
off));
+ if (mft_record_size < 4)
+ return 1;
+
buf_mft = blkid_probe_get_buffer(pr, off, mft_record_size);
if (!buf_mft)
return errno ? -errno : 1;

View File

@ -1,25 +0,0 @@
From 4e12fbca62be10b09503cecc7507757874043474 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 2 Jun 2022 16:02:54 +0200
Subject: [PATCH] libblkid: (mac) make sure block size is large enough
[fuzzing]
Reported-by: Thibault Guittet <tguittet@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/partitions/mac.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/libblkid/src/partitions/mac.c b/libblkid/src/partitions/mac.c
index 092d31d322..75a558b0a3 100644
--- a/libblkid/src/partitions/mac.c
+++ b/libblkid/src/partitions/mac.c
@@ -93,6 +93,8 @@ static int probe_mac_pt(blkid_probe pr,
}
block_size = be16_to_cpu(md->block_size);
+ if (block_size < sizeof(struct mac_partition))
+ goto nothing;
/* The partition map always begins at physical block 1,
* the second block on the disk.

View File

@ -1,22 +0,0 @@
From 5caa4117b40ea9babf4aee6e8786fb70507ee1b8 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 17 Mar 2022 12:41:48 +0100
Subject: [PATCH] libblkid: make blkid_free_probe() more robust
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/probe.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c
index 2e0e08ac1d..31706240fc 100644
--- a/libblkid/src/probe.c
+++ b/libblkid/src/probe.c
@@ -251,6 +251,7 @@ void blkid_free_probe(blkid_probe pr)
if (ch->driver->free_data)
ch->driver->free_data(pr, ch->data);
free(ch->fltr);
+ ch->fltr = NULL;
}
if ((pr->flags & BLKID_FL_PRIVATE_FD) && pr->fd >= 0)

View File

@ -1,55 +0,0 @@
From 8a08c34aad61cb59c977212458bf55f5a81186e8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
Date: Thu, 2 Mar 2023 15:54:39 +0000
Subject: [PATCH] libblkid: nvidia_raid: validate checksum
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
See #1843
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
libblkid/src/superblocks/nvidia_raid.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/libblkid/src/superblocks/nvidia_raid.c b/libblkid/src/superblocks/nvidia_raid.c
index 35c663c8d..f59a0e100 100644
--- a/libblkid/src/superblocks/nvidia_raid.c
+++ b/libblkid/src/superblocks/nvidia_raid.c
@@ -27,6 +27,14 @@ struct nv_metadata {
#define NVIDIA_SUPERBLOCK_SIZE 120
+static int nvraid_verify_checksum(blkid_probe pr, const struct nv_metadata *nv)
+{
+ uint32_t csum = le32_to_cpu(nv->chksum);
+ for (size_t i = 0; i < le32_to_cpu(nv->size); i++)
+ csum += le32_to_cpu(((uint32_t *) nv)[i]);
+ return blkid_probe_verify_csum(pr, csum, le32_to_cpu(nv->chksum));
+}
+
static int probe_nvraid(blkid_probe pr,
const struct blkid_idmag *mag __attribute__((__unused__)))
{
@@ -42,7 +50,7 @@ static int probe_nvraid(blkid_probe pr,
nv = (struct nv_metadata *)
blkid_probe_get_buffer(pr,
off,
- sizeof(struct nv_metadata));
+ NVIDIA_SUPERBLOCK_SIZE);
if (!nv)
return errno ? -errno : 1;
@@ -50,6 +58,8 @@ static int probe_nvraid(blkid_probe pr,
return 1;
if (le32_to_cpu(nv->size) * 4 != NVIDIA_SUPERBLOCK_SIZE)
return 1;
+ if (!nvraid_verify_checksum(pr, nv))
+ return 1;
if (blkid_probe_sprintf_version(pr, "%u", le16_to_cpu(nv->version)) != 0)
return 1;
if (blkid_probe_set_magic(pr, off, sizeof(nv->vendor),
--
2.27.0

View File

@ -1,38 +0,0 @@
From d8d164db5ee217034dea7788263b532114bcd2fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
Date: Thu, 2 Mar 2023 15:27:58 +0000
Subject: [PATCH] libblkid: nvidia_raid: verify superblock size
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
---
libblkid/src/superblocks/nvidia_raid.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/libblkid/src/superblocks/nvidia_raid.c b/libblkid/src/superblocks/nvidia_raid.c
index 5db8ec260..35c663c8d 100644
--- a/libblkid/src/superblocks/nvidia_raid.c
+++ b/libblkid/src/superblocks/nvidia_raid.c
@@ -24,6 +24,8 @@ struct nv_metadata {
} __attribute__((packed));
#define NVIDIA_SIGNATURE "NVIDIA"
+#define NVIDIA_SUPERBLOCK_SIZE 120
+
static int probe_nvraid(blkid_probe pr,
const struct blkid_idmag *mag __attribute__((__unused__)))
@@ -46,6 +48,8 @@ static int probe_nvraid(blkid_probe pr,
if (memcmp(nv->vendor, NVIDIA_SIGNATURE, sizeof(NVIDIA_SIGNATURE)-1) != 0)
return 1;
+ if (le32_to_cpu(nv->size) * 4 != NVIDIA_SUPERBLOCK_SIZE)
+ return 1;
if (blkid_probe_sprintf_version(pr, "%u", le16_to_cpu(nv->version)) != 0)
return 1;
if (blkid_probe_set_magic(pr, off, sizeof(nv->vendor),
--
2.27.0

View File

@ -1,51 +0,0 @@
From 106de261469e1001243d5b81ed895762fb34b2ba Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 2 Jun 2022 16:02:54 +0200
Subject: [PATCH] libblkid: (probe) fix size and offset overflows [fuzzing]
Reported-by: Thibault Guittet <tguittet@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/probe.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c
index 06c25572be..fc638c9bbe 100644
--- a/libblkid/src/probe.c
+++ b/libblkid/src/probe.c
@@ -621,6 +621,11 @@ static int hide_buffer(blkid_probe pr, uint64_t off, uint64_t len)
struct list_head *p;
int ct = 0;
+ if (UINT64_MAX - len < off) {
+ DBG(BUFFER, ul_debug("\t hide-buffer overflow (ignore)"));
+ return -EINVAL;
+ }
+
list_for_each(p, &pr->buffers) {
struct blkid_bufinfo *x =
list_entry(p, struct blkid_bufinfo, bufs);
@@ -656,14 +661,20 @@ unsigned char *blkid_probe_get_buffer(blkid_probe pr, uint64_t off, uint64_t len
DBG(BUFFER, ul_debug("\t>>>> off=%ju, real-off=%ju (probe <%ju..%ju>, len=%ju",
off, real_off, pr->off, pr->off + pr->size, len));
*/
-
if (pr->size == 0) {
errno = EINVAL;
return NULL;
}
- if (len == 0 || (!S_ISCHR(pr->mode) && pr->off + pr->size < real_off + len)) {
- DBG(BUFFER, ul_debug("\t ignore: request out of probing area"));
+ if (UINT64_MAX - len < off || UINT64_MAX - len < real_off) {
+ DBG(BUFFER, ul_debug("\t read-buffer overflow (ignore)"));
+ return NULL;
+ }
+
+ if (len == 0
+ || (!S_ISCHR(pr->mode) && (pr->size < off || pr->size < len))
+ || (!S_ISCHR(pr->mode) && (pr->off + pr->size < real_off + len))) {
+ DBG(BUFFER, ul_debug("\t read-buffer out of probing area (ignore)"));
errno = 0;
return NULL;
}

View File

@ -1,47 +0,0 @@
From 3f5dd5fa812120764312a2326285e88b2be82c2f Mon Sep 17 00:00:00 2001
From: jiayi0118 <1398871225@qq.com>
Date: Wed, 17 Aug 2022 22:25:27 +0800
Subject: [PATCH] libblkid/src/topology/dm: close redundant write file
description for pipe before reading data.
Reference:https://github.com/util-linux/util-linux/commit/1d5d50c277e459f4ccbb6e3db416dcb6eb2e2bc4
Conflict:NA
---
libblkid/src/topology/dm.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/libblkid/src/topology/dm.c b/libblkid/src/topology/dm.c
index b210a805b..1a1cb8ac0 100644
--- a/libblkid/src/topology/dm.c
+++ b/libblkid/src/topology/dm.c
@@ -103,6 +103,10 @@ static int probe_dm_tp(blkid_probe pr,
if (!stream)
goto nothing;
+ if (dmpipe[1] != -1) {
+ close(dmpipe[1]);
+ }
+
if (fscanf(stream, "%lld %lld striped %d %d ",
&offset, &size, &stripes, &stripesize) != 0)
goto nothing;
@@ -111,7 +115,6 @@ static int probe_dm_tp(blkid_probe pr,
blkid_topology_set_optimal_io_size(pr, (stripes * stripesize) << 9);
fclose(stream);
- close(dmpipe[1]);
return 0;
nothing:
@@ -119,8 +122,6 @@ nothing:
fclose(stream);
else if (dmpipe[0] != -1)
close(dmpipe[0]);
- if (dmpipe[1] != -1)
- close(dmpipe[1]);
return 1;
}
--
2.31.1

View File

@ -1,34 +0,0 @@
From 819210f37d66949f54fb2f830bc62cb3635a83d5 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Fri, 19 Aug 2022 11:40:27 +0200
Subject: [PATCH] libblkid: (topology) init variables for DM
Addresses: https://github.com/util-linux/util-linux/issues/1776
Signed-off-by: Karel Zak <kzak@redhat.com>
Reference:https://github.com/util-linux/util-linux/commit/819210f37d66949f54fb2f830bc62cb3635a83d5
Conflict:NA
---
libblkid/src/topology/dm.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libblkid/src/topology/dm.c b/libblkid/src/topology/dm.c
index 1a1cb8ac0..77146e2e2 100644
--- a/libblkid/src/topology/dm.c
+++ b/libblkid/src/topology/dm.c
@@ -34,10 +34,10 @@ static int probe_dm_tp(blkid_probe pr,
"/usr/sbin/dmsetup",
"/sbin/dmsetup"
};
- int dmpipe[] = { -1, -1 }, stripes, stripesize;
+ int dmpipe[] = { -1, -1 }, stripes = 0, stripesize = 0;
const char *cmd = NULL;
FILE *stream = NULL;
- long long offset, size;
+ long long offset = 0, size = 0;
size_t i;
dev_t devno = blkid_probe_get_devno(pr);
--
2.31.1

View File

@ -1,122 +0,0 @@
From cf68e2c897a29f8a3a1c8402574bbb49adf5a52a Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 19 Oct 2022 11:16:17 +0200
Subject: [PATCH] libblkid: use checksum for jmicron
Addresses: https://github.com/util-linux/util-linux/pull/1843
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libblkid/src/superblocks/jmicron_raid.c | 83 ++++++++++++++++++++++---
1 file changed, 74 insertions(+), 9 deletions(-)
diff --git a/libblkid/src/superblocks/jmicron_raid.c b/libblkid/src/superblocks/jmicron_raid.c
index ca7986733..9ef8cd3f8 100644
--- a/libblkid/src/superblocks/jmicron_raid.c
+++ b/libblkid/src/superblocks/jmicron_raid.c
@@ -16,14 +16,75 @@
#include "superblocks.h"
+#define JM_SIGNATURE "JM"
+#define JM_MINOR_VERSION(_x) ((_x)->version & 0xFF)
+#define JM_MAJOR_VERSION(_x) ((_x)->version >> 8)
+#define JM_SPARES 2
+#define JM_MEMBERS 8
+
struct jm_metadata {
- int8_t signature[2];
- uint8_t minor_version;
- uint8_t major_version;
- uint16_t checksum;
-};
+ int8_t signature[2]; /* 0x0 - 0x01 */
-#define JM_SIGNATURE "JM"
+ uint16_t version; /* 0x03 - 0x04 JMicron version */
+
+ uint16_t checksum; /* 0x04 - 0x05 */
+ uint8_t filler[10];
+
+ uint32_t identity; /* 0x10 - 0x13 */
+
+ struct {
+ uint32_t base; /* 0x14 - 0x17 */
+ uint32_t range; /* 0x18 - 0x1B range */
+ uint16_t range2; /* 0x1C - 0x1D range2 */
+ } segment;
+
+ int8_t name[16]; /* 0x20 - 0x2F */
+
+ uint8_t mode; /* 0x30 RAID level */
+ uint8_t block; /* 0x31 stride size (2=4K, 3=8K, ...) */
+ uint16_t attribute; /* 0x32 - 0x33 */
+ uint8_t filler1[4];
+
+ uint32_t spare[JM_SPARES]; /* 0x38 - 0x3F */
+ uint32_t member[JM_MEMBERS]; /* 0x40 - 0x5F */
+
+ uint8_t filler2[0x20];
+} __attribute__ ((packed));
+
+static void jm_to_cpu(struct jm_metadata *jm)
+{
+ unsigned int i;
+
+ le16_to_cpu(jm->version);
+ le16_to_cpu(jm->checksum);
+ le32_to_cpu(jm->identity);
+
+ le32_to_cpu(jm->segment.base);
+ le32_to_cpu(jm->segment.range);
+ le16_to_cpu(jm->segment.range2);
+
+ le16_to_cpu(jm->attribute);
+
+ for (i = 0; i < JM_SPARES; i++)
+ le32_to_cpu(jm->spare[i]);
+
+ for (i = 0; i < JM_MEMBERS; i++)
+ le32_to_cpu(jm->member[i]);
+}
+
+static int jm_checksum(struct jm_metadata *jm)
+{
+ size_t count = 64;
+ char *buf = (char *) jm;
+ uint16_t *p = (uint16_t *) buf, sum = 0;
+
+ assert(count <= sizeof(struct jm_metadata));
+
+ while (count--)
+ sum += *p++;
+
+ return !sum || sum == 1;
+}
static int probe_jmraid(blkid_probe pr,
const struct blkid_idmag *mag __attribute__((__unused__)))
@@ -46,8 +107,14 @@ static int probe_jmraid(blkid_probe pr,
if (memcmp(jm->signature, JM_SIGNATURE, sizeof(JM_SIGNATURE) - 1) != 0)
return 1;
+
+ jm_to_cpu(jm);
+
+ if (!jm_checksum(jm))
+ return 1;
+
if (blkid_probe_sprintf_version(pr, "%u.%u",
- jm->major_version, jm->minor_version) != 0)
+ JM_MAJOR_VERSION(jm), JM_MINOR_VERSION(jm)) != 0)
return 1;
if (blkid_probe_set_magic(pr, off, sizeof(jm->signature),
(unsigned char *) jm->signature))
@@ -61,5 +128,3 @@ const struct blkid_idinfo jmraid_idinfo = {
.probefunc = probe_jmraid,
.magics = BLKID_NONE_MAGIC
};
-
-
--
2.27.0

View File

@ -1,62 +0,0 @@
From dd405ea745e451fb0cf32e9dedd94d69850fe333 Mon Sep 17 00:00:00 2001
From: Toomas Losin <tlo@lenrek.net>
Date: Sun, 5 Mar 2023 15:57:55 -0800
Subject: [PATCH] libfdisk: Fix randomly generated GPT UUID's
Fdisk commands that create random GPT UUID's result in values that are
not UEFI-compliant being written to disk: The "g" command creates a
new GPT whose in-core DiskGUID value is entirely big-endian; the "n"
command creates a GPT partition whose in-core UniquePartitionGUID
value is entirely big-endian. Those big-endian values are written to
disk by the "w" command rather than the mix of little- and big-endian
spec'd by UEFI.
This was caused by a libfdisk patch in 2017 that was addressing
warnings about "taking address of packed member". Reading gpt.c finds
two instances of dead code which suggests that perhaps there was some
confusion between a struct and a pointer to a struct. The intent must
have been to convert the randomly generated big-endian RFC 4122 UUID
values to UEFI's mixed-endian but the confusion(?) resulted in some
dead code and non-conversion of the UUID's.
This patch corrects the breakage while still avoiding "taking address
of packed member" warnings. The "w" command will once again write
UEFI-compliant values to disk.
Fixes: 92e486f80ef8 ("libfdisk: fix guid usage of packed struct gpt_entry")
Signed-off-by: Toomas Losin <tlo@lenrek.net>
---
libfdisk/src/gpt.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/libfdisk/src/gpt.c b/libfdisk/src/gpt.c
index d7b3e1c70..c3c0347cb 100644
--- a/libfdisk/src/gpt.c
+++ b/libfdisk/src/gpt.c
@@ -878,9 +878,9 @@ static int gpt_mknew_header(struct fdisk_context *cxt,
if (!has_id) {
struct gpt_guid guid;
- uuid_generate_random((unsigned char *) &header->disk_guid);
- guid = header->disk_guid;
+ uuid_generate_random((unsigned char *) &guid);
swap_efi_guid(&guid);
+ header->disk_guid = guid;
}
return 0;
}
@@ -2621,9 +2621,9 @@ static int gpt_add_partition(
*/
struct gpt_guid guid;
- uuid_generate_random((unsigned char *) &e->partition_guid);
- guid = e->partition_guid;
+ uuid_generate_random((unsigned char *) &guid);
swap_efi_guid(&guid);
+ e->partition_guid = guid;
}
if (pa && pa->name && *pa->name)
--
2.27.0

View File

@ -1,43 +0,0 @@
From e31e28848e7e5887b0dd48f5bb5ce3c8055eee1e Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 18 Aug 2021 11:35:07 +0200
Subject: [PATCH] libfdisk: check calloc() return [gcc-analyzer]
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libfdisk/src/ask.c | 4 ++++
libfdisk/src/item.c | 3 +++
2 files changed, 7 insertions(+)
diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c
index 31f95fb..274f6ba 100644
--- a/libfdisk/src/ask.c
+++ b/libfdisk/src/ask.c
@@ -36,6 +36,10 @@ int fdisk_set_ask(struct fdisk_context *cxt,
struct fdisk_ask *fdisk_new_ask(void)
{
struct fdisk_ask *ask = calloc(1, sizeof(struct fdisk_ask));
+
+ if (!ask)
+ return NULL;
+
DBG(ASK, ul_debugobj(ask, "alloc"));
ask->refcount = 1;
return ask;
diff --git a/libfdisk/src/item.c b/libfdisk/src/item.c
index 86fa0fb..671f9ad 100644
--- a/libfdisk/src/item.c
+++ b/libfdisk/src/item.c
@@ -40,6 +40,9 @@ struct fdisk_labelitem *fdisk_new_labelitem(void)
{
struct fdisk_labelitem *li = calloc(1, sizeof(*li));
+ if (!li)
+ return NULL;
+
li->refcount = 1;
DBG(ITEM, ul_debugobj(li, "alloc"));
return li;
--
1.8.3.1

View File

@ -1,27 +0,0 @@
From fb1689c1de5fdc945c599aa46b483fa5e1333935 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 18 Aug 2021 11:15:55 +0200
Subject: [PATCH] libfdisk: dereference of possibly-NULL [gcc-analyzer]
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libfdisk/src/parttype.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/libfdisk/src/parttype.c b/libfdisk/src/parttype.c
index 3a5db9c..271b671 100644
--- a/libfdisk/src/parttype.c
+++ b/libfdisk/src/parttype.c
@@ -26,6 +26,9 @@ struct fdisk_parttype *fdisk_new_parttype(void)
{
struct fdisk_parttype *t = calloc(1, sizeof(*t));
+ if (!t)
+ return NULL;
+
t->refcount = 1;
t->flags = FDISK_PARTTYPE_ALLOCATED;
DBG(PARTTYPE, ul_debugobj(t, "alloc"));
--
1.8.3.1

View File

@ -1,113 +0,0 @@
From b8f2fce2a20944cd8b1a7e91dfa04f9725ec3eb8 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 18 Nov 2021 11:47:08 +0100
Subject: [PATCH] libmount: (--all) continue although /proc is not mounted
Now 'mount --all' ends with error if /proc is not mounted and there is
some other entry before /proc in fstab. This commit improves this
situation and ignores all mount table related errors if the table is
empty.
This is important for situation when there is for example "/" as the
first line in fstab.
Addresses: https://github.com/util-linux/util-linux/issues/1492
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/context.c | 25 +++++++++++++++++--------
libmount/src/context_mount.c | 9 ++++++++-
sys-utils/mount.8.adoc | 2 ++
3 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/libmount/src/context.c b/libmount/src/context.c
index 3b32224..bd215c0 100644
--- a/libmount/src/context.c
+++ b/libmount/src/context.c
@@ -1298,6 +1298,16 @@ int mnt_context_get_mtab(struct libmnt_context *cxt, struct libmnt_table **tb)
cxt->table_fltrcb_data);
mnt_table_set_cache(cxt->mtab, mnt_context_get_cache(cxt));
+ }
+
+ /* Read the table; it's empty, because this first mnt_context_get_mtab()
+ * call, or because /proc was not accessible in previous calls */
+ if (mnt_table_is_empty(cxt->mtab)) {
+ if (!ns_old) {
+ ns_old = mnt_context_switch_target_ns(cxt);
+ if (!ns_old)
+ return -MNT_ERR_NAMESPACE;
+ }
/*
* Note that mtab_path is NULL if mtab is useless or unsupported
@@ -2874,7 +2884,7 @@ int mnt_context_is_fs_mounted(struct libmnt_context *cxt,
struct libmnt_fs *fs, int *mounted)
{
struct libmnt_table *mtab, *orig;
- int rc;
+ int rc = 0;
struct libmnt_ns *ns_old;
if (!cxt || !fs || !mounted)
@@ -2893,18 +2903,17 @@ int mnt_context_is_fs_mounted(struct libmnt_context *cxt,
cxt->mtab = NULL;
}
*mounted = 0;
- return 0; /* /proc not mounted */
- }
+ rc = 0; /* /proc not mounted */
- if (rc)
- return rc;
-
- *mounted = __mnt_table_is_fs_mounted(mtab, fs,
+ } else if (rc == 0) {
+ *mounted = __mnt_table_is_fs_mounted(mtab, fs,
mnt_context_get_target_prefix(cxt));
+ }
+
if (!mnt_context_switch_ns(cxt, ns_old))
return -MNT_ERR_NAMESPACE;
- return 0;
+ return rc;
}
static int mnt_context_add_child(struct libmnt_context *cxt, pid_t pid)
diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c
index 55ebf79..f9bedd2 100644
--- a/libmount/src/context_mount.c
+++ b/libmount/src/context_mount.c
@@ -1397,8 +1397,15 @@ int mnt_context_next_mount(struct libmnt_context *cxt,
/* ignore already mounted filesystems */
rc = mnt_context_is_fs_mounted(cxt, *fs, &mounted);
- if (rc)
+ if (rc) {
+ if (mnt_table_is_empty(cxt->mtab)) {
+ DBG(CXT, ul_debugobj(cxt, "next-mount: no mount table [rc=%d], ignore", rc));
+ rc = 0;
+ if (ignored)
+ *ignored = 1;
+ }
return rc;
+ }
if (mounted) {
if (ignored)
*ignored = 2;
diff --git a/sys-utils/mount.8.adoc b/sys-utils/mount.8.adoc
index 6e72d48..e8f0c36 100644
--- a/sys-utils/mount.8.adoc
+++ b/sys-utils/mount.8.adoc
@@ -301,6 +301,8 @@ Command-line options available for the *mount* command are:
*-a*, *--all*::
Mount all filesystems (of the given types) mentioned in _fstab_ (except for those whose line contains the *noauto* keyword). The filesystems are mounted following their order in _fstab_. The *mount* command compares filesystem source, target (and fs root for bind mount or btrfs) to detect already mounted filesystems. The kernel table with already mounted filesystems is cached during *mount --all*. This means that all duplicated _fstab_ entries will be mounted.
+
+The correct functionality depends on /proc (to detect already mounted filesystems) and on /sys (to evaluate filesystem tags like UUID= or LABEL=). It's strongly recommended to mount /proc and /sys filesystems before *mount -a* is executed, or keep /proc and /sys at the beginning of fstab.
++
The option *--all* is possible to use for remount operation too. In this case all filters (*-t* and *-O*) are applied to the table of already mounted filesystems.
+
Since version 2.35 is possible to use the command line option *-o* to alter mount options from _fstab_ (see also *--options-mode*).
--
2.27.0

View File

@ -1,37 +0,0 @@
ssFrom fbc09df31a1f89b02ae13b21c949728ad82f5713 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 17 Mar 2022 13:00:44 +0100
Subject: [PATCH] libmount: fix possible memory leak in
mnt_optstr_fix_secontext() [coverity scan]
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/optstr.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/libmount/src/optstr.c b/libmount/src/optstr.c
index 16800f5..97fd6da 100644
--- a/libmount/src/optstr.c
+++ b/libmount/src/optstr.c
@@ -908,12 +908,16 @@ int mnt_optstr_fix_secontext(char **optstr,
/* create a quoted string from the raw context */
sz = strlen((char *) raw);
- if (!sz)
+ if (!sz) {
+ freecon(raw);
return -EINVAL;
+ }
p = val = malloc(valsz + 3);
- if (!val)
+ if (!val) {
+ freecon(raw);
return -ENOMEM;
+ }
*p++ = '"';
memcpy(p, raw, sz);
--
2.27.0

View File

@ -1,121 +0,0 @@
From 4681d88ba1034d488814bbbb6e7d06d17e33322d Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 16 Nov 2022 09:17:52 +0100
Subject: [PATCH] llib/pty-session: split PTY and signalfd setup
In some cases applications need to use PTY before signalfd is enabled.
Signed-off-by: Karel Zak <kzak@redhat.com>
---
include/pty-session.h | 1 +
lib/pty-session.c | 29 +++++++++++++++++++++++++----
login-utils/su-common.c | 2 ++
term-utils/scriptlive.c | 2 ++
4 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/include/pty-session.h b/include/pty-session.h
index 09eff43..3242992 100644
--- a/include/pty-session.h
+++ b/include/pty-session.h
@@ -98,6 +98,7 @@ void ul_pty_set_child(struct ul_pty *pty, pid_t child);
struct ul_pty_callbacks *ul_pty_get_callbacks(struct ul_pty *pty);
int ul_pty_is_running(struct ul_pty *pty);
int ul_pty_setup(struct ul_pty *pty);
+int ul_pty_signals_setup(struct ul_pty *pty);
void ul_pty_cleanup(struct ul_pty *pty);
int ul_pty_chownmod_slave(struct ul_pty *pty, uid_t uid, gid_t gid, mode_t mode);
void ul_pty_init_slave(struct ul_pty *pty);
diff --git a/lib/pty-session.c b/lib/pty-session.c
index 6f038e1..d89dfbb 100644
--- a/lib/pty-session.c
+++ b/lib/pty-session.c
@@ -149,12 +149,12 @@ static void pty_signals_cleanup(struct ul_pty *pty)
int ul_pty_setup(struct ul_pty *pty)
{
struct termios attrs;
- sigset_t ourset;
int rc = 0;
assert(pty->sigfd == -1);
- /* save the current signals setting */
+ /* save the current signals setting (to make ul_pty_cleanup() usable,
+ * otherwise see ul_pty_signals_setup() */
sigprocmask(0, NULL, &pty->orgsig);
if (pty->isterm) {
@@ -198,6 +198,26 @@ int ul_pty_setup(struct ul_pty *pty)
tcsetattr(pty->slave, TCSANOW, &attrs);
}
+done:
+ if (rc)
+ ul_pty_cleanup(pty);
+
+ DBG(SETUP, ul_debugobj(pty, "pty setup done [master=%d, slave=%d, rc=%d]",
+ pty->master, pty->slave, rc));
+ return rc;
+}
+
+/* call me before fork() */
+int ul_pty_signals_setup(struct ul_pty *pty)
+{
+ sigset_t ourset;
+ int rc = 0;
+
+ assert(pty->sigfd == -1);
+
+ /* save the current signals setting */
+ sigprocmask(0, NULL, &pty->orgsig);
+
sigfillset(&ourset);
if (sigprocmask(SIG_BLOCK, &ourset, NULL)) {
rc = -errno;
@@ -221,8 +241,7 @@ done:
if (rc)
ul_pty_cleanup(pty);
- DBG(SETUP, ul_debugobj(pty, "pty setup done [master=%d, slave=%d, rc=%d]",
- pty->master, pty->slave, rc));
+ DBG(SETUP, ul_debugobj(pty, "pty signals setup done [rc=%d]", rc));
return rc;
}
@@ -692,6 +711,8 @@ int main(int argc, char *argv[])
if (ul_pty_setup(pty))
err(EXIT_FAILURE, "failed to create pseudo-terminal");
+ if (ul_pty_signals_setup(pty))
+ err(EXIT_FAILURE, "failed to initialize signals handler");
fflush(stdout); /* ??? */
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
index afd0ea8..46dc116 100644
--- a/login-utils/su-common.c
+++ b/login-utils/su-common.c
@@ -536,6 +536,8 @@ static void create_watching_parent(struct su_context *su)
/* create pty */
if (ul_pty_setup(su->pty))
err(EXIT_FAILURE, _("failed to create pseudo-terminal"));
+ if (ul_pty_signals_setup(su->pty))
+ err(EXIT_FAILURE, _("failed to initialize signals handler"));
}
#endif
fflush(stdout); /* ??? */
diff --git a/term-utils/scriptlive.c b/term-utils/scriptlive.c
index d81712d..3e68f3c 100644
--- a/term-utils/scriptlive.c
+++ b/term-utils/scriptlive.c
@@ -294,6 +294,8 @@ main(int argc, char *argv[])
if (ul_pty_setup(ss.pty))
err(EXIT_FAILURE, _("failed to create pseudo-terminal"));
+ if (ul_pty_signals_setup(ss.pty))
+ err(EXIT_FAILURE, _("failed to initialize signals handler"));
fflush(stdout); /* ??? */
--
2.27.0

View File

@ -1,98 +0,0 @@
From 96ccdc00e1fcf1684f9734a189baf90e00ff0c9a Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 1 Nov 2022 10:30:06 +0100
Subject: [PATCH] logger: always update header when read from stdin
The current code updates the header only when the priority has been
changed. It's incorrect because wanted is a valid header or each entry
(don't forget that logger for stdin use-case is used in pipe to log
long-time running processes).
This patch also fixes the initial timestamp; it was originally generated
on logger startup, it now generates the header on the first message.
$ (sleep 2; date; sleep 2; date; sleep 2; date) | logger --stderr --no-act
old:
<13>Nov 1 10:42:14 kzak: Tue Nov 1 10:42:16 AM CET 2022
<13>Nov 1 10:42:14 kzak: Tue Nov 1 10:42:18 AM CET 2022
<13>Nov 1 10:42:14 kzak: Tue Nov 1 10:42:20 AM CET 2022
new:
<13>Nov 1 10:19:02 kzak: Tue Nov 1 10:19:02 AM CET 2022
<13>Nov 1 10:19:04 kzak: Tue Nov 1 10:19:04 AM CET 2022
<13>Nov 1 10:19:06 kzak: Tue Nov 1 10:19:06 AM CET 2022
Fixes: https://github.com/util-linux/util-linux/issues/1866
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/logger.c | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/misc-utils/logger.c b/misc-utils/logger.c
index a29b9e4..0f2a849 100644
--- a/misc-utils/logger.c
+++ b/misc-utils/logger.c
@@ -920,8 +920,6 @@ static void logger_open(struct logger_ctl *ctl)
ctl->tag = xgetlogin();
if (!ctl->tag)
ctl->tag = "<someone>";
-
- generate_syslog_header(ctl);
}
/* re-open; usually after failed connection */
@@ -971,10 +969,8 @@ static void logger_stdin(struct logger_ctl *ctl)
{
/* note: we re-generate the syslog header for each log message to
* update header timestamps and to reflect possible priority changes.
- * The initial header is generated by logger_open().
*/
int default_priority = ctl->pri;
- int last_pri = default_priority;
char *buf = xmalloc(ctl->max_message_size + 2 + 2);
int pri;
int c;
@@ -1001,10 +997,6 @@ static void logger_stdin(struct logger_ctl *ctl)
} else
ctl->pri = default_priority;
- if (ctl->pri != last_pri) {
- generate_syslog_header(ctl);
- last_pri = ctl->pri;
- }
if (c != EOF && c != '\n')
c = getchar();
}
@@ -1015,8 +1007,10 @@ static void logger_stdin(struct logger_ctl *ctl)
}
buf[i] = '\0';
- if (i > 0 || !ctl->skip_empty_lines)
+ if (i > 0 || !ctl->skip_empty_lines) {
+ generate_syslog_header(ctl);
write_output(ctl, buf);
+ }
if (c == '\n') /* discard line terminator */
c = getchar();
@@ -1291,12 +1285,14 @@ int main(int argc, char **argv)
abort();
}
logger_open(&ctl);
- if (0 < argc)
+ if (0 < argc) {
+ generate_syslog_header(&ctl);
logger_command_line(&ctl, argv);
- else
+ } else
/* Note. --file <arg> reopens stdin making the below
* function to be used for file inputs. */
logger_stdin(&ctl);
+
logger_close(&ctl);
return EXIT_SUCCESS;
}
--
2.27.0

View File

@ -1,37 +0,0 @@
From dbe693413205ba2c3d06a42e85b47b1bd713bfee Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 16 Sep 2021 12:20:25 +0200
Subject: [PATCH] logger: fix --prio-prefix doesn't use --priority default
The commit b9ef27f have added priority check, but it introduced
regression as the default priority (as specified by --priority) is
ignored.
This patch fixes this problem, but it also removes extra check for
"kern facility", it's unnecessary and inconsistent with the rest of
logger.
Fixes: https://github.com/karelzak/util-linux/issues/1450
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/logger.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/misc-utils/logger.c b/misc-utils/logger.c
index 5b122de..0e7ac8d 100644
--- a/misc-utils/logger.c
+++ b/misc-utils/logger.c
@@ -997,8 +997,8 @@ static void logger_stdin(struct logger_ctl *ctl)
if (c == '>' && 0 <= pri && pri <= 191) {
/* valid RFC PRI values */
i = 0;
- if (pri < 8) /* kern facility is forbidden */
- pri |= 8;
+ if ((pri & LOG_FACMASK) == 0)
+ pri |= (default_priority & LOG_FACMASK);
ctl->pri = pri;
} else
ctl->pri = default_priority;
--
1.8.3.1

View File

@ -1,58 +0,0 @@
From 7ba741a50a04e8e72861e90132394996f2d82006 Mon Sep 17 00:00:00 2001
From: Daan De Meyer <daan.j.demeyer@gmail.com>
Date: Sat, 30 Oct 2021 15:56:14 +0100
Subject: [PATCH] login: Restore tty size after calling vhangup()
If login receives the tty to work on via stdin, stdout and stderr,
login might end up closing the remaining open file descriptors to
the tty just before it calls vhangup(). When the last open file
descriptors to a tty are closed, it's configured size is reset to
0x0. To avoid this from happening, save the size before closing
the stdin, stdout and stderr file descriptors and reapply the size
after the tty is re-opened.
Fixes #1484
---
login-utils/login.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/login-utils/login.c b/login-utils/login.c
index 3657f04..c9f6d59 100644
--- a/login-utils/login.c
+++ b/login-utils/login.c
@@ -513,6 +513,7 @@ static void init_tty(struct login_context *cxt)
{
struct stat st;
struct termios tt, ttt;
+ struct winsize ws;
cxt->tty_mode = (mode_t) getlogindefs_num("TTYPERM", TTY_MODE);
@@ -543,6 +544,12 @@ static void init_tty(struct login_context *cxt)
}
#endif
+ /* The TTY size might be reset to 0x0 by the kernel when we close the stdin/stdout/stderr file
+ * descriptors so let's save the size now so we can reapply it later */
+ memset(&ws, 0, sizeof(struct winsize));
+ if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) < 0)
+ syslog(LOG_WARNING, _("TIOCGWINSZ ioctl failed: %m"));
+
tcgetattr(0, &tt);
ttt = tt;
ttt.c_cflag &= ~HUPCL;
@@ -574,6 +581,11 @@ static void init_tty(struct login_context *cxt)
/* restore tty modes */
tcsetattr(0, TCSAFLUSH, &tt);
+
+ /* Restore tty size */
+ if (ws.ws_row > 0 || ws.ws_col > 0)
+ if (ioctl(STDIN_FILENO, TIOCSWINSZ, &ws) < 0)
+ syslog(LOG_WARNING, _("TIOCSWINSZ ioctl failed: %m"));
}
/*
--
1.8.3.1

View File

@ -1,41 +0,0 @@
From 4bbda92cdd0ceacc982f759d97d35b1617a8beba Mon Sep 17 00:00:00 2001
From: Samanta Navarro <ferivoz@riseup.net>
Date: Wed, 11 Jan 2023 11:57:21 +0000
Subject: [PATCH] login: never send signals to init
If the signal handler is triggered after a failed fork attempt, then
child_pid will be -1. This in turn leads to a positive test and a
subsequent call of kill(1, signal). If signal was SIGTERM, then there
will be also another kill(1, SIGHUP) call.
Test explicitly for a positive child_pid value to prevent these cases.
Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
---
login-utils/login.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/login-utils/login.c b/login-utils/login.c
index 2c146b977..74bdf38a4 100644
--- a/login-utils/login.c
+++ b/login-utils/login.c
@@ -203,12 +203,12 @@ static void timedout(int sig __attribute__((__unused__)))
*/
static void sig_handler(int signal)
{
- if (child_pid)
+ if (child_pid > 0) {
kill(-child_pid, signal);
- else
+ if (signal == SIGTERM)
+ kill(-child_pid, SIGHUP); /* because the shell often ignores SIGTERM */
+ } else
got_sig = 1;
- if (signal == SIGTERM)
- kill(-child_pid, SIGHUP); /* because the shell often ignores SIGTERM */
}
/*
--
2.27.0

View File

@ -1,46 +0,0 @@
From 854abba0dd9b45b4f40a9c934694b3f14052eceb Mon Sep 17 00:00:00 2001
From: Hideki EIRAKU <hdk@igel.co.jp>
Date: Wed, 25 May 2022 12:23:16 +0900
Subject: [PATCH] loopdev: set block_size when using LOOP_CONFIGURE
LOOP_CONFIGURE ioctl was introduced by commit
d5fd456c88aba4fcf77d35fe38024a8d5c814686. Since the previous
implementation set partscan flag but did not set block_size with the
LOOP_CONFIGURE ioctl, an issue fixed by commit
422f0e9f206a145c59a71333dad20d38cbbfc0c4 was reappeared. Setting
block_size in the LOOP_CONFIGURE ioctl parameter fixes the issue.
Signed-off-by: Hideki EIRAKU <hdk@igel.co.jp>
---
lib/loopdev.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/lib/loopdev.c b/lib/loopdev.c
index d9ea1d4..0afe300 100644
--- a/lib/loopdev.c
+++ b/lib/loopdev.c
@@ -1357,6 +1357,9 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
* -- since Linux v5.8-rc1, commit 3448914e8cc550ba792d4ccc74471d1ca4293aae
*/
lc->config.fd = file_fd;
+ if (lc->blocksize > 0)
+ lc->config.block_size = lc->blocksize;
+
if (ioctl(dev_fd, LOOP_CONFIGURE, &lc->config) < 0) {
rc = -errno;
errsv = errno;
@@ -1366,11 +1369,6 @@ int loopcxt_setup_device(struct loopdev_cxt *lc)
}
fallback = 1;
} else {
- if (lc->blocksize > 0
- && (rc = loopcxt_ioctl_blocksize(lc, lc->blocksize)) < 0) {
- errsv = -rc;
- goto err;
- }
DBG(SETUP, ul_debugobj(lc, "LOOP_CONFIGURE: OK"));
}
--
2.27.0

View File

@ -1,23 +0,0 @@
From 01dd2838b4f60888fc66ccb9aa0f44907d1851a4 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 8 Mar 2022 13:06:45 +0100
Subject: [PATCH] losetup: fix memory leak [asan]
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/losetup.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sys-utils/losetup.c b/sys-utils/losetup.c
index 09c028b6b4..1d81b117ac 100644
--- a/sys-utils/losetup.c
+++ b/sys-utils/losetup.c
@@ -239,7 +239,7 @@ static int set_scols_data(struct loopdev_cxt *lc, struct libscols_line *ln)
p = loopcxt_get_device(lc);
break;
case COL_BACK_FILE:
- p = loopcxt_get_backing_file(lc);
+ np = loopcxt_get_backing_file(lc);
break;
case COL_OFFSET:
if (loopcxt_get_offset(lc, &x) == 0)

View File

@ -1,41 +0,0 @@
From 9eb31ca7f7971101846bd3668be5d7807200fa2f Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 19 Sep 2022 14:23:25 +0200
Subject: [PATCH] lsblk: fix endless loop if device specified more than once
Fixes: https://github.com/util-linux/util-linux/issues/1814
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/lsblk-devtree.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/misc-utils/lsblk-devtree.c b/misc-utils/lsblk-devtree.c
index ce9d3e84f7..6f9dc54b3c 100644
--- a/misc-utils/lsblk-devtree.c
+++ b/misc-utils/lsblk-devtree.c
@@ -282,8 +282,25 @@ void lsblk_unref_devtree(struct lsblk_devtree *tr)
}
}
+static int has_root(struct lsblk_devtree *tr, struct lsblk_device *dev)
+{
+ struct lsblk_iter itr;
+ struct lsblk_device *x = NULL;
+
+ lsblk_reset_iter(&itr, LSBLK_ITER_FORWARD);
+
+ while (lsblk_devtree_next_root(tr, &itr, &x) == 0) {
+ if (x == dev)
+ return 1;
+ }
+ return 0;
+}
+
int lsblk_devtree_add_root(struct lsblk_devtree *tr, struct lsblk_device *dev)
{
+ if (has_root(tr, dev))
+ return 0;
+
if (!lsblk_devtree_has_device(tr, dev))
lsblk_devtree_add_device(tr, dev);

View File

@ -1,34 +0,0 @@
From 0da947eb78e3f37f63f33157562c221805ec7fe9 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 17 Apr 2023 10:50:08 +0200
Subject: [PATCH] lscpu: fix -p --output-all caches delimiter
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2187099
Signed-off-by: Karel Zak <kzak@redhat.com>
---
sys-utils/lscpu.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c
index 3f28db61c..8333dcbea 100644
--- a/sys-utils/lscpu.c
+++ b/sys-utils/lscpu.c
@@ -1444,6 +1444,7 @@ int main(int argc, char *argv[])
print_cpus_readable(cxt, columns, ncolumns);
break;
case LSCPU_OUTPUT_PARSABLE:
+ cxt->show_compatible = 1;
if (!ncolumns) {
columns[ncolumns++] = COL_CPU_CPU;
columns[ncolumns++] = COL_CPU_CORE;
@@ -1453,7 +1454,6 @@ int main(int argc, char *argv[])
columns[ncolumns++] = COL_CPU_SOCKET;
columns[ncolumns++] = COL_CPU_NODE;
columns[ncolumns++] = COL_CPU_CACHE;
- cxt->show_compatible = 1;
}
if (outarg && string_add_to_idarray(outarg, columns,
ARRAY_SIZE(columns),
--
2.27.0

View File

@ -1,28 +0,0 @@
From 9b725af7028163bd29d39da3b910dffc903107ee Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 28 Mar 2022 11:39:27 +0200
Subject: [PATCH] lslocks: fix maj:min scanf
Fixes: https://github.com/util-linux/util-linux/issues/1633
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/lslocks.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/misc-utils/lslocks.c b/misc-utils/lslocks.c
index 941ef7f..6427318 100644
--- a/misc-utils/lslocks.c
+++ b/misc-utils/lslocks.c
@@ -224,7 +224,8 @@ static ino_t get_dev_inode(char *str, dev_t *dev)
unsigned int maj = 0, min = 0;
ino_t inum = 0;
- sscanf(str, "%02x:%02x:%ju", &maj, &min, &inum);
+ if (sscanf(str, "%x:%x:%ju", &maj, &min, &inum) != 3)
+ errx(EXIT_FAILURE, _("failed to parse '%s'"), str);
*dev = (dev_t) makedev(maj, min);
return inum;
--
2.27.0

View File

@ -1,33 +0,0 @@
From 890d4d3f236e2d28db35ea9bc9dc3e5e35db975c Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 7 Jun 2022 09:46:54 +0200
Subject: [PATCH] lslogins: fix free(): invalid pointer
Signed-off-by: Karel Zak <kzak@redhat.com>
---
login-utils/lslogins.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c
index 3646883e0e..3cb30b74e2 100644
--- a/login-utils/lslogins.c
+++ b/login-utils/lslogins.c
@@ -490,7 +490,7 @@ static int parse_utmpx(const char *path, size_t *nrecords, struct utmpx **record
/* optimize allocation according to file size, the realloc() below is
* just fallback only */
- if (stat(path, &st) == 0 && (size_t) st.st_size > sizeof(struct utmpx)) {
+ if (stat(path, &st) == 0 && (size_t) st.st_size >= sizeof(struct utmpx)) {
imax = st.st_size / sizeof(struct utmpx);
ary = xmalloc(imax * sizeof(struct utmpx));
}
@@ -1013,6 +1013,9 @@ static void free_ctl(struct lslogins_control *ctl)
{
size_t n = 0;
+ if (!ctl)
+ return;
+
free(ctl->wtmp);
free(ctl->btmp);

View File

@ -1,88 +0,0 @@
From c51cba1e838ae7e36a843ec785543492bb8737cd Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 7 Jun 2022 09:11:56 +0200
Subject: [PATCH] lslogins: improve prefixes interpretation
It seems that for example 'passwd --lock' uses two exclamation marks
in password field. It seems better to assume arbitrary number of '!'
and '*' prefixes.
The patch also makes description of the PWD-EMPTY output field more
explicit.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=2093166
Signed-off-by: Karel Zak <kzak@redhat.com>
---
login-utils/lslogins.c | 33 ++++++++++++++++++++++++++-------
1 file changed, 26 insertions(+), 7 deletions(-)
diff --git a/login-utils/lslogins.c b/login-utils/lslogins.c
index 4a1c62fe9d..3646883e0e 100644
--- a/login-utils/lslogins.c
+++ b/login-utils/lslogins.c
@@ -226,7 +226,7 @@ static const struct lslogins_coldesc coldescs[] =
{
[COL_USER] = { "USER", N_("user name"), N_("Username"), 0.1, SCOLS_FL_NOEXTREMES },
[COL_UID] = { "UID", N_("user ID"), "UID", 1, SCOLS_FL_RIGHT},
- [COL_PWDEMPTY] = { "PWD-EMPTY", N_("password not required"), N_("Password not required"), 1, SCOLS_FL_RIGHT },
+ [COL_PWDEMPTY] = { "PWD-EMPTY", N_("password not defined"), N_("Password not required (empty)"), 1, SCOLS_FL_RIGHT },
[COL_PWDDENY] = { "PWD-DENY", N_("login by password disabled"), N_("Login by password disabled"), 1, SCOLS_FL_RIGHT },
[COL_PWDLOCK] = { "PWD-LOCK", N_("password defined, but locked"), N_("Password is locked"), 1, SCOLS_FL_RIGHT },
[COL_PWDMETHOD] = { "PWD-METHOD", N_("password encryption method"), N_("Password encryption method"), 0.1 },
@@ -823,23 +823,42 @@ static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const c
break;
case COL_PWDEMPTY:
if (shadow) {
- if (!*shadow->sp_pwdp) /* '\0' */
+ const char *p = shadow->sp_pwdp;
+
+ while (p && (*p == '!' || *p == '*'))
+ p++;
+
+ if (!p || !*p)
user->pwd_empty = STATUS_TRUE;
} else
user->pwd_empty = STATUS_UNKNOWN;
break;
case COL_PWDDENY:
if (shadow) {
- if ((*shadow->sp_pwdp == '!' ||
- *shadow->sp_pwdp == '*') &&
- !valid_pwd(shadow->sp_pwdp + 1))
+ const char *p = shadow->sp_pwdp;
+
+ while (p && (*p == '!' || *p == '*'))
+ p++;
+
+ if (p && *p && p != shadow->sp_pwdp && !valid_pwd(p))
user->pwd_deny = STATUS_TRUE;
} else
user->pwd_deny = STATUS_UNKNOWN;
break;
case COL_PWDLOCK:
if (shadow) {
- if (*shadow->sp_pwdp == '!' && valid_pwd(shadow->sp_pwdp + 1))
+ const char *p = shadow->sp_pwdp;
+ int i = 0;
+
+ /* 'passwd --lock' uses two exclamation marks,
+ * shadow(5) describes the lock as "field which
+ * starts with an exclamation mark". Let's
+ * support more '!' ...
+ */
+ while (p && *p == '!')
+ p++, i++;
+
+ if (i != 0 && (!*p || valid_pwd(p)))
user->pwd_lock = STATUS_TRUE;
} else
user->pwd_lock = STATUS_UNKNOWN;
@@ -848,7 +867,7 @@ static struct lslogins_user *get_user_info(struct lslogins_control *ctl, const c
if (shadow) {
const char *p = shadow->sp_pwdp;
- if (*p == '!' || *p == '*')
+ while (p && (*p == '!' || *p == '*'))
p++;
user->pwd_method = get_pwd_method(p, NULL, NULL);
} else

View File

@ -1,100 +0,0 @@
From 395f3baed6df1eb736c872ecaa3aa2f05c5dc111 Mon Sep 17 00:00:00 2001
From: lishengyu <lishengyu@uniontech.com>
Date: Thu, 23 Jun 2022 14:02:49 +0800
Subject: [PATCH] lsns: fix the memory leak.
==28129== 96 bytes in 3 blocks are possibly lost in loss record 1 of 4
==28129== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==28129== by 0x405C83: xcalloc (xalloc.h:60)
==28129== by 0x405C83: netnsid_cache_add (lsns.c:389)
==28129== by 0x405C83: get_netnsid (lsns.c:486)
==28129== by 0x405C83: read_process (lsns.c:549)
==28129== by 0x403FB4: read_processes (lsns.c:586)
==28129== by 0x403FB4: main (lsns.c:1417)
==28129==
==28129== 119,664 (384 direct, 119,280 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 4
==28129== at 0x4837B65: calloc (vg_replace_malloc.c:752)
==28129== by 0x4055F5: xcalloc (xalloc.h:60)
==28129== by 0x4055F5: read_process (lsns.c:516)
==28129== by 0x403FB4: read_processes (lsns.c:586)
==28129== by 0x403FB4: main (lsns.c:1417)
---
include/list.h | 19 +++++++++++++++++++
sys-utils/lsns.c | 25 +++++++++++++++++++++++++
2 files changed, 44 insertions(+)
diff --git a/include/list.h b/include/list.h
index 96c84e5..b6bbbdd 100644
--- a/include/list.h
+++ b/include/list.h
@@ -208,6 +208,25 @@ _INLINE_ void list_splice(struct list_head *list, struct list_head *head)
for (pos = (head)->next, pnext = pos->next; pos != (head); \
pos = pnext, pnext = pos->next)
+/**
+ * list_free - remove all entries from list and call freefunc()
+ * for each entry
+ * @head: the head for your list
+ * @type: the type of the struct this is embedded in.
+ * @member: the name of the list_struct within the struct.
+ * @freefunc: the list entry deallocator
+ */
+#define list_free(head, type, member, freefunc) \
+ do { \
+ struct list_head *__p, *__pnext; \
+ \
+ list_for_each_safe (__p, __pnext, (head)) { \
+ type *__elt = list_entry(__p, type, member); \
+ list_del(__p); \
+ freefunc(__elt); \
+ } \
+ } while (0)
+
_INLINE_ size_t list_count_entries(struct list_head *head)
{
struct list_head *pos;
diff --git a/sys-utils/lsns.c b/sys-utils/lsns.c
index 8e25ff1..baa80bd 100644
--- a/sys-utils/lsns.c
+++ b/sys-utils/lsns.c
@@ -953,6 +953,28 @@ static int show_namespace_processes(struct lsns *ls, struct lsns_namespace *ns)
return 0;
}
+static void free_lsns_process(struct lsns_process *lsns_p)
+{
+ free(lsns_p);
+}
+
+static void free_netnsid_caches(struct netnsid_cache *cache)
+{
+ free(cache);
+}
+
+static void free_lsns_namespace(struct lsns_namespace *lsns_n)
+{
+ free(lsns_n);
+}
+
+static void free_all(struct lsns *ls)
+{
+ list_free(&ls->processes, struct lsns_process, processes, free_lsns_process);
+ list_free(&netnsids_cache, struct netnsid_cache, netnsids, free_netnsid_caches);
+ list_free(&ls->namespaces, struct lsns_namespace, namespaces, free_lsns_namespace);
+}
+
static void __attribute__((__noreturn__)) usage(void)
{
FILE *out = stdout;
@@ -1162,5 +1184,8 @@ int main(int argc, char *argv[])
if (netlink_fd >= 0)
close(netlink_fd);
free_idcache(uid_cache);
+
+ free_all(&ls);
+
return r == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
--
2.27.0

View File

@ -1,26 +0,0 @@
From d380bf23fd68ebc2799eabcd86fb43de797b93d8 Mon Sep 17 00:00:00 2001
From: Hiroaki Sengoku <sengoku@senri.gcd.org>
Date: Fri, 15 Oct 2021 14:02:46 +0900
Subject: [PATCH] mcookie: fix infinite-loop when use -f
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/mcookie.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/misc-utils/mcookie.c b/misc-utils/mcookie.c
index 3157401..be5c34a 100644
--- a/misc-utils/mcookie.c
+++ b/misc-utils/mcookie.c
@@ -65,7 +65,7 @@ static uint64_t hash_file(struct mcookie_control *ctl, int fd)
rdsz = wanted - count;
r = read_all(fd, (char *) buf, rdsz);
- if (r < 0)
+ if (r <= 0)
break;
ul_MD5Update(&ctl->ctx, buf, r);
count += r;
--
1.8.3.1

View File

@ -1,46 +0,0 @@
From 6c88722c175adca5b1a72bcc770f94674405b7f4 Mon Sep 17 00:00:00 2001
From: Samanta Navarro <ferivoz@riseup.net>
Date: Fri, 13 Jan 2023 11:53:41 +0000
Subject: [PATCH] mkswap: do not use uninitialized stack value
If blkdev_get_size fails, then size is not set. Exit with an error code
and indicate what went wrong instead of continuing with random stack
content.
Proof of Concept:
```
$ mkswap /dev/null
mkswap: warning: truncating swap area to 17179869180 KiB
mkswap: /dev/null: insecure permissions 0666, fix with: chmod 0600 /dev/null
mkswap: unable to assign device to libblkid probe
```
The first output line depends on stack content and sometimes does not
show up at all. Abort operation if argument is neither regular file nor
block device.
Signed-off-by: Samanta Navarro <ferivoz@riseup.net>
---
disk-utils/mkswap.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c
index 7e2164704..bd0230177 100644
--- a/disk-utils/mkswap.c
+++ b/disk-utils/mkswap.c
@@ -345,8 +345,9 @@ static unsigned long long get_size(const struct mkswap_control *ctl)
fd = open(ctl->devname, O_RDONLY);
if (fd < 0)
err(EXIT_FAILURE, _("cannot open %s"), ctl->devname);
- if (blkdev_get_size(fd, &size) == 0)
- size /= ctl->pagesize;
+ if (blkdev_get_size(fd, &size) < 0)
+ err(EXIT_FAILURE, _("cannot determine size of %s"), ctl->devname);
+ size /= ctl->pagesize;
close(fd);
return size;
--
2.27.0

View File

@ -1,32 +0,0 @@
From 9ae0289e8142097f4d3cf91bd4d1f2a5621914c7 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 17 Mar 2022 11:22:29 +0100
Subject: [PATCH] partx: remove memory leak to make scanners happy [coverity
scan]
Signed-off-by: Karel Zak <kzak@redhat.com>
---
disk-utils/partx.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/disk-utils/partx.c b/disk-utils/partx.c
index 07b3e28b9e..76872907fe 100644
--- a/disk-utils/partx.c
+++ b/disk-utils/partx.c
@@ -1013,6 +1013,7 @@ int main(int argc, char **argv)
errx(EXIT_FAILURE, _("%s: partitioned loop devices unsupported"),
wholedisk);
assoc_loopdev(wholedisk);
+ free(wholedisk);
wholedisk = xstrdup(lc.device);
} else if (!S_ISBLK(x.st_mode))
errx(EXIT_FAILURE, _("%s: not a block device"), wholedisk);
@@ -1061,6 +1062,8 @@ int main(int argc, char **argv)
blkid_free_probe(pr);
}
+ free(wholedisk);
+
if (loopdev)
loopcxt_deinit(&lc);

View File

@ -1,34 +0,0 @@
From 521eb0571eef9352c99d8e401fc8d73d626014cf Mon Sep 17 00:00:00 2001
From: Jakub Wilk <jwilk@jwilk.net>
Date: Tue, 1 Mar 2022 17:15:45 +0100
Subject: [PATCH] script: fix passing args to execlp()
Fixes:
$ SHELL=bash script -q -c 'echo Hello world'
-c: echo Hello world: No such file or directory
Signed-off-by: Jakub Wilk <jwilk@jwilk.net>
---
term-utils/script.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/term-utils/script.c b/term-utils/script.c
index c8b55c8..89bd0ed 100644
--- a/term-utils/script.c
+++ b/term-utils/script.c
@@ -975,9 +975,9 @@ int main(int argc, char **argv)
execl(shell, shname, "-i", (char *)NULL);
} else {
if (command)
- execlp(shname, "-c", command, (char *)NULL);
+ execlp(shname, shname, "-c", command, (char *)NULL);
else
- execlp(shname, "-i", (char *)NULL);
+ execlp(shname, shname, "-i", (char *)NULL);
}
err(EXIT_FAILURE, "failed to execute %s", shell);
--
2.27.0

View File

@ -1,43 +0,0 @@
From 6ed644fbf4869a7e042826900eff531cf6660cfb Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 16 Nov 2022 09:19:18 +0100
Subject: [PATCH] script: fix use of utempter
libutempter uses SIGCHLD, but script(1) pty implementation completely
control all signals by signalfd and utempter does not work.
The solution is to setup signalfd later (after libutempter use).
Fixes: https://github.com/util-linux/util-linux/issues/1904
Signed-off-by: Karel Zak <kzak@redhat.com>
---
term-utils/script.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/term-utils/script.c b/term-utils/script.c
index c918ecd6e..516a6cf93 100644
--- a/term-utils/script.c
+++ b/term-utils/script.c
@@ -947,13 +947,16 @@ int main(int argc, char **argv)
printf(_(".\n"));
}
-#ifdef HAVE_LIBUTEMPTER
- utempter_add_record(ul_pty_get_childfd(ctl.pty), NULL);
-#endif
if (ul_pty_setup(ctl.pty))
err(EXIT_FAILURE, _("failed to create pseudo-terminal"));
+#ifdef HAVE_LIBUTEMPTER
+ utempter_add_record(ul_pty_get_childfd(ctl.pty), NULL);
+#endif
+
+ if (ul_pty_signals_setup(ctl.pty))
+ err(EXIT_FAILURE, _("failed to initialize signals handler"));
fflush(stdout);
/*
--
2.27.0

View File

@ -1,26 +0,0 @@
From 65856a0deb7200b78f858ba7dc66077f3469e924 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 2 Mar 2022 10:00:46 +0100
Subject: [PATCH] scriptlive: fix argv[0] for execlp()
Signed-off-by: Karel Zak <kzak@redhat.com>
---
term-utils/scriptlive.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/term-utils/scriptlive.c b/term-utils/scriptlive.c
index 37f092c1ff..d81712d36f 100644
--- a/term-utils/scriptlive.c
+++ b/term-utils/scriptlive.c
@@ -321,9 +321,9 @@ main(int argc, char *argv[])
execl(shell, shname, "-i", (char *)NULL);
} else {
if (command)
- execlp(shname, "-c", command, (char *)NULL);
+ execlp(shname, shname, "-c", command, (char *)NULL);
else
- execlp(shname, "-i", (char *)NULL);
+ execlp(shname, shname, "-i", (char *)NULL);
}
err(EXIT_FAILURE, "failed to execute %s", shell);
break;

View File

@ -1,26 +0,0 @@
From b383155ac6a94f14f5c661d2e4a62c1eef5b6e27 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Mon, 8 Nov 2021 14:01:55 +0100
Subject: [PATCH] sfdisk: fix typo in --move-data when check partition size
Signed-off-by: Karel Zak <kzak@redhat.com>
---
disk-utils/sfdisk.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c
index b08c945..65256c8 100644
--- a/disk-utils/sfdisk.c
+++ b/disk-utils/sfdisk.c
@@ -418,7 +418,7 @@ static int move_partition_data(struct sfdisk *sf, size_t partno, struct fdisk_pa
warnx(_("failed to get start of the old partition; ignoring --move-data"));
else if (fdisk_partition_get_start(pa) == fdisk_partition_get_start(orig_pa))
warnx(_("start of the partition has not been moved; ignoring --move-data"));
- else if (fdisk_partition_get_size(orig_pa) < fdisk_partition_get_size(pa))
+ else if (fdisk_partition_get_size(orig_pa) > fdisk_partition_get_size(pa))
warnx(_("new partition is smaller than original; ignoring --move-data"));
else
ok = 1;
--
2.27.0

View File

@ -1,51 +0,0 @@
From 9e9ad25d690b284427f9a355475bcdddb17cf1e0 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 19 Aug 2021 12:10:02 +0200
Subject: [PATCH] sfdisk: write empty label also when only ignored partition
specified
sfdisk writes empty disk label only when "label:" header specified.
Unfortunately, this feature is ignored when all specified partitions
are ignored
echo -e "label: dos\n0,0,0\n" | sfdisk /dev/sdc
Fixes: https://github.com/karelzak/util-linux/issues/1413
Signed-off-by: Karel Zak <kzak@redhat.com>
---
disk-utils/sfdisk.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c
index 526d090..b08c945 100644
--- a/disk-utils/sfdisk.c
+++ b/disk-utils/sfdisk.c
@@ -1714,7 +1714,7 @@ static void refresh_prompt_buffer(struct sfdisk *sf, const char *devname,
*/
static int command_fdisk(struct sfdisk *sf, int argc, char **argv)
{
- int rc = 0, partno = sf->partno, created = 0, unused = 0;
+ int rc = 0, partno = sf->partno, created = 0, unused = 0, ignored = 0;
struct fdisk_script *dp;
struct fdisk_table *tb = NULL;
const char *devname = NULL, *label;
@@ -1897,6 +1897,7 @@ static int command_fdisk(struct sfdisk *sf, int argc, char **argv)
if (ignore_partition(pa)) {
fdisk_info(sf->cxt, _("Ignoring partition."));
next_partno++;
+ ignored++;
continue;
}
if (!created) { /* create a new disklabel */
@@ -1960,7 +1961,7 @@ static int command_fdisk(struct sfdisk *sf, int argc, char **argv)
/* create empty disk label if label, but no partition specified */
if ((rc == SFDISK_DONE_EOF || rc == SFDISK_DONE_WRITE) && created == 0
&& fdisk_script_has_force_label(dp) == 1
- && fdisk_table_get_nents(tb) == 0
+ && fdisk_table_get_nents(tb) == (size_t) ignored
&& fdisk_script_get_header(dp, "label")) {
int xrc = fdisk_apply_script_headers(sf->cxt, dp);
--
1.8.3.1

View File

@ -1,27 +0,0 @@
From 49609c78e9441dab686da4eda38df1dcca3cacc9 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 31 Aug 2021 12:51:40 +0200
Subject: [PATCH] su: (bash-completion) offer usernames rather than files
Fixes: https://github.com/karelzak/util-linux/issues/1424
Signed-off-by: Karel Zak <kzak@redhat.com>
---
bash-completion/su | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bash-completion/su b/bash-completion/su
index 3095050..913e445 100644
--- a/bash-completion/su
+++ b/bash-completion/su
@@ -41,7 +41,7 @@ _su_module()
esac
local IFS=$'\n'
compopt -o filenames
- COMPREPLY=( $(compgen -f -- $cur) )
+ COMPREPLY=( $(compgen -u -- $cur) )
return 0
}
complete -F _su_module su
--
1.8.3.1

View File

@ -1,59 +0,0 @@
From 8efec058d7a513c18f5e5666e79006ded786221a Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 2 May 2023 11:36:49 +0200
Subject: [PATCH] sulogin: fix KDGKBMODE ifdef
* remove ifdef-else for KDGKBMODE
* always call KDGKBMODE for virtual console to get K_UNICODE status
* use KDGKBMODE as a fallback to detect serial line
Fixes: https://github.com/util-linux/util-linux/issues/2185
Suggested-by: Marcos Mello
Signed-off-by: Karel Zak <kzak@redhat.com>
---
login-utils/sulogin.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/login-utils/sulogin.c b/login-utils/sulogin.c
index 851d92d..3507272 100644
--- a/login-utils/sulogin.c
+++ b/login-utils/sulogin.c
@@ -108,7 +108,7 @@ static void tcinit(struct console *con)
struct termios *tio = &con->tio;
const int fd = con->fd;
#if defined(TIOCGSERIAL)
- struct serial_struct serinfo;
+ struct serial_struct serinfo = { .flags = 0 };
#endif
#ifdef USE_PLYMOUTH_SUPPORT
struct termios lock;
@@ -132,18 +132,18 @@ static void tcinit(struct console *con)
errno = 0;
#endif
-#if defined(TIOCGSERIAL)
+#ifdef TIOCGSERIAL
if (ioctl(fd, TIOCGSERIAL, &serinfo) >= 0)
con->flags |= CON_SERIAL;
errno = 0;
-#else
-# if defined(KDGKBMODE)
- if (ioctl(fd, KDGKBMODE, &mode) < 0)
+#endif
+
+#ifdef KDGKBMODE
+ if (!(con->flags & CON_SERIAL)
+ && ioctl(fd, KDGKBMODE, &mode) < 0)
con->flags |= CON_SERIAL;
errno = 0;
-# endif
#endif
-
if (tcgetattr(fd, tio) < 0) {
int saveno = errno;
#if defined(KDGKBMODE) || defined(TIOCGSERIAL)
--
2.33.0

View File

@ -1,227 +0,0 @@
From 0d092db5c40b94e1ea9529f3f1c384a74eca19f8 Mon Sep 17 00:00:00 2001
From: Werner Fink <werner@suse.de>
Date: Mon, 17 May 2021 17:20:32 +0200
Subject: [PATCH] sulogin: ignore none-existing console devices
and also none-functional console devices. Redirect the error
messages to the appropiate console device.
Signed-off-by: Werner Fink <werner@suse.de>
---
login-utils/sulogin-consoles.h | 1 +
login-utils/sulogin.c | 92 ++++++++++++++++++++++++++++------
2 files changed, 79 insertions(+), 14 deletions(-)
diff --git a/login-utils/sulogin-consoles.h b/login-utils/sulogin-consoles.h
index 0bfbc38..12032c9 100644
--- a/login-utils/sulogin-consoles.h
+++ b/login-utils/sulogin-consoles.h
@@ -40,6 +40,7 @@ struct console {
int fd, id;
#define CON_SERIAL 0x0001
#define CON_NOTTY 0x0002
+#define CON_EIO 0x0004
pid_t pid;
struct chardata cp;
struct termios tio;
diff --git a/login-utils/sulogin.c b/login-utils/sulogin.c
index 4d48943..df27896 100644
--- a/login-utils/sulogin.c
+++ b/login-utils/sulogin.c
@@ -52,6 +52,7 @@
#ifdef __linux__
# include <sys/kd.h>
# include <sys/param.h>
+# include <linux/serial.h>
#endif
#include "c.h"
@@ -106,6 +107,9 @@ static void tcinit(struct console *con)
int flags = 0, mode = 0;
struct termios *tio = &con->tio;
const int fd = con->fd;
+#if defined(TIOCGSERIAL)
+ struct serial_struct serinfo;
+#endif
#ifdef USE_PLYMOUTH_SUPPORT
struct termios lock;
int i = (plymouth_command(MAGIC_PING)) ? PLYMOUTH_TERMIOS_FLAGS_DELAY : 0;
@@ -125,27 +129,72 @@ static void tcinit(struct console *con)
}
memset(&lock, 0, sizeof(struct termios));
ioctl(fd, TIOCSLCKTRMIOS, &lock);
+ errno = 0;
#endif
+
+#if defined(TIOCGSERIAL)
+ if (ioctl(fd, TIOCGSERIAL, &serinfo) >= 0)
+ con->flags |= CON_SERIAL;
+ errno = 0;
+#else
+# if defined(KDGKBMODE)
+ if (ioctl(fd, KDGKBMODE, &mode) < 0)
+ con->flags |= CON_SERIAL;
errno = 0;
+# endif
+#endif
if (tcgetattr(fd, tio) < 0) {
- warn(_("tcgetattr failed"));
- con->flags |= CON_NOTTY;
- return;
+ int saveno = errno;
+#if defined(KDGKBMODE) || defined(TIOCGSERIAL)
+ if (con->flags & CON_SERIAL) { /* Try to recover this */
+
+# if defined(TIOCGSERIAL)
+ serinfo.flags |= ASYNC_SKIP_TEST; /* Skip test of UART */
+
+ if (ioctl(fd, TIOCSSERIAL, &serinfo) < 0)
+ goto tcgeterr;
+ if (ioctl(fd, TIOCSERCONFIG) < 0) /* Try to autoconfigure */
+ goto tcgeterr;
+ if (ioctl(fd, TIOCGSERIAL, &serinfo) < 0)
+ goto tcgeterr; /* Ouch */
+# endif
+ if (tcgetattr(fd, tio) < 0) /* Retry to get tty attributes */
+ saveno = errno;
+ }
+# if defined(TIOCGSERIAL)
+ tcgeterr:
+# endif
+ if (saveno)
+#endif
+ {
+ FILE *fcerr = fdopen(fd, "w");
+ if (fcerr) {
+ fprintf(fcerr, _("tcgetattr failed"));
+ fclose(fcerr);
+ }
+ warn(_("tcgetattr failed"));
+
+ con->flags &= ~CON_SERIAL;
+ if (saveno != EIO)
+ con->flags |= CON_NOTTY;
+ else
+ con->flags |= CON_EIO;
+
+ errno = 0;
+ return;
+ }
}
/* Handle lines other than virtual consoles here */
-#if defined(KDGKBMODE)
- if (ioctl(fd, KDGKBMODE, &mode) < 0)
+#if defined(KDGKBMODE) || defined(TIOCGSERIAL)
+ if (con->flags & CON_SERIAL)
#endif
{
speed_t ispeed, ospeed;
struct winsize ws;
errno = 0;
- /* this is a modem line */
- con->flags |= CON_SERIAL;
-
/* Flush input and output queues on modem lines */
tcflush(fd, TCIOFLUSH);
@@ -222,6 +271,8 @@ static void tcfinal(struct console *con)
struct termios *tio = &con->tio;
const int fd = con->fd;
+ if (con->flags & CON_EIO)
+ return;
if ((con->flags & CON_SERIAL) == 0) {
xsetenv("TERM", "linux", 1);
return;
@@ -559,12 +610,16 @@ err:
static void setup(struct console *con)
{
int fd = con->fd;
- const pid_t pid = getpid(), pgrp = getpgid(0), ppgrp =
- getpgid(getppid()), ttypgrp = tcgetpgrp(fd);
+ const pid_t pid = getpid(), pgrp = getpgid(0), ppgrp = getpgid(getppid());
+ pid_t ttypgrp;
if (con->flags & CON_NOTTY)
+ goto notty;
+ if (con->flags & CON_EIO)
return;
+ ttypgrp = tcgetpgrp(fd);
+
/*
* Only go through this trouble if the new
* tty doesn't fall in this process group.
@@ -587,6 +642,7 @@ static void setup(struct console *con)
ioctl(fd, TIOCSCTTY, (char *)1);
tcsetpgrp(fd, ppgrp);
}
+notty:
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
@@ -616,15 +672,19 @@ static char *getpasswd(struct console *con)
int eightbit;
const int fd = con->fd;
- if (con->flags & CON_NOTTY)
+ if (con->flags & CON_EIO)
goto out;
+
cp = &con->cp;
tty = con->tio;
+ tc = 0;
ret = pass;
tty.c_iflag &= ~(IUCLC|IXON|IXOFF|IXANY);
tty.c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|TOSTOP|ISIG);
- tc = (tcsetattr(fd, TCSAFLUSH, &tty) == 0);
+
+ if ((con->flags & CON_NOTTY) == 0)
+ tc = (tcsetattr(fd, TCSAFLUSH, &tty) == 0);
sigemptyset(&sa.sa_mask);
sa.sa_handler = alrm_handler;
@@ -650,11 +710,12 @@ static char *getpasswd(struct console *con)
}
ret = NULL;
switch (errno) {
- case 0:
case EIO:
+ con->flags |= CON_EIO;
case ESRCH:
case EINVAL:
case ENOENT:
+ case 0:
break;
default:
warn(_("cannot read %s"), con->tty);
@@ -976,10 +1037,13 @@ int main(int argc, char **argv)
con = list_entry(ptr, struct console, entry);
if (con->id >= CONMAX)
break;
+ if (con->flags & CON_EIO)
+ goto next;
switch ((con->pid = fork())) {
case 0:
mask_signal(SIGCHLD, SIG_DFL, NULL);
+ dup2(con->fd, STDERR_FILENO);
nofork:
setup(con);
while (1) {
@@ -1040,7 +1104,7 @@ int main(int argc, char **argv)
default:
break;
}
-
+ next:
ptr = ptr->next;
} while (ptr != &consoles);
--
2.33.0

View File

@ -1,45 +0,0 @@
From 9b59641bcec3df9c451eea4c7057751a153a3fcb Mon Sep 17 00:00:00 2001
From: Portisch <hugo.portisch@yahoo.de>
Date: Mon, 8 Nov 2021 12:31:39 +0100
Subject: [PATCH] sysfs: fallback for partitions not including parent name
---
lib/sysfs.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/lib/sysfs.c b/lib/sysfs.c
index bb71833193..191d870f66 100644
--- a/lib/sysfs.c
+++ b/lib/sysfs.c
@@ -210,9 +210,10 @@ int sysfs_blkdev_is_partition_dirent(DIR *dir, struct dirent *d, const char *par
d->d_type != DT_UNKNOWN)
return 0;
#endif
+ size_t len = 0;
+
if (parent_name) {
const char *p = parent_name;
- size_t len;
/* /dev/sda --> "sda" */
if (*parent_name == '/') {
@@ -223,14 +224,15 @@ int sysfs_blkdev_is_partition_dirent(DIR *dir, struct dirent *d, const char *par
}
len = strlen(p);
- if (strlen(d->d_name) <= len)
- return 0;
+ if ((strlen(d->d_name) <= len) || (strncmp(p, d->d_name, len) != 0))
+ len = 0;
+ }
+ if (len > 0) {
/* partitions subdir name is
* "<parent>[:digit:]" or "<parent>p[:digit:]"
*/
- return strncmp(p, d->d_name, len) == 0 &&
- ((*(d->d_name + len) == 'p' && isdigit(*(d->d_name + len + 1)))
+ return ((*(d->d_name + len) == 'p' && isdigit(*(d->d_name + len + 1)))
|| isdigit(*(d->d_name + len)));
}

View File

@ -16,7 +16,7 @@ Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
3 files changed, 42 insertions(+), 36 deletions(-)
diff --git a/include/caputils.h b/include/caputils.h
index 852903a..8fc214e 100644
index 852903a6e..8fc214e7f 100644
--- a/include/caputils.h
+++ b/include/caputils.h
@@ -31,4 +31,6 @@ extern int capget(cap_user_header_t header, const cap_user_data_t data);
@ -27,13 +27,13 @@ index 852903a..8fc214e 100644
+
#endif /* CAPUTILS_H */
diff --git a/lib/caputils.c b/lib/caputils.c
index 13a376b..e01a74e 100644
index 987533a34..3041c3078 100644
--- a/lib/caputils.c
+++ b/lib/caputils.c
@@ -24,6 +24,7 @@
#include "caputils.h"
#include "procutils.h"
#include "pathnames.h"
#include "procfs.h"
+#include "nls.h"
static int test_cap(unsigned int cap)
@ -83,10 +83,10 @@ index 13a376b..e01a74e 100644
int main(int argc, char *argv[])
{
diff --git a/sys-utils/unshare.c b/sys-utils/unshare.c
index 820691b..e914aa1 100644
index 2aa239eff..13aefa96c 100644
--- a/sys-utils/unshare.c
+++ b/sys-utils/unshare.c
@@ -668,42 +668,8 @@ int main(int argc, char *argv[])
@@ -1089,42 +1089,8 @@ int main(int argc, char *argv[])
if (force_uid && setuid(uid) < 0) /* change UID */
err(EXIT_FAILURE, _("setuid failed"));

View File

@ -1,35 +0,0 @@
From 56bacb552d017858751aac208987604f7c9387c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=89rico=20Nogueira?= <erico.erc@gmail.com>
Date: Fri, 22 Oct 2021 14:28:50 -0300
Subject: [PATCH] vipw: flush stdout before getting answer.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Otherwise the question is displayed only after the user presses Return,
and the program looks like it's hanging.
This happens at least on musl libc.
Reported by @loreb.
Signed-off-by: Érico Nogueira <erico.erc@gmail.com>
---
login-utils/vipw.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/login-utils/vipw.c b/login-utils/vipw.c
index f178c8f..bf76f51 100644
--- a/login-utils/vipw.c
+++ b/login-utils/vipw.c
@@ -353,6 +353,7 @@ int main(int argc, char *argv[])
* which means they can be translated. */
printf(_("Would you like to edit %s now [y/n]? "), orig_file);
+ fflush(stdout);
if (fgets(response, sizeof(response), stdin) &&
rpmatch(response) == RPMATCH_YES)
edit_file(1);
--
1.8.3.1

View File

@ -1,170 +0,0 @@
From 27ee6446503af7ec0c2647704ca47ac4de3852ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= <nabijaczleweli@nabijaczleweli.xyz>
Date: Wed, 15 Mar 2023 16:16:43 +0100
Subject: [PATCH] wall: convert homebrew buffering to open_memstream()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The struct buffer system duplicates a plethora of standard I/O
functions (including a fork of fputc_careful())
and adds a lot of complexity open_memstream() is standard,
and fits perfectly into this niche
---
term-utils/wall.c | 95 ++++++++++-------------------------------------
1 file changed, 20 insertions(+), 75 deletions(-)
diff --git a/term-utils/wall.c b/term-utils/wall.c
index c601d3e5b..a51a92829 100644
--- a/term-utils/wall.c
+++ b/term-utils/wall.c
@@ -274,74 +274,22 @@ int main(int argc, char **argv)
exit(EXIT_SUCCESS);
}
-struct buffer {
- size_t sz;
- size_t used;
- char *data;
-};
-
-static void buf_enlarge(struct buffer *bs, size_t len)
+static void buf_putc_careful(FILE *fs, int c)
{
- if (bs->sz == 0 || len > bs->sz - bs->used) {
- bs->sz += len < 128 ? 128 : len;
- bs->data = xrealloc(bs->data, bs->sz);
- }
-}
-
-static void buf_puts(struct buffer *bs, const char *s)
-{
- size_t len = strlen(s);
-
- buf_enlarge(bs, len + 1);
- memcpy(bs->data + bs->used, s, len + 1);
- bs->used += len;
-}
-
-static void __attribute__((__format__ (__printf__, 2, 3)))
- buf_printf(struct buffer *bs, const char *fmt, ...)
-{
- int rc;
- va_list ap;
- size_t limit;
-
- buf_enlarge(bs, 0); /* default size */
- limit = bs->sz - bs->used;
-
- va_start(ap, fmt);
- rc = vsnprintf(bs->data + bs->used, limit, fmt, ap);
- va_end(ap);
-
- if (rc >= 0 && (size_t) rc >= limit) { /* not enough, enlarge */
- buf_enlarge(bs, (size_t)rc + 1);
- limit = bs->sz - bs->used;
- va_start(ap, fmt);
- rc = vsnprintf(bs->data + bs->used, limit, fmt, ap);
- va_end(ap);
- }
-
- if (rc > 0)
- bs->used += rc;
-}
-
-static void buf_putc_careful(struct buffer *bs, int c)
-{
- if (isprint(c) || c == '\a' || c == '\t' || c == '\r' || c == '\n') {
- buf_enlarge(bs, 1);
- bs->data[bs->used++] = c;
- } else if (!c_isascii(c))
- buf_printf(bs, "\\%3o", (unsigned char)c);
- else {
- char tmp[] = { '^', c ^ 0x40, '\0' };
- buf_puts(bs, tmp);
- }
+ if (isprint(c) || c == '\a' || c == '\t' || c == '\r' || c == '\n')
+ fputc(c, fs);
+ else if (!c_isascii(c))
+ fprintf(fs, "\\%3o", (unsigned char)c);
+ else
+ fputs((char[]){ '^', c ^ 0x40, '\0' }, fs);
}
static char *makemsg(char *fname, char **mvec, int mvecsz,
size_t *mbufsize, int print_banner)
{
- struct buffer _bs = {.used = 0}, *bs = &_bs;
register int ch, cnt;
- char *p, *lbuf;
+ char *p, *lbuf, *retbuf;
+ FILE * fs = open_memstream(&retbuf, mbufsize);
long line_max;
line_max = sysconf(_SC_LINE_MAX);
@@ -379,15 +327,15 @@ static char *makemsg(char *fname, char **mvec, int mvecsz,
*/
/* snprintf is not always available, but the sprintf's here
will not overflow as long as %d takes at most 100 chars */
- buf_printf(bs, "\r%*s\r\n", TERM_WIDTH, " ");
+ fprintf(fs, "\r%*s\r\n", TERM_WIDTH, " ");
snprintf(lbuf, line_max,
_("Broadcast message from %s@%s (%s) (%s):"),
whom, hostname, where, date);
- buf_printf(bs, "%-*.*s\007\007\r\n", TERM_WIDTH, TERM_WIDTH, lbuf);
+ fprintf(fs, "%-*.*s\007\007\r\n", TERM_WIDTH, TERM_WIDTH, lbuf);
free(hostname);
}
- buf_printf(bs, "%*s\r\n", TERM_WIDTH, " ");
+ fprintf(fs, "%*s\r\n", TERM_WIDTH, " ");
if (mvec) {
/*
@@ -396,11 +344,11 @@ static char *makemsg(char *fname, char **mvec, int mvecsz,
int i;
for (i = 0; i < mvecsz; i++) {
- buf_puts(bs, mvec[i]);
+ fputs(mvec[i], fs);
if (i < mvecsz - 1)
- buf_puts(bs, " ");
+ fputc(' ', fs);
}
- buf_puts(bs, "\r\n");
+ fputs("\r\n", fs);
} else {
/*
* read message from <file>
@@ -428,23 +376,20 @@ static char *makemsg(char *fname, char **mvec, int mvecsz,
while (fgets(lbuf, line_max, stdin)) {
for (cnt = 0, p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
if (cnt == TERM_WIDTH || ch == '\n') {
- for (; cnt < TERM_WIDTH; ++cnt)
- buf_puts(bs, " ");
- buf_puts(bs, "\r\n");
+ fprintf(fs, "%*s\r\n", TERM_WIDTH - cnt, "");
cnt = 0;
}
if (ch == '\t')
cnt += (7 - (cnt % 8));
if (ch != '\n')
- buf_putc_careful(bs, ch);
+ buf_putc_careful(fs, ch);
}
}
}
- buf_printf(bs, "%*s\r\n", TERM_WIDTH, " ");
+ fprintf(fs, "%*s\r\n", TERM_WIDTH, " ");
free(lbuf);
- bs->data[bs->used] = '\0'; /* be paranoid */
- *mbufsize = bs->used;
- return bs->data;
+ fclose(fs);
+ return retbuf;
}
--
2.27.0

View File

@ -1,218 +0,0 @@
From aa13246a1bf1be9e4f6eb331f4d4d2dbc875e22f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= <nabijaczleweli@nabijaczleweli.xyz>
Date: Wed, 15 Mar 2023 16:16:48 +0100
Subject: [PATCH] wall: use fputs_careful()
LINE_MAX only applies to teletypes in canonical mode: when stdin is a
file, it could still very much tear; start off at 512 for the sprintf(),
then use getline() like in write.
The line wrapping has one suboptimal edge-case:
$ wall < all
Broadcast message from nabijaczleweli@tarta (pts/4) (Tue Mar 14 22:31:25
2023):
^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ
KLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^?\200\201\202\203\204\205\206
\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232
\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256
\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302
\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326
\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352
\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376
\377
but that's a pathological input, and the result is still infinitely
better than it was before, so fixing that is more trouble than it's
worth.
Bug-Debian: https://bugs.debian.org/826596
---
include/carefulputc.h | 42 +++++++++++++++++++++++++++++++++---------
login-utils/last.c | 2 +-
term-utils/wall.c | 38 ++++++--------------------------------
term-utils/write.c | 2 +-
4 files changed, 41 insertions(+), 43 deletions(-)
diff --git a/include/carefulputc.h b/include/carefulputc.h
index 740add68e..3cc6f7ff9 100644
--- a/include/carefulputc.h
+++ b/include/carefulputc.h
@@ -6,6 +6,7 @@
#include <ctype.h>
#ifdef HAVE_WIDECHAR
#include <wctype.h>
+#include <wchar.h>
#endif
#include <stdbool.h>
@@ -15,18 +16,35 @@
* A puts() for use in write and wall (that sometimes are sgid tty).
* It avoids control and invalid characters.
* The locale of the recipient is nominally unknown,
- * but it's a solid bet that the encoding is compatible with the author's.
+ * but it's a solid bet that it's compatible with the author's.
+ * Use soft_width=0 to disable wrapping.
*/
-static inline int fputs_careful(const char * s, FILE *fp, const char ctrl, bool cr_lf)
+static inline int fputs_careful(const char * s, FILE *fp, const char ctrl, bool cr_lf, int soft_width)
{
- int ret = 0;
+ int ret = 0, col = 0;
for (size_t slen = strlen(s); *s; ++s, --slen) {
- if (*s == '\n')
+ if (*s == '\t')
+ col += (7 - (col % 8)) - 1;
+ else if (*s == '\r')
+ col = -1;
+ else if (*s == '\a')
+ --col;
+
+ if ((soft_width && col >= soft_width) || *s == '\n') {
+ if (soft_width) {
+ fprintf(fp, "%*s", soft_width - col, "");
+ col = 0;
+ }
ret = fputs(cr_lf ? "\r\n" : "\n", fp);
- else if (isprint(*s) || *s == '\a' || *s == '\t' || *s == '\r')
+ if (*s == '\n' || ret < 0)
+ goto wrote;
+ }
+
+ if (isprint(*s) || *s == '\a' || *s == '\t' || *s == '\r') {
ret = putc(*s, fp);
- else if (!c_isascii(*s)) {
+ ++col;
+ } else if (!c_isascii(*s)) {
#ifdef HAVE_WIDECHAR
wchar_t w;
size_t clen = mbtowc(&w, s, slen);
@@ -35,21 +53,27 @@ static inline int fputs_careful(const char * s, FILE *fp, const char ctrl, bool
case (size_t)-1: // EILSEQ
mbtowc(NULL, NULL, 0);
nonprint:
- ret = fprintf(fp, "\\%3hho", *s);
+ col += ret = fprintf(fp, "\\%3hho", *s);
break;
default:
if(!iswprint(w))
goto nonprint;
ret = fwrite(s, 1, clen, fp);
+ if (soft_width)
+ col += wcwidth(w);
s += clen - 1;
slen -= clen - 1;
break;
}
#else
- ret = fprintf(fp, "\\%3hho", *s);
+ col += ret = fprintf(fp, "\\%3hho", *s);
#endif
- } else
+ } else {
ret = fputs((char[]){ ctrl, *s ^ 0x40, '\0' }, fp);
+ col += 2;
+ }
+
+ wrote:
if (ret < 0)
return EOF;
}
diff --git a/login-utils/last.c b/login-utils/last.c
index 1b45dbf24..37c6abe97 100644
--- a/login-utils/last.c
+++ b/login-utils/last.c
@@ -547,7 +547,7 @@ static int list(const struct last_control *ctl, struct utmpx *p, time_t logout_t
/*
* Print out "final" string safely.
*/
- fputs_careful(final, stdout, '*', false);
+ fputs_careful(final, stdout, '*', false, 0);
if (len < 0 || (size_t)len >= sizeof(final))
putchar('\n');
diff --git a/term-utils/wall.c b/term-utils/wall.c
index a51a92829..377db4518 100644
--- a/term-utils/wall.c
+++ b/term-utils/wall.c
@@ -274,29 +274,13 @@ int main(int argc, char **argv)
exit(EXIT_SUCCESS);
}
-static void buf_putc_careful(FILE *fs, int c)
-{
- if (isprint(c) || c == '\a' || c == '\t' || c == '\r' || c == '\n')
- fputc(c, fs);
- else if (!c_isascii(c))
- fprintf(fs, "\\%3o", (unsigned char)c);
- else
- fputs((char[]){ '^', c ^ 0x40, '\0' }, fs);
-}
-
static char *makemsg(char *fname, char **mvec, int mvecsz,
size_t *mbufsize, int print_banner)
{
- register int ch, cnt;
- char *p, *lbuf, *retbuf;
+ char *lbuf, *retbuf;
FILE * fs = open_memstream(&retbuf, mbufsize);
- long line_max;
-
- line_max = sysconf(_SC_LINE_MAX);
- if (line_max <= 0)
- line_max = 512;
-
- lbuf = xmalloc(line_max);
+ size_t lbuflen = 512;
+ lbuf = xmalloc(lbuflen);
if (print_banner == TRUE) {
char *hostname = xgethostname();
@@ -329,7 +313,7 @@ static char *makemsg(char *fname, char **mvec, int mvecsz,
will not overflow as long as %d takes at most 100 chars */
fprintf(fs, "\r%*s\r\n", TERM_WIDTH, " ");
- snprintf(lbuf, line_max,
+ snprintf(lbuf, lbuflen,
_("Broadcast message from %s@%s (%s) (%s):"),
whom, hostname, where, date);
fprintf(fs, "%-*.*s\007\007\r\n", TERM_WIDTH, TERM_WIDTH, lbuf);
@@ -373,18 +357,8 @@ static char *makemsg(char *fname, char **mvec, int mvecsz,
/*
* Read message from stdin.
*/
- while (fgets(lbuf, line_max, stdin)) {
- for (cnt = 0, p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
- if (cnt == TERM_WIDTH || ch == '\n') {
- fprintf(fs, "%*s\r\n", TERM_WIDTH - cnt, "");
- cnt = 0;
- }
- if (ch == '\t')
- cnt += (7 - (cnt % 8));
- if (ch != '\n')
- buf_putc_careful(fs, ch);
- }
- }
+ while (getline(&lbuf, &lbuflen, stdin) >= 0)
+ fputs_careful(lbuf, fs, '^', true, TERM_WIDTH);
}
fprintf(fs, "%*s\r\n", TERM_WIDTH, " ");
diff --git a/term-utils/write.c b/term-utils/write.c
index b485e28fd..a5a21280c 100644
--- a/term-utils/write.c
+++ b/term-utils/write.c
@@ -276,7 +276,7 @@ static void do_write(const struct write_control *ctl)
if (signal_received)
break;
- if (fputs_careful(line, stdout, '^', true) == EOF)
+ if (fputs_careful(line, stdout, '^', true, 0) == EOF)
err(EXIT_FAILURE, _("carefulputc failed"));
}
free(line);
--
2.27.0

View File

@ -1,43 +0,0 @@
From f36f3251c564991070c6b2c2347a999a56564e63 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
Date: Sun, 8 Jan 2023 03:29:51 +0000
Subject: [PATCH] wdctl: mark flags field as unsigned long
This is required by string_to_bitmask().
The previous cast failed on s390x with the following warning:
In function 'string_to_bitmask',
inlined from 'string_to_bitmask' at lib/strutils.c:802:5,
inlined from 'main' at sys-utils/wdctl.c:770:8:
lib/strutils.c:829:23: error: write of 64-bit data outside the bound of destination object, data truncated into 32-bit [-Werror=extra]
829 | *mask |= flag;
|
---
sys-utils/wdctl.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sys-utils/wdctl.c b/sys-utils/wdctl.c
index 8de5d5a..f0d2e8d 100644
--- a/sys-utils/wdctl.c
+++ b/sys-utils/wdctl.c
@@ -592,7 +592,7 @@ int main(int argc, char *argv[])
struct wd_device wd;
struct wd_control ctl = { .hide_headings = 0 };
int c, res = EXIT_SUCCESS, count = 0;
- uint32_t wanted = 0;
+ unsigned long wanted = 0;
int timeout = 0;
const char *dflt_device = NULL;
@@ -640,7 +640,7 @@ int main(int argc, char *argv[])
timeout = strtos32_or_err(optarg, _("invalid timeout argument"));
break;
case 'f':
- if (string_to_bitmask(optarg, (unsigned long *) &wanted, name2bit) != 0)
+ if (string_to_bitmask(optarg, &wanted, name2bit) != 0)
return EXIT_FAILURE;
break;
case 'F':
--
2.33.0

View File

@ -1,28 +0,0 @@
From 3fe8061d4a7cf2e282ef4b67202d351ce05de4d1 Mon Sep 17 00:00:00 2001
From: Stefan Radu <stefan270101@gmail.com>
Date: Tue, 25 Apr 2023 18:55:07 +0300
Subject: [PATCH] wrap return in #else directive to avoid dead code
Signed-off-by: Stefan Radu <stefan270101@gmail.com>
---
login-utils/su-common.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
index 67c4fa271..b67492048 100644
--- a/login-utils/su-common.c
+++ b/login-utils/su-common.c
@@ -343,8 +343,9 @@ static int supam_conv( int num_msg,
return misc_conv(num_msg, msg, resp, data);
#elif defined(HAVE_SECURITY_OPENPAM_H)
return openpam_ttyconv(num_msg, msg, resp, data);
-#endif
+#else
return PAM_CONV_ERR;
+#endif
}
static void supam_cleanup(struct su_context *su, int retcode)
--
2.27.0

View File

@ -1,199 +0,0 @@
From 8a7b8456d1dc0e7ca557d1ac31f638986704757f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= <nabijaczleweli@nabijaczleweli.xyz>
Date: Wed, 15 Mar 2023 16:16:31 +0100
Subject: [PATCH] write: correctly handle wide characters
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Do this by replacing fputc_careful() (notice that the description said
it's locale-aware it very much is /not/), with a fputs_careful() which
does the same thing, but if it were to output a byte in the \123 format,
first it checks whether this byte starts a valid multibyte character.
If it does, and that character is printable, write it verbatim.
This means that
echo 'foo åäö ąęćźżń bar' | write nabijaczleweli pts/4
instead of
foo \303\245\303\244\303\266
\304\205\304\231\304\207\305\272\305\274\305\204 bar
yields
foo åäö ąęćźżń bar
or, more realistically, from a message I got earlier today,
Filip powiedzia\305\202 \305\274e zap\305\202aci jutro
becomes
Filip powiedział że zapłaci jutro
Invalid/non-printable sequences get processed as before.
Line reading in write must become getline() to avoid dealing with
partial characters: for example on input consisting solely of
ąęćźżń, where every {1} is an instance, the output would be
{42}ąęć\305\272żń{84}ąęćź\305\274ń{84}ąęćźż\305\204{39}
with just fixed-512 fgets()
Bug-Debian: https://bugs.debian.org/826596
---
include/carefulputc.h | 60 +++++++++++++++++++++++++++++++------------
login-utils/last.c | 4 +--
term-utils/write.c | 25 +++++-------------
3 files changed, 52 insertions(+), 37 deletions(-)
diff --git a/include/carefulputc.h b/include/carefulputc.h
index 8860b1234..740add68e 100644
--- a/include/carefulputc.h
+++ b/include/carefulputc.h
@@ -1,31 +1,59 @@
#ifndef UTIL_LINUX_CAREFULPUTC_H
#define UTIL_LINUX_CAREFULPUTC_H
-/*
- * A putc() for use in write and wall (that sometimes are sgid tty).
- * It avoids control characters in our locale, and also ASCII control
- * characters. Note that the locale of the recipient is unknown.
-*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
+#ifdef HAVE_WIDECHAR
+#include <wctype.h>
+#endif
+#include <stdbool.h>
#include "cctype.h"
-static inline int fputc_careful(int c, FILE *fp, const char fail)
+/*
+ * A puts() for use in write and wall (that sometimes are sgid tty).
+ * It avoids control and invalid characters.
+ * The locale of the recipient is nominally unknown,
+ * but it's a solid bet that the encoding is compatible with the author's.
+ */
+static inline int fputs_careful(const char * s, FILE *fp, const char ctrl, bool cr_lf)
{
- int ret;
+ int ret = 0;
- if (isprint(c) || c == '\a' || c == '\t' || c == '\r' || c == '\n')
- ret = putc(c, fp);
- else if (!c_isascii(c))
- ret = fprintf(fp, "\\%3o", (unsigned char)c);
- else {
- ret = putc(fail, fp);
- if (ret != EOF)
- ret = putc(c ^ 0x40, fp);
+ for (size_t slen = strlen(s); *s; ++s, --slen) {
+ if (*s == '\n')
+ ret = fputs(cr_lf ? "\r\n" : "\n", fp);
+ else if (isprint(*s) || *s == '\a' || *s == '\t' || *s == '\r')
+ ret = putc(*s, fp);
+ else if (!c_isascii(*s)) {
+#ifdef HAVE_WIDECHAR
+ wchar_t w;
+ size_t clen = mbtowc(&w, s, slen);
+ switch(clen) {
+ case (size_t)-2: // incomplete
+ case (size_t)-1: // EILSEQ
+ mbtowc(NULL, NULL, 0);
+ nonprint:
+ ret = fprintf(fp, "\\%3hho", *s);
+ break;
+ default:
+ if(!iswprint(w))
+ goto nonprint;
+ ret = fwrite(s, 1, clen, fp);
+ s += clen - 1;
+ slen -= clen - 1;
+ break;
+ }
+#else
+ ret = fprintf(fp, "\\%3hho", *s);
+#endif
+ } else
+ ret = fputs((char[]){ ctrl, *s ^ 0x40, '\0' }, fp);
+ if (ret < 0)
+ return EOF;
}
- return (ret < 0) ? EOF : 0;
+ return 0;
}
static inline void fputs_quoted_case(const char *data, FILE *out, int dir)
diff --git a/login-utils/last.c b/login-utils/last.c
index d3eeed4b6..1b45dbf24 100644
--- a/login-utils/last.c
+++ b/login-utils/last.c
@@ -392,7 +392,6 @@ static int list(const struct last_control *ctl, struct utmpx *p, time_t logout_t
char final[512];
char utline[sizeof(p->ut_line) + 1];
char domain[256];
- char *s;
int mins, hours, days;
int r, len;
struct last_timefmt *fmt;
@@ -548,8 +547,7 @@ static int list(const struct last_control *ctl, struct utmpx *p, time_t logout_t
/*
* Print out "final" string safely.
*/
- for (s = final; *s; s++)
- fputc_careful(*s, stdout, '*');
+ fputs_careful(final, stdout, '*', false);
if (len < 0 || (size_t)len >= sizeof(final))
putchar('\n');
diff --git a/term-utils/write.c b/term-utils/write.c
index 8b86e9a9d..b485e28fd 100644
--- a/term-utils/write.c
+++ b/term-utils/write.c
@@ -223,21 +223,6 @@ static void signal_handler(int signo)
signal_received = signo;
}
-/*
- * write_line - like fputs(), but makes control characters visible and
- * turns \n into \r\n.
- */
-static void write_line(char *s)
-{
- while (*s) {
- const int c = *s++;
-
- if ((c == '\n' && fputc_careful('\r', stdout, '^') == EOF)
- || fputc_careful(c, stdout, '^') == EOF)
- err(EXIT_FAILURE, _("carefulputc failed"));
- }
-}
-
/*
* do_write - actually make the connection
*/
@@ -247,7 +232,8 @@ static void do_write(const struct write_control *ctl)
struct passwd *pwd;
time_t now;
struct tm *tm;
- char *host, line[512];
+ char *host, *line = NULL;
+ size_t linelen = 0;
struct sigaction sigact;
/* Determine our login name(s) before the we reopen() stdout */
@@ -286,11 +272,14 @@ static void do_write(const struct write_control *ctl)
free(host);
printf("\r\n");
- while (fgets(line, sizeof(line), stdin) != NULL) {
+ while (getline(&line, &linelen, stdin) >= 0) {
if (signal_received)
break;
- write_line(line);
+
+ if (fputs_careful(line, stdout, '^', true) == EOF)
+ err(EXIT_FAILURE, _("carefulputc failed"));
}
+ free(line);
printf("EOF\r\n");
}
--
2.27.0

View File

@ -1,61 +0,0 @@
From 58e4ee082bca100034791a4a74481f263bb30a25 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 21 Oct 2021 18:47:40 +0200
Subject: [PATCH] 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
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/logger.c | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/misc-utils/logger.c b/misc-utils/logger.c
index 25ff2b9308..50ae211056 100644
--- a/misc-utils/logger.c
+++ b/misc-utils/logger.c
@@ -976,9 +976,7 @@ static void logger_stdin(struct logger_ctl *ctl)
*/
int default_priority = ctl->pri;
int last_pri = default_priority;
- size_t max_usrmsg_size = ctl->max_message_size - strlen(ctl->hdr);
- size_t allocated_usrmsg_size = max_usrmsg_size;
- char *buf = xmalloc(allocated_usrmsg_size + 2 + 2);
+ char *buf = xmalloc(ctl->max_message_size + 2 + 2);
int pri;
int c;
size_t i;
@@ -1006,20 +1004,13 @@ static void logger_stdin(struct logger_ctl *ctl)
if (ctl->pri != last_pri) {
generate_syslog_header(ctl);
- max_usrmsg_size = ctl->max_message_size - strlen(ctl->hdr);
-
- if (max_usrmsg_size > allocated_usrmsg_size) {
- allocated_usrmsg_size = max_usrmsg_size;
- buf = xrealloc(buf, allocated_usrmsg_size + 2 + 2);
- }
-
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();
}

View File

@ -1,64 +0,0 @@
From b0a8b8cd9c34600dda7d0503aac2dc0af3012fdc Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 21 Oct 2021 16:00:01 +0200
Subject: [PATCH] logger: realloc buffer when header size changed
This is probably paranoid optimization, but when we generate a new
header we need to be sure that buffer is not smaller than calculated
maximal size of user's data.
Signed-off-by: Karel Zak <kzak@redhat.com>
---
misc-utils/logger.c | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/misc-utils/logger.c b/misc-utils/logger.c
index 23da164cd6..4511ab1141 100644
--- a/misc-utils/logger.c
+++ b/misc-utils/logger.c
@@ -979,11 +979,11 @@ 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);
+ size_t allocated_usrmsg_size = max_usrmsg_size;
+ char *buf = xmalloc(allocated_usrmsg_size + 2 + 2);
int pri;
int c;
size_t i;
@@ -1010,9 +1010,14 @@ 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);
+ max_usrmsg_size = ctl->max_message_size - strlen(ctl->hdr);
+
+ if (max_usrmsg_size > allocated_usrmsg_size) {
+ allocated_usrmsg_size = max_usrmsg_size;
+ buf = xrealloc(buf, allocated_usrmsg_size + 2 + 2);
+ }
+
last_pri = ctl->pri;
}
if (c != EOF && c != '\n')
@@ -1025,12 +1030,8 @@ static void logger_stdin(struct logger_ctl *ctl)
}
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();

View File

@ -1,27 +0,0 @@
From 9714331843ef3a6d9c10ff1d3bc5fcf53d44d930 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Tue, 31 Aug 2021 12:31:15 +0200
Subject: [PATCH] column: segmentation fault on invalid unicode input passed to
-s option
The function mbs_to_wcs() returns NULL on invalid UTF.
Fixes: https://github.com/karelzak/util-linux/issues/1425
Signed-off-by: Karel Zak <kzak@redhat.com>
---
text-utils/column.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/text-utils/column.c b/text-utils/column.c
index 1bc90e84e3..f9878e4422 100644
--- a/text-utils/column.c
+++ b/text-utils/column.c
@@ -814,6 +814,8 @@ int main(int argc, char **argv)
case 's':
free(ctl.input_separator);
ctl.input_separator = mbs_to_wcs(optarg);
+ if (!ctl.input_separator)
+ err(EXIT_FAILURE, _("failed to use input separator"));
ctl.greedy = 0;
break;
case 'T':

Binary file not shown.

BIN
util-linux-2.39.1.tar.xz Normal file

Binary file not shown.

View File

@ -19,10 +19,10 @@ Signed-off-by: wzx <wuzx1226@qq.com>
11 files changed, 34 insertions(+), 22 deletions(-)
diff --git a/configure b/configure
index 57b830a..48d3a36 100755
index 0671c06..6bd1f57 100755
--- a/configure
+++ b/configure
@@ -36071,6 +36071,7 @@ else
@@ -39881,6 +39881,7 @@ else $as_nop
case $host_cpu in
#(
alpha) syscall="442" ;; #(
@ -30,7 +30,7 @@ index 57b830a..48d3a36 100755
i*86) syscall="289" ;; #(
ia64*) syscall="1274" ;; #(
powerpc*) syscall="273" ;; #(
@@ -36175,6 +36176,7 @@ else
@@ -39986,6 +39987,7 @@ else $as_nop
case $host_cpu in
#(
alpha) syscall="443" ;; #(
@ -39,10 +39,10 @@ index 57b830a..48d3a36 100755
ia64*) syscall="1275" ;; #(
powerpc*) syscall="274" ;; #(
diff --git a/configure.ac b/configure.ac
index b12b48c..bf405da 100644
index 2cb236f..d9d8691 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2218,6 +2218,7 @@ UL_BUILD_INIT([ionice])
@@ -2392,6 +2392,7 @@ UL_BUILD_INIT([ionice])
UL_REQUIRES_SYSCALL_CHECK([ionice],
[UL_CHECK_SYSCALL([ioprio_set],
[alpha], [442],
@ -50,7 +50,7 @@ index b12b48c..bf405da 100644
[i*86], [289],
[ia64*], [1274],
[powerpc*], [273],
@@ -2230,6 +2231,7 @@ UL_REQUIRES_SYSCALL_CHECK([ionice],
@@ -2404,6 +2405,7 @@ UL_REQUIRES_SYSCALL_CHECK([ionice],
UL_REQUIRES_SYSCALL_CHECK([ionice],
[UL_CHECK_SYSCALL([ioprio_get],
[alpha], [443],
@ -59,10 +59,10 @@ index b12b48c..bf405da 100644
[ia64*], [1275],
[powerpc*], [274],
diff --git a/include/pt-bsd.h b/include/pt-bsd.h
index 9bf47a5..c524c44 100644
index 20c24b7..b878258 100644
--- a/include/pt-bsd.h
+++ b/include/pt-bsd.h
@@ -10,7 +10,7 @@
@@ -14,7 +14,7 @@
#define BSD_LINUX_BOOTDIR "/usr/ucb/mdec"
@ -71,7 +71,7 @@ index 9bf47a5..c524c44 100644
defined (__ia64__) || defined (__hppa__)
# define BSD_LABELSECTOR 0
# define BSD_LABELOFFSET 64
@@ -137,7 +137,7 @@ struct bsd_disklabel {
@@ -141,7 +141,7 @@ struct bsd_disklabel {
#define BSD_FS_ADVFS 16 /* Digital Unix AdvFS */
/* this is annoying, but it's also the way it is :-( */
@ -81,10 +81,10 @@ index 9bf47a5..c524c44 100644
#else
#define BSD_FS_MSDOS 8 /* MS-DOS file system */
diff --git a/libblkid/src/partitions/bsd.c b/libblkid/src/partitions/bsd.c
index c745173..ad2bfda 100644
index ba12019..e7e4486 100644
--- a/libblkid/src/partitions/bsd.c
+++ b/libblkid/src/partitions/bsd.c
@@ -166,6 +166,7 @@ nothing:
@@ -183,6 +183,7 @@ nothing:
* ------------------------+-------------+------------
* alpha luna88k mac68k | 0 | 64
* sparc(OpenBSD) vax | |
@ -169,10 +169,10 @@ index 313ae5a..875fa11 100644
return BSD_FS_MSDOS;
#endif
diff --git a/sys-utils/hwclock-rtc.c b/sys-utils/hwclock-rtc.c
index 07af9c8..885ca1e 100644
index 7094cd0..11adb81 100644
--- a/sys-utils/hwclock-rtc.c
+++ b/sys-utils/hwclock-rtc.c
@@ -390,7 +390,7 @@ struct clock_ops *probe_for_rtc_clock(const struct hwclock_control *ctl)
@@ -340,7 +340,7 @@ const struct clock_ops *probe_for_rtc_clock(const struct hwclock_control *ctl)
return &rtc_interface;
}
@ -182,10 +182,10 @@ index 07af9c8..885ca1e 100644
* Get the Hardware Clock epoch setting from the kernel.
*/
diff --git a/sys-utils/hwclock.c b/sys-utils/hwclock.c
index 3609814..37ec0d0 100644
index 2a18443..87228b5 100644
--- a/sys-utils/hwclock.c
+++ b/sys-utils/hwclock.c
@@ -1129,7 +1129,7 @@ manipulate_clock(const struct hwclock_control *ctl, const time_t set_time,
@@ -1133,7 +1133,7 @@ manipulate_clock(const struct hwclock_control *ctl, const time_t set_time,
* Get or set the kernel RTC driver's epoch on Alpha machines.
* ISA machines are hard coded for 1900.
*/
@ -194,7 +194,7 @@ index 3609814..37ec0d0 100644
static void
manipulate_epoch(const struct hwclock_control *ctl)
{
@@ -1172,7 +1172,7 @@ usage(void)
@@ -1208,7 +1208,7 @@ usage(void)
puts(_(" -w, --systohc set the RTC from the system time"));
puts(_(" --systz send timescale configurations to the kernel"));
puts(_(" -a, --adjust adjust the RTC to account for systematic drift"));
@ -203,7 +203,7 @@ index 3609814..37ec0d0 100644
puts(_(" --getepoch display the RTC epoch"));
puts(_(" --setepoch set the RTC epoch according to --epoch"));
#endif
@@ -1188,7 +1188,7 @@ usage(void)
@@ -1228,7 +1228,7 @@ usage(void)
" --directisa use the ISA bus instead of %1$s access\n"), _PATH_RTC_DEV);
puts(_(" --date <time> date/time input for --set and --predict"));
puts(_(" --delay <sec> delay used when set new RTC time"));
@ -212,7 +212,7 @@ index 3609814..37ec0d0 100644
puts(_(" --epoch <year> epoch input for --setepoch"));
#endif
puts(_(" --update-drift update the RTC drift factor"));
@@ -1250,7 +1250,7 @@ int main(int argc, char **argv)
@@ -1307,7 +1307,7 @@ int main(int argc, char **argv)
{ "ul-debug", required_argument, NULL, 'd' },
{ "verbose", no_argument, NULL, 'v' },
{ "set", no_argument, NULL, OPT_SET },
@ -221,7 +221,7 @@ index 3609814..37ec0d0 100644
{ "getepoch", no_argument, NULL, OPT_GETEPOCH },
{ "setepoch", no_argument, NULL, OPT_SETEPOCH },
{ "epoch", required_argument, NULL, OPT_EPOCH },
@@ -1354,7 +1354,7 @@ int main(int argc, char **argv)
@@ -1415,7 +1415,7 @@ int main(int argc, char **argv)
ctl.show = 0;
ctl.hwaudit_on = 1;
break;
@ -230,9 +230,9 @@ index 3609814..37ec0d0 100644
case OPT_GETEPOCH:
ctl.getepoch = 1;
ctl.show = 0;
@@ -1461,7 +1461,7 @@ int main(int argc, char **argv)
}
@@ -1542,7 +1542,7 @@ int main(int argc, char **argv)
}
#endif
-#if defined(__linux__) && defined(__alpha__)
+#if defined(__linux__) && (defined(__alpha__) || defined(__sw_64__))
@ -240,10 +240,10 @@ index 3609814..37ec0d0 100644
manipulate_epoch(&ctl);
hwclock_exit(&ctl, EXIT_SUCCESS);
diff --git a/sys-utils/hwclock.h b/sys-utils/hwclock.h
index 627cf51..2c88181 100644
index b5b72d4..d29d95e 100644
--- a/sys-utils/hwclock.h
+++ b/sys-utils/hwclock.h
@@ -23,7 +23,7 @@ struct hwclock_control {
@@ -24,7 +24,7 @@ struct hwclock_control {
char *date_opt;
char *adj_file_name;
double rtc_delay; /* --delay <seconds> */
@ -252,7 +252,7 @@ index 627cf51..2c88181 100644
char *epoch_option;
#endif
#ifdef __linux__
@@ -36,7 +36,7 @@ struct hwclock_control {
@@ -39,7 +39,7 @@ struct hwclock_control {
hctosys:1,
utc:1,
systohc:1,
@ -261,7 +261,7 @@ index 627cf51..2c88181 100644
getepoch:1,
setepoch:1,
#endif
@@ -69,7 +69,7 @@ extern struct clock_ops *probe_for_rtc_clock(const struct hwclock_control *ctl);
@@ -72,7 +72,7 @@ extern const struct clock_ops *probe_for_rtc_clock(const struct hwclock_control
extern double time_diff(struct timeval subtrahend, struct timeval subtractor);
/* rtc.c */
@ -271,10 +271,10 @@ index 627cf51..2c88181 100644
extern int set_epoch_rtc(const struct hwclock_control *ctl);
#endif
diff --git a/sys-utils/lscpu-cputype.c b/sys-utils/lscpu-cputype.c
index 7b5b109..4492a08 100644
index 3fd5f7a..b01ed21 100644
--- a/sys-utils/lscpu-cputype.c
+++ b/sys-utils/lscpu-cputype.c
@@ -596,7 +596,7 @@ struct lscpu_arch *lscpu_read_architecture(struct lscpu_cxt *cxt)
@@ -611,7 +611,7 @@ struct lscpu_arch *lscpu_read_architecture(struct lscpu_cxt *cxt)
* information about our real CPU */
;
else {
@ -284,10 +284,10 @@ index 7b5b109..4492a08 100644
#endif
/* platforms with 64bit flag in /proc/cpuinfo, define
diff --git a/sys-utils/setarch.c b/sys-utils/setarch.c
index b86be1e..f25a763 100644
index 78b5183..f4f6e56 100644
--- a/sys-utils/setarch.c
+++ b/sys-utils/setarch.c
@@ -187,6 +187,10 @@ static struct arch_domain *init_arch_domains(void)
@@ -229,6 +229,10 @@ static struct arch_domain *init_arch_domains(void)
{PER_LINUX32, "mips", "mips"},
{PER_LINUX, "mips64", "mips64"},
#endif
@ -299,7 +299,7 @@ index b86be1e..f25a763 100644
{PER_LINUX, "alpha", "alpha"},
{PER_LINUX, "alphaev5", "alpha"},
diff --git a/tests/ts/fdisk/bsd b/tests/ts/fdisk/bsd
index 675468d..bce8706 100755
index 8477f92..48e2a35 100755
--- a/tests/ts/fdisk/bsd
+++ b/tests/ts/fdisk/bsd
@@ -48,7 +48,7 @@ BYTE_ORDER=$($TS_HELPER_SYSINFO byte-order)

View File

@ -1,9 +1,9 @@
%define compldir %{_datadir}/bash-completion/completions/
%global upstream_major 2.37
%global upstream_major 2.39
Name: util-linux
Version: 2.37.2
Release: 20
Version: 2.39.1
Release: 1
Summary: A random collection of Linux utilities
License: GPLv2 and GPLv2+ and LGPLv2+ and BSD with advertising and Public Domain
URL: https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git
@ -19,102 +19,17 @@ Source8: util-linux-runuser.pamd
Source9: util-linux-runuser-l.pamd
Patch6000: 2.36-login-lastlog-create.patch
Patch6001: backport-CVE-2021-3995.patch
Patch6002: backport-CVE-2021-3996.patch
Patch6003: realloc-buffer-when-header-size-changed.patch
Patch6004: fix-size-use-for-stdin.patch
Patch6005: segmentation-fault-on-invalid-unicode-input-passed-to-s-option.patch
Patch6006: backport-fix-by-ignoring-EINVAL-on-remount-of-proc.patch
Patch6007: backport-flush-stdout-before-reading-stdin-and-fix-uninitialized-variable.patch
Patch6008: backport-fflush-stdout-before-reading-from-stdin.patch
Patch6009: backport-CVE-2022-0563.patch
Patch6010: backport-su-bash-completion-offer-usernames-rather-than-files.patch
Patch6011: backport-Fix-memory-leaks-in-the-chcpu.patch
Patch6012: backport-logger-fix-prio-prefix-doesn-t-use-priority-default.patch
Patch6013: backport-vipw-flush-stdout-before-getting-answer.patch
Patch6014: backport-login-Restore-tty-size-after-calling-vhangup.patch
Patch6015: backport-Forward-value-of-sector_size-instead-of-its-address.patch
Patch6016: backport-libfdisk-dereference-of-possibly-NULL-gcc-analyzer.patch
Patch6017: backport-libfdisk-check-calloc-return-gcc-analyzer.patch
Patch6018: backport-mcookie-fix-infinite-loop-when-use-f.patch
Patch6019: backport-sfdisk-write-empty-label-also-when-only-ignored-part.patch
Patch6020: backport-fstat-dir-itself.patch
Patch6021: backport-sfdisk-fix-typo-in-move-data-when-check-partition-size.patch
Patch6022: backport-sysfs-fallback-for-partitions-not-including-parent-name.patch
Patch6023: backport-libmount-all-continue-although-proc-is-not-mounted.patch
Patch6024: backport-libblkid-don-t-mark-cache-as-probed-if-sys-not-available.patch
Patch6025: backport-lib-path-make-path-use-more-robust-coverity-scan.patch
Patch6026: backport-Fix-integer-overflow-for-alpha-like-linux.patch
Patch6027: backport-last-don-t-assume-zero-terminate-strings.patch
Patch6028: backport-script-fix-passing-args-to-execlp.patch
Patch6029: backport-scriptlive-fix-argv-0-for-execlp.patch
Patch6030: backport-losetup-fix-memory-leak-asan.patch
Patch6031: backport-partx-remove-memory-leak-to-make-scanners-happy-coverity-scan.patch
Patch6032: backport-lib-path-make-ul_path_read_buffer-more-robust-coverity-scan.patch
Patch6033: backport-libblkid-make-blkid_free_probe-more-robust.patch
Patch6034: backport-libmount-fix-possible-memory-leak-in-mnt_optstr_fix_secontext-coverity-scan.patch
Patch6035: backport-lslocks-fix-maj-min-scanf.patch
Patch6036: backport-column-don-t-require-column-name-for-JSON.patch
Patch6037: backport-libblkid-check-fsync-return-code.patch
Patch6038: backport-lib-strutils-improve-strtoul_or_err-for-negative-numbers.patch
Patch6039: backport-dmesg-fix-since-and-until.patch
Patch6040: backport-lib-allow-safe_getenv-to-work-for-non-root-users.patch
Patch6041: backport-Maybe-there-is-a-little-mistake-in-do_taskset-functi.patch
Patch6042: backport-loopdev-set-block_size-when-using-LOOP_CONFIGURE.patch
Patch6043: backport-libblkid-probe-fix-size-and-offset-overflows-fuzzing.patch
Patch6044: backport-libblkid-bsd-fix-buffer-pointer-use-fuzzing.patch
Patch6045: backport-libblkid-mac-make-sure-block-size-is-large-enough-fuzzing.patch
Patch6046: backport-libblkid-hfs-fix-label-use-fuzzing.patch
Patch6047: backport-libblkid-hfs-fix-make-sure-buffer-is-large-enough.patch
Patch6048: backport-lslogins-fix-free-invalid-pointer.patch
Patch6049: backport-lsns-fix-the-memory-leak.patch
Patch6050: backport-libblkid-src-topology-dm-close-redundant-write-file-.patch
Patch6051: backport-libblkid-topology-init-variables-for-DM.patch
Patch6052: backport-lslogins-improve-prefixes-interpretation.patch
Patch6053: backport-lsblk-fix-endless-loop-if-device-specified-more-than-once.patch
Patch6054: backport-libblkid-avoid-buffer-overflow-in-ocfs-superblock-parsing.patch
Patch6055: backport-fsck-Processes-may-kill-other-processes.patch
Patch6056: backport-fdisk-fix-output-option-parsing.patch
Patch6057: backport-libblkid-exfat-fix-divide-by-zero-coverity-scan.patch
Patch6058: backport-llib-pty-session-split-PTY-and-signalfd-setup.patch
Patch6059: backport-script-fix-use-of-utempter.patch
Patch6060: backport-logger-always-update-header-when-read-from-stdin.patch
Patch6061: backport-libblkid-use-checksum-for-jmicron.patch
Patch6062: backport-libblkid-cleanup-indentation.patch
Patch6063: backport-libblkid-fix-jmicron-checksum-and-LE-to-CPU.patch
Patch6064: backport-libblkid-fix-misaligned-address-in-probe_exfat.patch
Patch6065: backport-ldattach-fix-intro-command-and-pause.patch
Patch6066: backport-iso9660.h-use-more-correct-function-types.patch
Patch6067: backport-iso9660.h-avoid-undefined-signed-integer-shift.patch
Patch6068: backport-ipc_msg_get_limits-always-initialize-memory.patch
Patch6069: backport-wdctl-mark-flags-field-as-unsigned-long.patch
Patch6070: backport-login-never-send-signals-to-init.patch
Patch6071: backport-mkswap-do-not-use-uninitialized-stack-value.patch
Patch6072: backport-lib-pager-fix-signal-safety-issues.patch
Patch6073: backport-libblkid-nvidia_raid-verify-superblock-size.patch
Patch6074: backport-libblkid-nvidia_raid-validate-checksum.patch
Patch6075: backport-libfdisk-Fix-randomly-generated-GPT-UUID-s.patch
Patch6076: backport-write-correctly-handle-wide-characters.patch
Patch6077: backport-wall-convert-homebrew-buffering-to-open_memstream.patch
Patch6078: backport-wall-use-fputs_careful.patch
Patch6079: backport-hexdump-parse-handle-truncated-format-pattern.patch
Patch6080: backport-libblkid-copy-BLKID_PARTS_FORCE_GPT-to-whole-disk-pr.patch
Patch6081: backport-lscpu-fix-p-output-all-caches-delimiter.patch
Patch6082: backport-add-return-in-supam_conv-function.patch
Patch6083: backport-wrap-return-in-else-directive-to-avoid-dead-code.patch
Patch6084: backport-sulogin-ignore-none-existing-console-devices.patch
Patch6085: backport-sulogin-fix-KDGKBMODE-ifdef.patch
Patch6086: backport-unshare-Move-implementation-of-keep-caps-option-to-l.patch
Patch6087: backport-lib-caputils-fix-integer-handling-issues-coverity-sc.patch
Patch6001: backport-unshare-Move-implementation-of-keep-caps-option-to-l.patch
Patch6002: backport-lib-caputils-fix-integer-handling-issues-coverity-sc.patch
Patch9000: Add-check-to-resolve-uname26-version-test-failed.patch
Patch9001: SKIPPED-no-root-permissions-test.patch
Patch9000: SKIPPED-no-root-permissions-test.patch
%ifarch sw_64
Patch9002: util-linux-Add-sw64-architecture.patch
Patch9001: util-linux-Add-sw64-architecture.patch
%endif
BuildRequires: audit-libs-devel >= 1.0.6 gettext-devel libselinux-devel ncurses-devel pam-devel zlib-devel popt-devel
BuildRequires: libutempter-devel systemd-devel systemd libuser-devel libcap-ng-devel python3-devel gcc autoconf automake
BuildRequires: make readline-devel rubygem-asciidoctor po4a
Requires(post): coreutils
Requires: pam >= 1.1.3-7, /etc/pam.d/system-auth audit-libs >= 1.0.6
@ -235,7 +150,7 @@ This package contains some doc and man help files for %{name}.
%build
%define _build_arg0__ CFLAGS="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $RPM_OPT_FLAGS" SUID_CFLAGS="-fpie"
%define _build_arg1__ SUID_LDFLAGS="-pie -Wl,-z,relro -Wl,-z,now" DAEMON_CFLAGS="$SUID_CFLAGS" DAEMON_LDFLAGS="$SUID_LDFLAGS"
autoreconf
#autoreconf
unset LINGUAS || :
# del support enable-raw https://github.com/torvalds/linux/commit/603e4922f1c81fc2ed3a87b4f91a8d3aafc7e093
@ -260,7 +175,6 @@ unset LINGUAS || :
%make_build %{_build_arg0__} %{_build_arg1__}
%check
export TS_OPT_misc_setarch_known_fail="yes"
make check
%install
@ -299,6 +213,9 @@ find %{buildroot}%{_mandir}/man8 -regextype posix-egrep \
-regex ".*(linux32|linux64|aarch64|i386|x86_64|uname26)\.8.*" \
-printf "%{_mandir}/man8/%f*\n" > %{name}-help.files
%find_lang %name --all-name --with-man --without-mo
cat %{name}.lang >> %{name}-help.files
rm -rf %{buildroot}%{_libdir}/*.{la,a}
rm -rf %{buildroot}%{_libdir}/python*/site-packages/*.{la,a}
@ -389,9 +306,9 @@ fi
%{_bindir}/{cal,chrt,col,colcrt,colrm,column,chmem,dmesg,eject,fallocate,fincore,findmnt,choom,uclampset}
%{_bindir}/{flock,getopt,hexdump,ionice,ipcmk,ipcrm,ipcs,isosize,kill,last,lastb,logger,hardlink}
%{_bindir}/{look,lsblk,lscpu,lsipc,lslocks,lslogins,lsmem,lsns,mcookie,mesg,more,mountpoint}
%{_bindir}/{namei,nsenter,prlimit,rename,renice,rev,script,scriptreplay,setarch,setpriv}
%{_bindir}/{namei,nsenter,prlimit,rename,renice,rev,script,scriptreplay,setarch,setpriv,pipesz,lsfd,waitpid,fadvise}
%{_bindir}/{setsid,setterm,taskset,ul,unshare,utmpdump,uuidgen,uuidparse,wdctl,whereis,scriptlive,irqtop,lsirq}
%{_sbindir}/{addpart,agetty,blkdiscard,blkid,blkzone,blockdev,chcpu,ctrlaltdel,delpart,fdisk}
%{_sbindir}/{addpart,agetty,blkdiscard,blkpr,blkid,blkzone,blockdev,chcpu,ctrlaltdel,delpart,fdisk}
%{_sbindir}/{findfs,fsck,fsck.cramfs,fsck.minix,fsfreeze,fstrim,ldattach,losetup,mkfs,mkfs.cramfs}
%{_sbindir}/{mkfs.minix,mkswap,nologin,partx,pivot_root,readprofile,resizepart,rfkill,rtcwake}
%{_sbindir}/{runuser,sulogin,swaplabel,swapoff,swapon,switch_root,wipefs,zramctl}
@ -401,7 +318,7 @@ fi
%{compldir}/{fincore,findfs,findmnt,flock,fsck,fsck.cramfs,fsck.minix,fsfreeze}
%{compldir}/{fstrim,getopt,hexdump,ionice,ipcmk,ipcrm,ipcs,isosize,last,ldattach}
%{compldir}/{logger,look,losetup,lsblk,lscpu,lsipc,lslocks,lslogins,lsmem,lsns}
%{compldir}/{mcookie,mesg,mkfs,mkfs.cramfs,mkfs.minix,mkswap,more,mountpoint}
%{compldir}/{mcookie,mesg,mkfs,mkfs.cramfs,mkfs.minix,mkswap,more,mountpoint,pipesz,fadvise,lastb,waitpid}
%{compldir}/{namei,nsenter,partx,pivot_root,prlimit,readprofile,rename,renice}
%{compldir}/{resizepart,rev,rfkill,rtcwake,runuser,script,scriptreplay,setarch}
%{compldir}/{setpriv,setsid,setterm,su,swaplabel,swapoff,swapon,taskset,ul,unshare}
@ -446,7 +363,7 @@ fi
%files -n python3-libmount
%{!?_licensedir:%global license %%doc}
%license libmount/COPYING
%license Documentation/licenses/COPYING.LGPL-2.1-or-later libmount/COPYING
%{_libdir}/python*/site-packages/libmount/
%files devel
@ -454,7 +371,8 @@ fi
%{_libdir}/{libfdisk.so,libsmartcols.so,libuuid.so,libblkid.so,libmount.so}
%{_libdir}/pkgconfig/{fdisk.pc,smartcols.pc,uuid.pc,blkid.pc,mount.pc}
%files help
%files help -f %{name}-help.files
%exclude %{_mandir}/man1/*
%exclude %{_datadir}/doc/util-linux/getopt/*
%{_docdir}/%{name}/getopt-example.*
%doc README NEWS Documentation/deprecated.txt
@ -463,20 +381,26 @@ fi
%{_mandir}/man1/{fallocate.1*,fincore.1*,flock.1*,getopt.1*,hexdump.1*,ionice.1*,ipcmk.1*,ipcrm.1*,ipcs.1*}
%{_mandir}/man1/{kill.1*,last.1*,lastb.1*,logger.1*,login.1*,look.1*,lscpu.1*,lsipc.1*,lslogins.1*,lsmem.1*}
%{_mandir}/man1/{mcookie.1*,mesg.1*,more.1*,mountpoint.1*,namei.1*,nsenter.1*,prlimit.1*,rename.1*,renice.1*}
%{_mandir}/man1/{rev.1*,runuser.1*,script.1*,scriptreplay.1*,setpriv.1*,setsid.1*,setterm.1*,su.1*,taskset.1*}
%{_mandir}/man1/{rev.1*,runuser.1*,script.1*,scriptreplay.1*,setpriv.1*,setsid.1*,setterm.1*,su.1*,taskset.1*,pipesz.1.*,lsfd.1*,fadvise.1.*}
%{_mandir}/man1/{ul.1*,unshare.1*,utmpdump.1.gz,uuidgen.1*,uuidparse.1*,wall.1*,whereis.1*,write.1*,choom.1*,scriptlive*,hardlink.1*,irqtop.1*,lsirq.1*}
%{_mandir}/man3/{libblkid.3*,uuid.3*,uuid_clear.3*,uuid_compare.3*,uuid_copy.3*,uuid_generate.3*,uuid_generate_random.3*}
%{_mandir}/man3/{uuid_generate_time_safe.3*,uuid_is_null.3*,uuid_parse.3*,uuid_time.3*,uuid_unparse.3*,uuid_generate_time.3*}
%{_mandir}/man5/{fstab.5*,terminal-colors.d.5*,adjtime_config.5.*}
%{_mandir}/man5/{fstab.5*,terminal-colors.d.5*,adjtime_config.5.*,waitpid.1.*}
%{_mandir}/man8/{uuidd.8*,fdformat.8*,hwclock.8*,clock.8*,cfdisk.8*,sfdisk.8*,addpart.8*,agetty.8*}
%{_mandir}/man8/{blkdiscard.8*,blkid.8*,blkzone.8*,blockdev.8*,chcpu.8*,chmem.8*,ctrlaltdel.8*,delpart.8*}
%{_mandir}/man8/{fdisk.8*,findfs.8*,findmnt.8*,fsck.8*,fsck.cramfs.8*,fsck.minix.8*,fsfreeze.8*,fstrim.8*}
%{_mandir}/man8/{fdisk.8*,findfs.8*,findmnt.8*,fsck.8*,fsck.cramfs.8*,fsck.minix.8*,fsfreeze.8*,fstrim.8*,blkpr.8.*}
%{_mandir}/man8/{isosize.8*,ldattach.8*,losetup.8*,lsblk.8*,lslocks.8*,lsns.8*,mkfs.8*,mkfs.cramfs.8*}
%{_mandir}/man8/{mkfs.minix.8*,mkswap.8*,mount.8*,nologin.8*,partx.8*,pivot_root.8*}
%{_mandir}/man8/{readprofile.8*,resizepart.8*,rfkill.8*,rtcwake.8*,setarch.8*,sulogin.8.gz,swaplabel.8*}
%{_mandir}/man8/{swapoff.8*,swapon.8*,switch_root.8*,umount.8*,wdctl.8.gz,wipefs.8*,zramctl.8*}
%changelog
* Wed Jul 19 2023 zhangyao <zhangyao108@huawei.com> - 2.39.1-1
- Type:bugfix
- CVE:NA
- SUG:NA
- DESC:upgrade to 2.39.1
* Thu Jun 15 2023 zhangyao <zhangyao108@huawei.com> - 2.37.2-20
- Type:bugfix
- CVE:NA