From d6e4b44fdbd489e5e8ff1bbcaf17315131182ca3 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 28 May 2013 16:43:03 +1000 Subject: [PATCH] super1: fix some casts of signed superblock fields. These need to be cast to uint32_t before being cast to 'long', else sign extension doesn't happen on 64bit hosts. And bitmap_offset is le32, not le64 !! Signed-off-by: NeilBrown --- super1.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/super1.c b/super1.c index b73d3ab9..b7fc8347 100644 --- a/super1.c +++ b/super1.c @@ -404,7 +404,7 @@ static void examine_super1(struct supertype *st, char *homehost) if (sb->bblog_size && sb->bblog_offset) { printf(" Bad Block Log : %d entries available at offset %ld sectors", __le16_to_cpu(sb->bblog_size)*512/8, - (long)__le32_to_cpu(sb->bblog_offset)); + (long)(int32_t)__le32_to_cpu(sb->bblog_offset)); if (sb->feature_map & __cpu_to_le32(MD_FEATURE_BAD_BLOCKS)) printf(" - bad blocks present."); @@ -1182,7 +1182,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info, */ unsigned long long sb_offset = __le64_to_cpu(sb->super_offset); unsigned long long data_offset = __le64_to_cpu(sb->data_offset); - long bitmap_offset = (long)__le64_to_cpu(sb->bitmap_offset); + long bitmap_offset = (long)(int32_t)__le32_to_cpu(sb->bitmap_offset); long bm_sectors = 0; long space; -- 2.39.5