From c89a1defc729afaabf70921c7dd183e9e108db9d Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 11 Sep 2013 13:19:44 +0200 Subject: [PATCH] libblkid: use separate function to verify checksums * consolidate "incorrect checksum" debug messages * verify all on one place Based on patch from Gabriel de Perthuis Signed-off-by: Karel Zak --- libblkid/src/blkidP.h | 3 +++ libblkid/src/probe.c | 24 ++++++++++++++++++++++++ libblkid/src/superblocks/lvm.c | 11 +++++------ libblkid/src/superblocks/nilfs.c | 4 ++-- libblkid/src/superblocks/silicon_raid.c | 8 +++----- libblkid/src/superblocks/via_raid.c | 4 ++-- 6 files changed, 39 insertions(+), 15 deletions(-) diff --git a/libblkid/src/blkidP.h b/libblkid/src/blkidP.h index 1c0596832d..0bbf310a05 100644 --- a/libblkid/src/blkidP.h +++ b/libblkid/src/blkidP.h @@ -516,6 +516,9 @@ extern int blkid_probe_set_magic(blkid_probe pr, blkid_loff_t offset, size_t len, unsigned char *magic) __attribute__((nonnull)); +extern int blkid_probe_verify_csum(blkid_probe pr, uint64_t csum, uint64_t expected) + __attribute__((nonnull)); + extern void blkid_unparse_uuid(const unsigned char *uuid, char *str, size_t len) __attribute__((nonnull)); extern int blkid_uuid_is_empty(const unsigned char *buf, size_t len); diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c index d2b301d7f0..6e3ae42dc7 100644 --- a/libblkid/src/probe.c +++ b/libblkid/src/probe.c @@ -336,6 +336,16 @@ struct blkid_chain *blkid_probe_get_chain(blkid_probe pr) return pr->cur_chain; } +static const char *blkid_probe_get_probername(blkid_probe pr) +{ + struct blkid_chain *chn = blkid_probe_get_chain(pr); + + if (chn && chn->idx >= 0 && chn->idx < chn->driver->nidinfos) + return chn->driver->idinfos[chn->idx]->name; + + return NULL; +} + void *blkid_probe_get_binary_data(blkid_probe pr, struct blkid_chain *chn) { int rc, org_prob_flags; @@ -1341,6 +1351,20 @@ int blkid_probe_set_magic(blkid_probe pr, blkid_loff_t offset, return rc; } +int blkid_probe_verify_csum(blkid_probe pr, uint64_t csum, uint64_t expected) +{ + if (csum != expected) { + DBG(LOWPROBE, blkid_debug( + "incorrect checksum for type %s," + " got %jX, expected %jX", + blkid_probe_get_probername(pr), + csum, expected)); + return 0; + } + + return 1; +} + /** * blkid_probe_get_devno: * @pr: probe diff --git a/libblkid/src/superblocks/lvm.c b/libblkid/src/superblocks/lvm.c index dc38f2e2c5..65c7c35a4f 100644 --- a/libblkid/src/superblocks/lvm.c +++ b/libblkid/src/superblocks/lvm.c @@ -97,13 +97,12 @@ static int probe_lvm2(blkid_probe pr, const struct blkid_idmag *mag) if (le64_to_cpu(label->sector_xl) != (unsigned) sector) return 1; - if (lvm2_calc_crc(&label->offset_xl, LVM2_LABEL_SIZE - - ((char *) &label->offset_xl - (char *) label)) != - le32_to_cpu(label->crc_xl)) { - DBG(PROBE, blkid_debug("LVM2: label checksum incorrect at sector %d", - sector)); + if (!blkid_probe_verify_csum( + pr, lvm2_calc_crc( + &label->offset_xl, LVM2_LABEL_SIZE - + ((char *) &label->offset_xl - (char *) label)), + le32_to_cpu(label->crc_xl))) return 1; - } format_lvm_uuid(uuid, (char *) label->pv_uuid); blkid_probe_sprintf_uuid(pr, label->pv_uuid, sizeof(label->pv_uuid), diff --git a/libblkid/src/superblocks/nilfs.c b/libblkid/src/superblocks/nilfs.c index 1f8f3a69fc..9207677a99 100644 --- a/libblkid/src/superblocks/nilfs.c +++ b/libblkid/src/superblocks/nilfs.c @@ -89,8 +89,8 @@ static int probe_nilfs2(blkid_probe pr, const struct blkid_idmag *mag) crc = crc32(crc, sum, 4); crc = crc32(crc, (unsigned char *)sb + sumoff + 4, bytes - sumoff - 4); - if (crc != le32_to_cpu(sb->s_sum)) - return -1; + if (!blkid_probe_verify_csum(pr, crc, le32_to_cpu(sb->s_sum))) + return 1; if (strlen(sb->s_volume_name)) blkid_probe_set_label(pr, (unsigned char *) sb->s_volume_name, diff --git a/libblkid/src/superblocks/silicon_raid.c b/libblkid/src/superblocks/silicon_raid.c index 7abc46afd0..10a3023139 100644 --- a/libblkid/src/superblocks/silicon_raid.c +++ b/libblkid/src/superblocks/silicon_raid.c @@ -67,7 +67,7 @@ struct silicon_metadata { #define SILICON_MAGIC 0x2F000000 -static int checksum(struct silicon_metadata *sil) +static uint16_t silraid_checksum(struct silicon_metadata *sil) { int sum = 0; unsigned short count = offsetof(struct silicon_metadata, checksum1) / 2; @@ -78,7 +78,7 @@ static int checksum(struct silicon_metadata *sil) sum += le16_to_cpu(x); } - return (-sum & 0xFFFF) == le16_to_cpu(sil->checksum1); + return (-sum & 0xFFFF); } static int probe_silraid(blkid_probe pr, @@ -104,10 +104,8 @@ static int probe_silraid(blkid_probe pr, return 1; if (sil->disk_number >= 8) return 1; - if (!checksum(sil)) { - DBG(LOWPROBE, blkid_debug("silicon raid: incorrect checksum")); + if (!blkid_probe_verify_csum(pr, silraid_checksum(sil), le16_to_cpu(sil->checksum1))) return 1; - } if (blkid_probe_sprintf_version(pr, "%u.%u", le16_to_cpu(sil->major_ver), diff --git a/libblkid/src/superblocks/via_raid.c b/libblkid/src/superblocks/via_raid.c index 5f91cc4053..5c15167aa8 100644 --- a/libblkid/src/superblocks/via_raid.c +++ b/libblkid/src/superblocks/via_raid.c @@ -42,7 +42,7 @@ static uint8_t via_checksum(struct via_metadata *v) while (i--) cs += ((uint8_t*) v)[i]; - return cs == v->checksum; + return cs; } static int probe_viaraid(blkid_probe pr, @@ -69,7 +69,7 @@ static int probe_viaraid(blkid_probe pr, return 1; if (v->version_number > 2) return 1; - if (!via_checksum(v)) + if (!blkid_probe_verify_csum(pr, via_checksum(v), v->checksum)) return 1; if (blkid_probe_sprintf_version(pr, "%u", v->version_number) != 0) -- 2.47.3