summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-07-22 15:28:15 +1000
committerNeilBrown <neilb@suse.de>2010-07-22 15:35:54 +1000
commit3e4165619b146d3134838c6546778c02308c462e (patch)
tree37c2b8e1ce7f22108671e9fd40d3e22101b7cc27
parent50526e9090d0c118b065840719bc9601be8af8b8 (diff)
downloadmdadm-3e4165619b146d3134838c6546778c02308c462e.tar.gz
mdadm-3e4165619b146d3134838c6546778c02308c462e.tar.xz
mdadm-3e4165619b146d3134838c6546778c02308c462e.zip
Cast to long long before left-shifting too much.
When left-shifting we must be sure that the value being shifted is large enough to not lose bits. The 'chunkssize' in CreateBitmap is only 'long' so it can overflow. So cast to 'long long' first. Also fix a similar issue in Detail even though it isn't currently being compiled. Signed-off-by: NeilBrown <neilb@suse.de> Reported-by: Tomasz Chmielewski <mangoo@wpkg.org>
-rw-r--r--Detail.c2
-rw-r--r--bitmap.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/Detail.c b/Detail.c
index 3d6b10f..5116cca 100644
--- a/Detail.c
+++ b/Detail.c
@@ -409,7 +409,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
#if 0
This is pretty boring
printf(" Reshape pos'n : %llu%s\n", (unsigned long long) info.reshape_progress<<9,
- human_size(info.reshape_progress<<9));
+ human_size((unsigned long long)info.reshape_progress<<9));
#endif
if (info.delta_disks > 0)
printf(" Delta Devices : %d, (%d->%d)\n",
diff --git a/bitmap.c b/bitmap.c
index beef2dc..44a8677 100644
--- a/bitmap.c
+++ b/bitmap.c
@@ -373,7 +373,7 @@ int CreateBitmap(char *filename, int force, char uuid[16],
*/
chunksize = DEFAULT_BITMAP_CHUNK;
/* <<20 for 2^20 chunks, >>9 to convert bytes to sectors */
- while (array_size > (chunksize << (20-9)))
+ while (array_size > ((unsigned long long)chunksize << (20-9)))
chunksize <<= 1;
}