From ccbb2b6ae096ad75d6f6ea97b7b54fbf653d6831 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Thomas=20Wei=C3=9Fschuh?= Date: Sat, 22 Oct 2022 03:58:10 +0200 Subject: [PATCH] libblkid: romfs: add checksum support --- libblkid/src/superblocks/romfs.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/libblkid/src/superblocks/romfs.c b/libblkid/src/superblocks/romfs.c index 8db88775be..5ce0a250a9 100644 --- a/libblkid/src/superblocks/romfs.c +++ b/libblkid/src/superblocks/romfs.c @@ -19,10 +19,31 @@ struct romfs_super_block { unsigned char ros_magic[8]; - uint32_t ros_dummy1[2]; + uint32_t ros_full_size; + uint32_t ros_checksum; unsigned char ros_volume[16]; } __attribute__((packed)); +static int romfs_verify_csum(blkid_probe pr, const struct blkid_idmag *mag, + const struct romfs_super_block *ros) +{ + uint32_t csummed_size = min((uint32_t) 512, + be32_to_cpu(ros->ros_full_size)); + if (csummed_size % sizeof(uint32_t) != 0) + return 0; + + unsigned char *csummed = blkid_probe_get_sb_buffer(pr, mag, + csummed_size); + + uint32_t csum = 0; + while (csummed_size) { + csum += be32_to_cpu(*(uint32_t *) csummed); + csummed_size -= sizeof(uint32_t); + csummed += sizeof(uint32_t); + } + return blkid_probe_verify_csum(pr, csum, 0); +} + static int probe_romfs(blkid_probe pr, const struct blkid_idmag *mag) { struct romfs_super_block *ros; @@ -31,6 +52,9 @@ static int probe_romfs(blkid_probe pr, const struct blkid_idmag *mag) if (!ros) return errno ? -errno : 1; + if (!romfs_verify_csum(pr, mag, ros)) + return 1; + if (*((char *) ros->ros_volume) != '\0') blkid_probe_set_label(pr, ros->ros_volume, sizeof(ros->ros_volume)); -- 2.47.2