exfat: checks cluster values.

also use the size of the node for Size(), instead of the valid size.
This commit is contained in:
Jérôme Duval
2019-02-26 23:08:53 +01:00
parent 1b3684f86a
commit 1d3959edfb
4 changed files with 10 additions and 5 deletions
@@ -52,7 +52,8 @@ DataStream::FindBlock(off_t pos, off_t& physical, off_t *_length)
for (uint32 i = 0; i < clusterIndex; i++)
cluster = fInode->NextCluster(cluster);
fsblock_t block;
fVolume->ClusterToBlock(cluster, block);
if (fVolume->ClusterToBlock(cluster, block) != B_OK)
return B_BAD_DATA;
physical = block * kBlockSize + offset;
for (uint32 i = 0; i < 64; i++) {
cluster_t extentEnd = fInode->NextCluster(cluster);
@@ -275,7 +275,8 @@ DirectoryIterator::_NextEntry()
{
if (fCurrent == NULL) {
fsblock_t block;
fInode->GetVolume()->ClusterToBlock(fCluster, block);
if (fInode->GetVolume()->ClusterToBlock(fCluster, block) != B_OK)
return B_BAD_DATA;
block += (fOffset / fInode->GetVolume()->EntriesPerBlock())
% (1 << fInode->GetVolume()->SuperBlock().BlocksPerClusterShift());
TRACE("DirectoryIterator::_NextEntry() init to block %" B_PRIu64 "\n",
@@ -289,7 +290,8 @@ DirectoryIterator::_NextEntry()
if (fCluster == EXFAT_CLUSTER_END)
return B_ENTRY_NOT_FOUND;
fInode->GetVolume()->ClusterToBlock(fCluster, block);
if (fInode->GetVolume()->ClusterToBlock(fCluster, block) != B_OK)
return B_BAD_DATA;
} else
block = fBlock.BlockNumber() + 1;
@@ -416,8 +416,10 @@ Volume::LoadSuperBlock()
status_t
Volume::ClusterToBlock(cluster_t cluster, fsblock_t &block)
{
if (cluster < EXFAT_FIRST_DATA_CLUSTER)
if ((cluster - EXFAT_FIRST_DATA_CLUSTER) >= SuperBlock().ClusterCount()
|| cluster < EXFAT_FIRST_DATA_CLUSTER) {
return B_BAD_VALUE;
}
block = ((fsblock_t)(cluster - EXFAT_FIRST_DATA_CLUSTER)
<< SuperBlock().BlocksPerClusterShift())
+ SuperBlock().FirstDataBlock();
@@ -170,7 +170,7 @@ struct exfat_entry {
void SetFlag(uint8 newFlag)
{ flag = newFlag; }
uint64 Size() const
{ return B_LENDIAN_TO_HOST_INT64(size1); }
{ return B_LENDIAN_TO_HOST_INT64(size2); }
} _PACKED file_info;
struct {
uint8 flags;