#include <string.h>
#include <stdlib.h>
#include <errno.h>
+#include <inttypes.h>
#include <unistd.h>
#include <sys/types.h>
exfat_error("exFAT file system is not found");
return -EIO;
}
+ ef->zero_cluster = malloc(CLUSTER_SIZE(*ef->sb));
+ if (ef->zero_cluster == NULL)
+ {
+ exfat_close(ef->dev);
+ free(ef->sb);
+ exfat_error("failed to allocate zero sector");
+ return -ENOMEM;
+ }
+ /* use zero_cluster as a temporary buffer for VBR checksum verification */
+ if (verify_vbr_checksum(ef->dev, ef->zero_cluster,
+ SECTOR_SIZE(*ef->sb)) != 0)
+ {
+ free(ef->zero_cluster);
+ exfat_close(ef->dev);
+ free(ef->sb);
+ return -EIO;
+ }
+ memset(ef->zero_cluster, 0, CLUSTER_SIZE(*ef->sb));
if (ef->sb->version.major != 1 || ef->sb->version.minor != 0)
{
+ free(ef->zero_cluster);
exfat_close(ef->dev);
exfat_error("unsupported exFAT version: %hhu.%hhu",
ef->sb->version.major, ef->sb->version.minor);
}
if (ef->sb->fat_count != 1)
{
+ free(ef->zero_cluster);
exfat_close(ef->dev);
exfat_error("unsupported FAT count: %hhu", ef->sb->fat_count);
free(ef->sb);
/* 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;
}
-
- ef->zero_cluster = malloc(CLUSTER_SIZE(*ef->sb));
- if (ef->zero_cluster == NULL)
- {
- exfat_close(ef->dev);
- free(ef->sb);
- exfat_error("failed to allocate zero sector");
- return -ENOMEM;
- }
- /* use zero_cluster as a temporary buffer for VBR checksum verification */
- if (verify_vbr_checksum(ef->dev, ef->zero_cluster,
- SECTOR_SIZE(*ef->sb)) != 0)
+ if (le64_to_cpu(ef->sb->sector_count) * SECTOR_SIZE(*ef->sb) >
+ exfat_get_size(ef->dev))
{
free(ef->zero_cluster);
+ exfat_error("file system is larger than underlying device: "
+ "%"PRIu64" > %"PRIu64,
+ le64_to_cpu(ef->sb->sector_count) * SECTOR_SIZE(*ef->sb),
+ exfat_get_size(ef->dev));
exfat_close(ef->dev);
free(ef->sb);
return -EIO;
}
- memset(ef->zero_cluster, 0, CLUSTER_SIZE(*ef->sb));
ef->root = malloc(sizeof(struct exfat_node));
if (ef->root == NULL)