diff options
author | relan <relan@users.noreply.github.com> | 2014-11-10 21:17:12 +0000 |
---|---|---|
committer | relan <relan@users.noreply.github.com> | 2015-08-24 08:26:17 +0300 |
commit | 50c3ff853752c55a6acc144d1dd6406950750801 (patch) | |
tree | eaaf776556dc8aab090425c11d5a6bc3f9d84888 | |
parent | d77d7dc11cb952b19b431c4c2d1e1514f48fc628 (diff) | |
download | android_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.c | 9 |
1 files changed, 5 insertions, 4 deletions
@@ -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); |