From: Thomas Weißschuh Date: Fri, 12 Jan 2024 07:50:14 +0000 (+0100) Subject: libblkid: (drbd) validate zero padding X-Git-Tag: v2.40-rc1~45^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4ee2db2a221f6404f9fe9470da7c384a25cceea3;p=thirdparty%2Futil-linux.git libblkid: (drbd) validate zero padding This should reduce false-positives. See #2701. Signed-off-by: Thomas Weißschuh --- diff --git a/libblkid/src/superblocks/drbd.c b/libblkid/src/superblocks/drbd.c index baead1d78a..b425906927 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,12 +117,21 @@ 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, const struct blkid_idmag *mag) { struct md_on_disk_08 *md; @@ -132,6 +140,10 @@ static int probe_drbd_84(blkid_probe pr, const struct blkid_idmag *mag) if (!md) return errno ? -errno : 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) @@ -153,6 +165,10 @@ static int probe_drbd_90(blkid_probe pr, const struct blkid_idmag *mag) if (!md) return errno ? -errno : 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)