aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrelan <relan@users.noreply.github.com>2014-11-10 21:17:12 +0000
committerrelan <relan@users.noreply.github.com>2015-08-24 08:26:17 +0300
commit50c3ff853752c55a6acc144d1dd6406950750801 (patch)
treeeaaf776556dc8aab090425c11d5a6bc3f9d84888
parentd77d7dc11cb952b19b431c4c2d1e1514f48fc628 (diff)
downloadandroid_external_exfat-50c3ff853752c55a6acc144d1dd6406950750801.tar.gz
android_external_exfat-50c3ff853752c55a6acc144d1dd6406950750801.tar.bz2
android_external_exfat-50c3ff853752c55a6acc144d1dd6406950750801.zip
Fix heap corruption: bitmap_size is in bits, not bytes.
-rw-r--r--mkfs/cbm.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/mkfs/cbm.c b/mkfs/cbm.c
index e3e9dd2..e30928c 100644
--- a/mkfs/cbm.c
+++ b/mkfs/cbm.c
@@ -45,7 +45,7 @@ static int cbm_write(struct exfat_dev* dev)
DIV_ROUND_UP(cbm.get_size(), get_cluster_size()) +
DIV_ROUND_UP(uct.get_size(), get_cluster_size()) +
DIV_ROUND_UP(rootdir.get_size(), get_cluster_size());
- size_t bitmap_size = DIV_ROUND_UP(allocated_clusters, CHAR_BIT);
+ size_t bitmap_size = ROUND_UP(allocated_clusters, CHAR_BIT);
bitmap_t* bitmap = malloc(BMAP_SIZE(bitmap_size));
size_t i;
@@ -57,13 +57,14 @@ static int cbm_write(struct exfat_dev* dev)
}
memset(bitmap, 0, BMAP_SIZE(bitmap_size));
- for (i = 0; i < bitmap_size * CHAR_BIT; i++)
+ for (i = 0; i < bitmap_size; i++)
if (i < allocated_clusters)
BMAP_SET(bitmap, i);
- if (exfat_write(dev, bitmap, bitmap_size) < 0)
+ if (exfat_write(dev, bitmap, bitmap_size / CHAR_BIT) < 0)
{
free(bitmap);
- exfat_error("failed to write bitmap of %zu bytes", bitmap_size);
+ exfat_error("failed to write bitmap of %zu bytes",
+ bitmap_size / CHAR_BIT);
return 1;
}
free(bitmap);