From fe3be4ec369d6f66049b8d635255ada85b684c69 Mon Sep 17 00:00:00 2001 From: zhangyao Date: Mon, 11 Mar 2024 15:55:59 +0800 Subject: [PATCH] sync community patches (cherry picked from commit be519bb33244b99b8f4858cd258b8488f8fa16e2) --- ...ibblkid-Check-offset-in-LUKS2-header.patch | 82 +++++++ backport-more-fix-poll-use.patch | 207 ++++++++++++++++++ ...-Unblock-SIGSEGV-before-vmware_bdoor.patch | 68 ++++++ util-linux.spec | 14 +- 4 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 backport-libblkid-Check-offset-in-LUKS2-header.patch create mode 100644 backport-more-fix-poll-use.patch create mode 100644 backport-sys-utils-lscpu-Unblock-SIGSEGV-before-vmware_bdoor.patch diff --git a/backport-libblkid-Check-offset-in-LUKS2-header.patch b/backport-libblkid-Check-offset-in-LUKS2-header.patch new file mode 100644 index 0000000..2021b8b --- /dev/null +++ b/backport-libblkid-Check-offset-in-LUKS2-header.patch @@ -0,0 +1,82 @@ +From e49de00f4a22f91ec5af08d97e30a198cd64e00d Mon Sep 17 00:00:00 2001 +From: Milan Broz +Date: Fri, 16 Feb 2024 16:44:12 +0100 +Subject: [PATCH] libblkid: Check offset in LUKS2 header + +LUKS2 binary header contains offset field that describes where +the header should be located. + +If this offset is not correct, blkid should tread this header +as invalid. + +This patch fixes problem when both swap and LUKS headers are +present (LUKS header was swapped out) and detected LUKS header +is at a wrong offset. +As LUKS has higher priority, it confuses detection. + +Signed-off-by: Milan Broz +--- + libblkid/src/superblocks/luks.c | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +diff --git a/libblkid/src/superblocks/luks.c b/libblkid/src/superblocks/luks.c +index 0230b34..4623c98 100644 +--- a/libblkid/src/superblocks/luks.c ++++ b/libblkid/src/superblocks/luks.c +@@ -1,6 +1,6 @@ + /* + * Copyright (C) 2008 Karel Zak +- * Copyright (C) 2018 Milan Broz ++ * Copyright (C) 2018-2024 Milan Broz + * + * Inspired by libvolume_id by + * Kay Sievers +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + + #include "superblocks.h" + +@@ -96,6 +97,19 @@ static int luks_attributes(blkid_probe pr, struct luks2_phdr *header, uint64_t o + return BLKID_PROBE_OK; + } + ++static bool luks_valid(struct luks2_phdr *header, const char *magic, uint64_t offset) ++{ ++ if (memcmp(header->magic, magic, LUKS_MAGIC_L)) ++ return false; ++ ++ /* LUKS2 header is not at expected offset */ ++ if (be16_to_cpu(header->version) == 2 && ++ be64_to_cpu(header->hdr_offset) != offset) ++ return false; ++ ++ return true; ++} ++ + static int probe_luks(blkid_probe pr, const struct blkid_idmag *mag __attribute__((__unused__))) + { + struct luks2_phdr *header; +@@ -105,7 +119,7 @@ static int probe_luks(blkid_probe pr, const struct blkid_idmag *mag __attribute_ + if (!header) + return errno ? -errno : BLKID_PROBE_NONE; + +- if (!memcmp(header->magic, LUKS_MAGIC, LUKS_MAGIC_L)) { ++ if (luks_valid(header, LUKS_MAGIC, 0)) { + /* LUKS primary header was found. */ + return luks_attributes(pr, header, 0); + } +@@ -118,7 +132,7 @@ static int probe_luks(blkid_probe pr, const struct blkid_idmag *mag __attribute_ + if (!header) + return errno ? -errno : BLKID_PROBE_NONE; + +- if (!memcmp(header->magic, LUKS_MAGIC_2, LUKS_MAGIC_L)) ++ if (luks_valid(header, LUKS_MAGIC_2, secondary_offsets[i])) + return luks_attributes(pr, header, secondary_offsets[i]); + } + +-- +2.33.0 + diff --git a/backport-more-fix-poll-use.patch b/backport-more-fix-poll-use.patch new file mode 100644 index 0000000..d07d737 --- /dev/null +++ b/backport-more-fix-poll-use.patch @@ -0,0 +1,207 @@ +From fe23722854f651984fad597cbb5b44653f72832a Mon Sep 17 00:00:00 2001 +From: Karel Zak +Date: Tue, 20 Feb 2024 12:26:33 +0100 +Subject: [PATCH] more: fix poll() use + +The more(1) command utilizes signalfd() to monitor signals and reads +commands from the user via stderr (as stdin is typically used for +piping and not for user interaction). + +However, the current more_poll() implementation ignores stderr. As a result, +more(1) waits on read(stderr) while completely ignoring signals. This issue +becomes evident when using commands like: + + grep foo /path/file | more + +In such cases, it's only possible to exit 'more' by pressing 'q'; +CTRL+C does not work. + +Changes: + +- Refactor more_poll() code: + - Introduce an enum to access pfd[] items instead of using magical constants. + - Implement a while() loop to handle EAGAIN or POLLHUP. + +- Ignore stdin after POLLHUP (indicating that the pipe's peer closed). +- Ensure stderr is also checked. +- Use return codes akin to classic poll(). + +Note: I have doubts regarding the usability of stdin in more_poll(), +as the function is primarily used to wait for user input (via stderr) +and to monitor signals. Nevertheless, it is retained for potential use +in detecting when the pipe's peer (or the entire session) has been +terminated (see commit 68e14d3d5f4116ad3aca0e392d008645ea90cf70). + +Signed-off-by: Karel Zak +--- + text-utils/more.c | 126 ++++++++++++++++++++++++++++++---------------- + 1 file changed, 82 insertions(+), 44 deletions(-) + +diff --git a/text-utils/more.c b/text-utils/more.c +index c4edbc0..eb58446 100644 +--- a/text-utils/more.c ++++ b/text-utils/more.c +@@ -199,6 +199,7 @@ struct more_control { + magic_t magic; /* libmagic database entries */ + #endif + unsigned int ++ ignore_stdin:1, /* POLLHUP; peer closed pipe */ + bad_stdout:1, /* true if overwriting does not turn off standout */ + catch_suspend:1, /* we should catch the SIGTSTP signal */ + clear_line_ends:1, /* do not scroll, paint each screen from the top */ +@@ -1341,55 +1342,92 @@ static void read_line(struct more_control *ctl) + *p = '\0'; + } + ++/* returns: 0 timeout or nothing; <0 error, >0 success */ + static int more_poll(struct more_control *ctl, int timeout) + { +- struct pollfd pfd[2]; ++ enum { ++ POLLFD_SIGNAL = 0, ++ POLLFD_STDIN, ++ POLLFD_STDERR, ++ }; ++ struct pollfd pfd[] = { ++ [POLLFD_SIGNAL] = { .fd = ctl->sigfd, .events = POLLIN | POLLERR | POLLHUP }, ++ [POLLFD_STDIN] = { .fd = STDIN_FILENO, .events = POLLIN | POLLERR | POLLHUP }, ++ [POLLFD_STDERR] = { .fd = STDERR_FILENO, .events = POLLIN | POLLERR | POLLHUP } ++ }; ++ int has_data = 0; + +- pfd[0].fd = ctl->sigfd; +- pfd[0].events = POLLIN | POLLERR | POLLHUP; +- pfd[1].fd = STDIN_FILENO; +- pfd[1].events = POLLIN; ++ while (!has_data) { ++ int rc; + +- if (poll(pfd, 2, timeout) < 0) { +- if (errno == EAGAIN) +- return 1; +- more_error(ctl, _("poll failed")); +- return 1; +- } +- if (pfd[0].revents != 0) { +- struct signalfd_siginfo info; +- ssize_t sz; +- +- sz = read(pfd[0].fd, &info, sizeof(info)); +- assert(sz == sizeof(info)); +- switch (info.ssi_signo) { +- case SIGINT: +- more_exit(ctl); +- break; +- case SIGQUIT: +- sigquit_handler(ctl); +- break; +- case SIGTSTP: +- sigtstp_handler(ctl); +- break; +- case SIGCONT: +- sigcont_handler(ctl); +- break; +- case SIGWINCH: +- sigwinch_handler(ctl); +- break; +- default: +- abort(); ++ if (ctl->ignore_stdin) ++ pfd[POLLFD_STDIN].fd = -1; /* probably closed, ignore */ ++ ++ rc = poll(pfd, ARRAY_SIZE(pfd), timeout); ++ ++ /* error */ ++ if (rc < 0) { ++ if (errno == EAGAIN) ++ continue; ++ ++ more_error(ctl, _("poll failed")); ++ return rc; + } +- } + +- /* Check for POLLERR and POLLHUP in stdin revents */ +- if ((pfd[1].revents & POLLERR) && (pfd[1].revents & POLLHUP)) +- more_exit(ctl); ++ /* timeout */ ++ if (rc == 0) ++ return 0; + +- if (pfd[1].revents == 0) +- return 1; +- return 0; ++ /* event on signal FD */ ++ if (pfd[POLLFD_SIGNAL].revents) { ++ struct signalfd_siginfo info; ++ ssize_t sz; ++ ++ sz = read(pfd[POLLFD_SIGNAL].fd, &info, sizeof(info)); ++ assert(sz == sizeof(info)); ++ switch (info.ssi_signo) { ++ case SIGINT: ++ more_exit(ctl); ++ break; ++ case SIGQUIT: ++ sigquit_handler(ctl); ++ break; ++ case SIGTSTP: ++ sigtstp_handler(ctl); ++ break; ++ case SIGCONT: ++ sigcont_handler(ctl); ++ break; ++ case SIGWINCH: ++ sigwinch_handler(ctl); ++ break; ++ default: ++ abort(); ++ } ++ } ++ ++ /* event on stdin */ ++ if (pfd[POLLFD_STDIN].revents) { ++ /* Check for POLLERR and POLLHUP in stdin revents */ ++ if ((pfd[POLLFD_STDIN].revents & POLLERR) && ++ (pfd[POLLFD_STDIN].revents & POLLHUP)) ++ more_exit(ctl); ++ ++ /* poll() return POLLHUP event after pipe close() and POLLNVAL ++ * means that fd is already closed. */ ++ if ((pfd[POLLFD_STDIN].revents & POLLHUP) || ++ (pfd[POLLFD_STDIN].revents & POLLNVAL)) ++ ctl->ignore_stdin = 1; ++ else ++ has_data++; ++ } ++ ++ /* event on stderr (we reads user commands from stderr!) */ ++ if (pfd[POLLFD_STDERR].revents) ++ has_data++; ++ } ++ ++ return has_data; + } + + /* Search for nth occurrence of regular expression contained in buf in +@@ -1457,7 +1495,7 @@ static void search(struct more_control *ctl, char buf[], int n) + } + break; + } +- more_poll(ctl, 1); ++ more_poll(ctl, 0); + } + /* Move ctrl+c signal handling back to more_key_command(). */ + signal(SIGINT, SIG_DFL); +@@ -1621,7 +1659,7 @@ static int more_key_command(struct more_control *ctl, char *filename) + ctl->report_errors = 0; + ctl->search_called = 0; + for (;;) { +- if (more_poll(ctl, -1) != 0) ++ if (more_poll(ctl, -1) <= 0) + continue; + cmd = read_command(ctl); + if (cmd.key == more_kc_unknown_command) +-- +2.33.0 + diff --git a/backport-sys-utils-lscpu-Unblock-SIGSEGV-before-vmware_bdoor.patch b/backport-sys-utils-lscpu-Unblock-SIGSEGV-before-vmware_bdoor.patch new file mode 100644 index 0000000..58f2fd1 --- /dev/null +++ b/backport-sys-utils-lscpu-Unblock-SIGSEGV-before-vmware_bdoor.patch @@ -0,0 +1,68 @@ +From 5533e237c8047ff941bb3720237c58413441e35c Mon Sep 17 00:00:00 2001 +From: WanBingjiang +Date: Fri, 2 Feb 2024 10:43:08 +0800 +Subject: [PATCH] sys-utils/lscpu: Unblock SIGSEGV before vmware_bdoor + +--- + sys-utils/lscpu-virt.c | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/sys-utils/lscpu-virt.c b/sys-utils/lscpu-virt.c +index 4d301271a..6ba7c02dc 100644 +--- a/sys-utils/lscpu-virt.c ++++ b/sys-utils/lscpu-virt.c +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + + #include "lscpu.h" + +@@ -454,6 +455,7 @@ void vmware_bdoor(uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) + } + + static jmp_buf segv_handler_env; ++static sigset_t oset; + + static void + segv_handler(__attribute__((__unused__)) int sig, +@@ -467,6 +469,7 @@ static int is_vmware_platform(void) + { + uint32_t eax, ebx, ecx, edx; + struct sigaction act, oact; ++ sigset_t set; + + /* + * FIXME: Not reliable for non-root users. Note it works as expected if +@@ -485,8 +488,16 @@ static int is_vmware_platform(void) + * the signal. All this magic is needed because lscpu + * isn't supposed to require root privileges. + */ +- if (sigsetjmp(segv_handler_env, 1)) ++ if (sigsetjmp(segv_handler_env, 1)) { ++ if (sigprocmask(SIG_SETMASK, &oset, NULL)) ++ err(EXIT_FAILURE, _("cannot restore signal mask")); + return 0; ++ } ++ ++ sigemptyset(&set); ++ sigaddset(&set, SIGSEGV); ++ if (sigprocmask(SIG_UNBLOCK, &set, &oset)) ++ err(EXIT_FAILURE, _("cannot unblock signal")); + + memset(&act, 0, sizeof(act)); + act.sa_sigaction = segv_handler; +@@ -500,6 +511,9 @@ static int is_vmware_platform(void) + if (sigaction(SIGSEGV, &oact, NULL)) + err(EXIT_FAILURE, _("cannot restore signal handler")); + ++ if (sigprocmask(SIG_SETMASK, &oset, NULL)) ++ err(EXIT_FAILURE, _("cannot restore signal mask")); ++ + return eax != (uint32_t)-1 && ebx == VMWARE_BDOOR_MAGIC; + } + +-- +2.33.0 + diff --git a/util-linux.spec b/util-linux.spec index 1c3136a..ddf5e16 100644 --- a/util-linux.spec +++ b/util-linux.spec @@ -3,7 +3,7 @@ Name: util-linux Version: 2.37.2 -Release: 26 +Release: 27 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 @@ -140,6 +140,9 @@ Patch6118: backport-libblkid-hfsplus-reduce-false-positive.patch Patch6119: backport-wall-fix-calloc-cal-Werror-calloc-transposed-args.patch Patch6120: backport-libblkid-drbd-reduce-false-positive.patch Patch6121: backport-lib-cpuset-exit-early-from-cpulist_parse.patch +Patch6122: backport-sys-utils-lscpu-Unblock-SIGSEGV-before-vmware_bdoor.patch +Patch6123: backport-libblkid-Check-offset-in-LUKS2-header.patch +Patch6124: backport-more-fix-poll-use.patch Patch9000: Add-check-to-resolve-uname26-version-test-failed.patch Patch9001: SKIPPED-no-root-permissions-test.patch @@ -511,6 +514,15 @@ fi %{_mandir}/man8/{swapoff.8*,swapon.8*,switch_root.8*,umount.8*,wdctl.8.gz,wipefs.8*,zramctl.8*} %changelog +* Mon Mar 11 2024 zhangyao - 2.37.2-27 +- Type:bugfix +- CVE:NA +- SUG:NA +- DESC:sync community patches + backport-sys-utils-lscpu-Unblock-SIGSEGV-before-vmware_bdoor.patch + backport-libblkid-Check-offset-in-LUKS2-header.patch + backport-more-fix-poll-use.patch + * Fri Mar 8 2024 zhangyao - 2.37.2-26 - Type:bugfix - CVE:NA -- Gitee