summaryrefslogtreecommitdiff
path: root/src/ext4_mbr.c
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2021-05-28 11:14:06 +0200
committerCarl Hetherington <cth@carlh.net>2021-05-28 11:14:11 +0200
commitcce3730330bd5621a94ec813934ba4f41254910d (patch)
tree3dc7b705fd47b53884f0c9dc98a6c735c01507d0 /src/ext4_mbr.c
parent9d20ec504c40c79a63c3ffa14dc9152e0ba4ecae (diff)
Fix some overflows when making larger partitions (e.g. 2TB) (DoM bug #2021)
Diffstat (limited to 'src/ext4_mbr.c')
-rw-r--r--src/ext4_mbr.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/ext4_mbr.c b/src/ext4_mbr.c
index 63aeeda..9a366da 100644
--- a/src/ext4_mbr.c
+++ b/src/ext4_mbr.c
@@ -162,21 +162,21 @@ int ext4_mbr_write(struct ext4_blockdev *parent, struct ext4_mbr_parts *parts, u
mbr->disk_id = disk_id;
- uint32_t cyl_it = 0;
+ uint64_t cyl_it = 0;
for (int i = 0; i < 4; ++i) {
- uint32_t cyl_part = cyl_count * parts->division[i] / 100;
+ uint64_t cyl_part = ((uint64_t) cyl_count) * parts->division[i] / 100;
if (!cyl_part)
continue;
- uint64_t part_start = ((uint64_t) cyl_it) * cyl_size;
- uint64_t part_size = ((uint64_t) cyl_part) * cyl_size;
+ uint64_t part_start = cyl_it * cyl_size;
+ uint64_t part_size = cyl_part * cyl_size;
if (i == 0) {
part_start += 63;
part_size -= 63 * parent->bdif->ph_bsize;
}
- uint32_t cyl_end = cyl_part + cyl_it - 1;
+ uint64_t cyl_end = cyl_part + cyl_it - 1;
mbr->part_entry[i].status = 0;
mbr->part_entry[i].chs1[0] = i ? 0 : 1;;