]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
super1: Fix bblog_size accesses on big-ending machines.
authorNeilBrown <neilb@suse.com>
Fri, 29 Jan 2016 01:35:33 +0000 (12:35 +1100)
committerJes Sorensen <Jes.Sorensen@redhat.com>
Mon, 1 Feb 2016 22:07:25 +0000 (17:07 -0500)
bblog_size is 16bit so using le32_to_cpu on it is not wise
and leads to errors on big-endian machines.
Change all such calls to use le16.

Bug was introduced in mdadm-3.3

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
super1.c

index 8bcaa2fe02c81575c696f8bdacf2a54a3fd6ccf0..9b877e504c4bd05c255e5cdddf996effc84ae72b 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -730,12 +730,12 @@ static int copy_metadata1(struct supertype *st, int from, int to)
        }
 
        if (super.bblog_size != 0 &&
-           __le32_to_cpu(super.bblog_size) <= 100 &&
+           __le16_to_cpu(super.bblog_size) <= 100 &&
            super.bblog_offset != 0 &&
            (super.feature_map & __le32_to_cpu(MD_FEATURE_BAD_BLOCKS))) {
                /* There is a bad block log */
                unsigned long long bb_offset = sb_offset;
-               int bytes = __le32_to_cpu(super.bblog_size) * 512;
+               int bytes = __le16_to_cpu(super.bblog_size) * 512;
                int written = 0;
                struct align_fd afrom, ato;
 
@@ -832,7 +832,7 @@ static int examine_badblocks_super1(struct supertype *st, int fd, char *devname)
        __u64 *bbl, *bbp;
        int i;
 
-       if  (!sb->bblog_size || __le32_to_cpu(sb->bblog_size) > 100
+       if  (!sb->bblog_size || __le16_to_cpu(sb->bblog_size) > 100
             || !sb->bblog_offset){
                printf("No bad-blocks list configured on %s\n", devname);
                return 0;
@@ -843,7 +843,7 @@ static int examine_badblocks_super1(struct supertype *st, int fd, char *devname)
                return 0;
        }
 
-       size = __le32_to_cpu(sb->bblog_size)* 512;
+       size = __le16_to_cpu(sb->bblog_size)* 512;
        if (posix_memalign((void**)&bbl, 4096, size) != 0) {
                pr_err("could not allocate badblocks list\n");
                return 0;
@@ -986,7 +986,7 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
                if (sb->bblog_offset && sb->bblog_size) {
                        unsigned long long bbend = super_offset;
                        bbend += (int32_t)__le32_to_cpu(sb->bblog_offset);
-                       bbend += __le32_to_cpu(sb->bblog_size);
+                       bbend += __le16_to_cpu(sb->bblog_size);
                        if (bbend > earliest)
                                earliest = bbend;
                }