#include <stdint.h>
#include "superblocks.h"
+#include "crc32.h"
struct ubi_ec_hdr {
uint32_t magic;
uint32_t hdr_crc;
} __attribute__((packed));
+static int ubi_verify_csum(blkid_probe pr, const struct ubi_ec_hdr *hdr)
+{
+ return blkid_probe_verify_csum(pr,
+ ul_crc32(~0LL, (unsigned char *) hdr,
+ sizeof(*hdr) - sizeof(hdr->hdr_crc)),
+ be32_to_cpu(hdr->hdr_crc));
+}
+
static int probe_ubi(blkid_probe pr, const struct blkid_idmag *mag)
{
struct ubi_ec_hdr *hdr;
if (!hdr)
return -1;
+ if (!ubi_verify_csum(pr, hdr))
+ return -1;
+
blkid_probe_sprintf_version(pr, "%u", hdr->version);
blkid_probe_sprintf_uuid(pr, (unsigned char *)&hdr->image_seq, 4, "%u",
be32_to_cpu(hdr->image_seq));