#define CRAMFS_FLAG_FSID_VERSION_2 0x00000001 /* fsid version #2 */
+static int cramfs_is_little_endian(const struct blkid_idmag *mag)
+{
+ assert(mag->len == 4);
+ return memcmp(mag->magic, "\x45\x3d\xcd\x28", 4) == 0;
+}
+
+static uint32_t cfs32_to_cpu(int le, uint32_t value)
+{
+ if (le)
+ return le32_to_cpu(value);
+ else
+ return be32_to_cpu(value);
+}
+
static int cramfs_verify_csum(blkid_probe pr, const struct blkid_idmag *mag, struct cramfs_super *cs)
{
uint32_t crc, expected, csummed_size;
unsigned char *csummed;
+ int le = cramfs_is_little_endian(mag);
- if (!(cs->flags & CRAMFS_FLAG_FSID_VERSION_2))
+ if (!(cfs32_to_cpu(le, cs->flags) & CRAMFS_FLAG_FSID_VERSION_2))
return 1;
- expected = le32_to_cpu(cs->info.crc);
- csummed_size = le32_to_cpu(cs->size);
+ expected = cfs32_to_cpu(le, cs->info.crc);
+ csummed_size = cfs32_to_cpu(le, cs->size);
if (csummed_size > (1 << 16)
|| csummed_size < sizeof(struct cramfs_super))