]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libblkid: romfs: add checksum support
authorThomas Weißschuh <thomas@t-8ch.de>
Sat, 22 Oct 2022 01:58:10 +0000 (03:58 +0200)
committerThomas Weißschuh <thomas@t-8ch.de>
Mon, 24 Oct 2022 11:18:32 +0000 (13:18 +0200)
libblkid/src/superblocks/romfs.c

index 8db88775be829b267fbf751d29716da4eec27db6..5ce0a250a945738c19b9e00e44f059dbc8343c46 100644 (file)
 
 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));