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;
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));