diff --git a/backport-include-c.h-add-helpers-for-unaligned-structure-acce.patch b/backport-include-c.h-add-helpers-for-unaligned-structure-acce.patch new file mode 100644 index 0000000..8721f20 --- /dev/null +++ b/backport-include-c.h-add-helpers-for-unaligned-structure-acce.patch @@ -0,0 +1,35 @@ +From 68459714838c8c0c2d34b6d658638f5d59298bc7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= +Date: Sun, 1 Oct 2023 13:57:12 +0200 +Subject: [PATCH] include/c.h: add helpers for unaligned structure access +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Thomas Weißschuh +--- + include/c.h | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/include/c.h b/include/c.h +index 752f568c5..224a8e54f 100644 +--- a/include/c.h ++++ b/include/c.h +@@ -213,6 +213,14 @@ + (type *)( (char *)__mptr - offsetof(type,member) );}) + #endif + ++#define read_unaligned_member(p, m) __extension__ ({ \ ++ size_t offset = offsetof(__typeof__(* p), m); \ ++ __typeof__(p->m) v; \ ++ memcpy(&v, ((unsigned char *)p) + offset, sizeof(v)); \ ++ v; }) ++ ++#define member_ptr(p, m) (((unsigned char *)p) + offsetof(__typeof__(*p), m)) ++ + #ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME + # ifdef HAVE___PROGNAME + extern char *__progname; +-- +2.33.0 + diff --git a/backport-libblkid-avoid-aligning-out-of-probing-area.patch b/backport-libblkid-avoid-aligning-out-of-probing-area.patch new file mode 100644 index 0000000..f37064c --- /dev/null +++ b/backport-libblkid-avoid-aligning-out-of-probing-area.patch @@ -0,0 +1,46 @@ +From 025b11465d086c55948eff484f40c993f2184990 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= +Date: Fri, 12 Jan 2024 08:47:50 +0100 +Subject: [PATCH] libblkid: avoid aligning out of probing area +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When reading from the end of the device the IO size alignment could +enlarge the read buffer outside of the probing area. +This would then trigger a read failure. + +Signed-off-by: Thomas Weißschuh +--- + libblkid/src/probe.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c +index fee5b55..0e716b5 100644 +--- a/libblkid/src/probe.c ++++ b/libblkid/src/probe.c +@@ -648,13 +648,18 @@ static int hide_buffer(blkid_probe pr, uint64_t off, uint64_t len) + unsigned char *blkid_probe_get_buffer(blkid_probe pr, uint64_t off, uint64_t len) + { + struct blkid_bufinfo *bf = NULL; +- uint64_t real_off, bias; ++ uint64_t real_off, bias, len_align; + + bias = off % pr->io_size; + off -= bias; + len += bias; +- if (len % pr->io_size) +- len += pr->io_size - (len % pr->io_size); ++ ++ if (len % pr->io_size) { ++ len_align = pr->io_size - (len % pr->io_size); ++ ++ if (pr->off + off + len + len_align <= pr->size) ++ len += len_align; ++ } + + real_off = pr->off + off; + +-- +2.33.0 + diff --git a/backport-libblkid-drbd-validate-zero-padding.patch b/backport-libblkid-drbd-validate-zero-padding.patch new file mode 100644 index 0000000..4d7ae43 --- /dev/null +++ b/backport-libblkid-drbd-validate-zero-padding.patch @@ -0,0 +1,81 @@ +From 4ee2db2a221f6404f9fe9470da7c384a25cceea3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= +Date: Fri, 12 Jan 2024 08:50:14 +0100 +Subject: [PATCH] libblkid: (drbd) validate zero padding +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This should reduce false-positives. + +See #2701. + +Signed-off-by: Thomas Weißschuh +--- + libblkid/src/superblocks/drbd.c | 27 +++++++++++++++++++++------ + 1 file changed, 21 insertions(+), 6 deletions(-) + +diff --git a/libblkid/src/superblocks/drbd.c b/libblkid/src/superblocks/drbd.c +index f360186..1723229 100644 +--- a/libblkid/src/superblocks/drbd.c ++++ b/libblkid/src/superblocks/drbd.c +@@ -70,9 +70,8 @@ struct md_on_disk_08 { + uint32_t bm_bytes_per_bit; + uint32_t reserved_u32[4]; + +- /* Unnecessary for libblkid ** +- * char reserved[8 * 512 - (8*(UI_SIZE+3)+4*11)]; +- */ ++ unsigned char padding_start[0]; ++ unsigned char padding_end[0] __attribute__((aligned(4096))); + }; + + /* +@@ -118,11 +117,19 @@ struct meta_data_on_disk_9 { + struct peer_dev_md_on_disk_9 peers[DRBD_PEERS_MAX]; + uint64_t history_uuids[HISTORY_UUIDS]; + +- /* Unnecessary for libblkid ** +- * char padding[0] __attribute__((aligned(4096))); +- */ ++ unsigned char padding_start[0]; ++ unsigned char padding_end[0] __attribute__((aligned(4096))); + } __attribute__((packed)); + ++static int is_zero_padded(const unsigned char *padding_start, ++ const unsigned char *padding_end) ++{ ++ for (; padding_start < padding_end; padding_start++) { ++ if (*padding_start != 0) ++ return 0; ++ } ++ return 1; ++} + + static int probe_drbd_84(blkid_probe pr) + { +@@ -146,6 +153,10 @@ static int probe_drbd_84(blkid_probe pr) + be32_to_cpu(md->magic) != DRBD_MD_MAGIC_84_UNCLEAN) + return 1; + ++ if (!is_zero_padded(member_ptr(md, padding_start), ++ member_ptr(md, padding_end))) ++ return 1; ++ + /* + * DRBD does not have "real" uuids; the following resembles DRBD's + * notion of uuids (64 bit, see struct above) +@@ -190,6 +201,10 @@ static int probe_drbd_90(blkid_probe pr) + if (be32_to_cpu(md->magic) != DRBD_MD_MAGIC_09) + return 1; + ++ if (!is_zero_padded(member_ptr(md, padding_start), ++ member_ptr(md, padding_end))) ++ return 1; ++ + /* + * DRBD does not have "real" uuids; the following resembles DRBD's + * notion of uuids (64 bit, see struct above) +-- +2.33.0 + diff --git a/backport-libblkid-probe-read-data-in-chunks.patch b/backport-libblkid-probe-read-data-in-chunks.patch new file mode 100644 index 0000000..7be910a --- /dev/null +++ b/backport-libblkid-probe-read-data-in-chunks.patch @@ -0,0 +1,119 @@ +From 8a534253bc52f453db21af02299efacd12f40fda Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= +Date: Sat, 30 Sep 2023 23:59:44 +0200 +Subject: [PATCH] libblkid: (probe) read data in chunks +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Thomas Weißschuh +--- + libblkid/src/blkidP.h | 1 + + libblkid/src/probe.c | 39 ++++++++++++++++++++++++++++++++++----- + 2 files changed, 35 insertions(+), 5 deletions(-) + +diff --git a/libblkid/src/blkidP.h b/libblkid/src/blkidP.h +index 5fbab82..af949c0 100644 +--- a/libblkid/src/blkidP.h ++++ b/libblkid/src/blkidP.h +@@ -201,6 +201,7 @@ struct blkid_struct_probe + int fd; /* device file descriptor */ + uint64_t off; /* begin of data on the device */ + uint64_t size; /* end of data on the device */ ++ uint64_t io_size; /* optimal size of IO */ + + dev_t devno; /* device number (st.st_rdev) */ + dev_t disk_devno; /* devno of the whole-disk or 0 */ +diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c +index 2e36274..fee5b55 100644 +--- a/libblkid/src/probe.c ++++ b/libblkid/src/probe.c +@@ -173,6 +173,7 @@ blkid_probe blkid_clone_probe(blkid_probe parent) + pr->fd = parent->fd; + pr->off = parent->off; + pr->size = parent->size; ++ pr->io_size = parent->io_size; + pr->devno = parent->devno; + pr->disk_devno = parent->disk_devno; + pr->blkssz = parent->blkssz; +@@ -647,13 +648,21 @@ static int hide_buffer(blkid_probe pr, uint64_t off, uint64_t len) + unsigned char *blkid_probe_get_buffer(blkid_probe pr, uint64_t off, uint64_t len) + { + struct blkid_bufinfo *bf = NULL; +- uint64_t real_off = pr->off + off; ++ uint64_t real_off, bias; ++ ++ bias = off % pr->io_size; ++ off -= bias; ++ len += bias; ++ if (len % pr->io_size) ++ len += pr->io_size - (len % pr->io_size); ++ ++ real_off = pr->off + off; + + /* + 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) { ++ if (pr->size == 0 || pr->io_size == 0) { + errno = EINVAL; + return NULL; + } +@@ -700,7 +709,7 @@ unsigned char *blkid_probe_get_buffer(blkid_probe pr, uint64_t off, uint64_t len + assert(bf->off + bf->len >= real_off + len); + + errno = 0; +- return real_off ? bf->data + (real_off - bf->off) : bf->data; ++ return real_off ? bf->data + (real_off - bf->off + bias) : bf->data + bias; + } + + /** +@@ -861,6 +870,22 @@ failed: + + #endif + ++static uint64_t blkid_get_io_size(int fd) ++{ ++ static const int ioctls[] = { BLKIOOPT, BLKIOMIN, BLKBSZGET }; ++ unsigned int s; ++ size_t i; ++ int r; ++ ++ for (i = 0; i < ARRAY_SIZE(ioctls); i++) { ++ r = ioctl(fd, ioctls[i], &s); ++ if (r == 0 && is_power_of_2(s) && s >= DEFAULT_SECTOR_SIZE) ++ return min(s, 1U << 16); ++ } ++ ++ return DEFAULT_SECTOR_SIZE; ++} ++ + /** + * blkid_probe_set_device: + * @pr: probe +@@ -906,6 +931,7 @@ int blkid_probe_set_device(blkid_probe pr, int fd, + pr->fd = fd; + pr->off = (uint64_t) off; + pr->size = 0; ++ pr->io_size = DEFAULT_SECTOR_SIZE; + pr->devno = 0; + pr->disk_devno = 0; + pr->mode = 0; +@@ -1012,8 +1038,11 @@ int blkid_probe_set_device(blkid_probe pr, int fd, + #endif + free(dm_uuid); + +- DBG(LOWPROBE, ul_debug("ready for low-probing, offset=%"PRIu64", size=%"PRIu64"", +- pr->off, pr->size)); ++ if (S_ISBLK(sb.st_mode) && !blkid_probe_is_tiny(pr)) ++ pr->io_size = blkid_get_io_size(fd); ++ ++ DBG(LOWPROBE, ul_debug("ready for low-probing, offset=%"PRIu64", size=%"PRIu64", iosize=%"PRIu64, ++ pr->off, pr->size, pr->io_size)); + DBG(LOWPROBE, ul_debug("whole-disk: %s, regfile: %s", + blkid_probe_is_wholedisk(pr) ?"YES" : "NO", + S_ISREG(pr->mode) ? "YES" : "NO")); +-- +2.33.0 + diff --git a/util-linux.spec b/util-linux.spec index 4cdec85..3204d0a 100644 --- a/util-linux.spec +++ b/util-linux.spec @@ -3,7 +3,7 @@ Name: util-linux Version: 2.37.2 -Release: 24 +Release: 25 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 @@ -131,6 +131,10 @@ Patch6109: backport-libsmartcols-flush-correct-stream.patch Patch6110: backport-libsmartcols-only-recognize-closed-object-as-final-e.patch Patch6111: backport-cal-avoid-out-of-bound-write.patch Patch6112: backport-libfdisk-sun-properly-initialize-partition-data.patch +Patch6113: backport-include-c.h-add-helpers-for-unaligned-structure-acce.patch +Patch6114: backport-libblkid-probe-read-data-in-chunks.patch +Patch6115: backport-libblkid-avoid-aligning-out-of-probing-area.patch +Patch6116: backport-libblkid-drbd-validate-zero-padding.patch Patch9000: Add-check-to-resolve-uname26-version-test-failed.patch Patch9001: SKIPPED-no-root-permissions-test.patch @@ -502,6 +506,16 @@ fi %{_mandir}/man8/{swapoff.8*,swapon.8*,switch_root.8*,umount.8*,wdctl.8.gz,wipefs.8*,zramctl.8*} %changelog +* Mon Feb 19 2024 zhangyao - 2.37.2-25 +- Type:bugfix +- CVE:NA +- SUG:NA +- DESC:solve the issue of ext4 is incorrectly probed as drbd + [add]backport-include-c.h-add-helpers-for-unaligned-structure-acce.patch + backport-libblkid-probe-read-data-in-chunks.patch + backport-libblkid-avoid-aligning-out-of-probing-area.patch + backport-libblkid-drbd-validate-zero-padding.patch + * Tue Jan 16 2024 zhangyao - 2.37.2-24 - Type:bugfix - CVE:NA