aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrelan <relan@users.noreply.github.com>2015-09-09 16:58:44 +0300
committerrelan <relan@users.noreply.github.com>2015-09-24 08:29:02 +0300
commit38d5c3a929124fd123675ac576401b7de3570b2f (patch)
treed2519362afecb17a042a1f1c9cbe561014c0cc4b
parent5d3dd6f2e301983cf57c43f8d232d7dc39ae213c (diff)
downloadandroid_external_exfat-38d5c3a929124fd123675ac576401b7de3570b2f.tar.gz
android_external_exfat-38d5c3a929124fd123675ac576401b7de3570b2f.tar.bz2
android_external_exfat-38d5c3a929124fd123675ac576401b7de3570b2f.zip
Check sector and cluster size before use.
Otherwise malformed FS can cause heap corruption.
-rw-r--r--libexfat/mount.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/libexfat/mount.c b/libexfat/mount.c
index 7ccdd4e..f25d71d 100644
--- a/libexfat/mount.c
+++ b/libexfat/mount.c
@@ -206,6 +206,23 @@ int exfat_mount(struct exfat* ef, const char* spec, const char* options)
exfat_error("exFAT file system is not found");
return -EIO;
}
+ /* sector cannot be smaller than 512 bytes */
+ if (ef->sb->sector_bits < 9)
+ {
+ exfat_close(ef->dev);
+ exfat_error("too small sector size: 2^%hhd", ef->sb->sector_bits);
+ free(ef->sb);
+ return -EIO;
+ }
+ /* officially exFAT supports cluster size up to 32 MB */
+ if ((int) ef->sb->sector_bits + (int) ef->sb->spc_bits > 25)
+ {
+ exfat_close(ef->dev);
+ exfat_error("too big cluster size: 2^(%hhd+%hhd)",
+ ef->sb->sector_bits, ef->sb->spc_bits);
+ free(ef->sb);
+ return -EIO;
+ }
ef->zero_cluster = malloc(CLUSTER_SIZE(*ef->sb));
if (ef->zero_cluster == NULL)
{
@@ -240,16 +257,6 @@ int exfat_mount(struct exfat* ef, const char* spec, const char* options)
free(ef->sb);
return -EIO;
}
- /* officially exFAT supports cluster size up to 32 MB */
- if ((int) ef->sb->sector_bits + (int) ef->sb->spc_bits > 25)
- {
- free(ef->zero_cluster);
- exfat_close(ef->dev);
- exfat_error("too big cluster size: 2^%d",
- (int) ef->sb->sector_bits + (int) ef->sb->spc_bits);
- free(ef->sb);
- return -EIO;
- }
if (le64_to_cpu(ef->sb->sector_count) * SECTOR_SIZE(*ef->sb) >
exfat_get_size(ef->dev))
{