From: Thomas Weißschuh Date: Mon, 24 Oct 2022 14:48:18 +0000 (+0200) Subject: libblkid: cramfs: handle cross-endianess for checksums X-Git-Tag: v2.39-rc1~456^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3d074d422131f3758b3a4b3923097ba602ba665f;p=thirdparty%2Futil-linux.git libblkid: cramfs: handle cross-endianess for checksums --- diff --git a/libblkid/src/superblocks/cramfs.c b/libblkid/src/superblocks/cramfs.c index 094367d4c6..76b5611e9a 100644 --- a/libblkid/src/superblocks/cramfs.c +++ b/libblkid/src/superblocks/cramfs.c @@ -37,16 +37,31 @@ struct cramfs_super #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))