exfat: checks cluster values.
also use the size of the node for Size(), instead of the valid size.
This commit is contained in:
@@ -52,7 +52,8 @@ DataStream::FindBlock(off_t pos, off_t& physical, off_t *_length)
|
|||||||
for (uint32 i = 0; i < clusterIndex; i++)
|
for (uint32 i = 0; i < clusterIndex; i++)
|
||||||
cluster = fInode->NextCluster(cluster);
|
cluster = fInode->NextCluster(cluster);
|
||||||
fsblock_t block;
|
fsblock_t block;
|
||||||
fVolume->ClusterToBlock(cluster, block);
|
if (fVolume->ClusterToBlock(cluster, block) != B_OK)
|
||||||
|
return B_BAD_DATA;
|
||||||
physical = block * kBlockSize + offset;
|
physical = block * kBlockSize + offset;
|
||||||
for (uint32 i = 0; i < 64; i++) {
|
for (uint32 i = 0; i < 64; i++) {
|
||||||
cluster_t extentEnd = fInode->NextCluster(cluster);
|
cluster_t extentEnd = fInode->NextCluster(cluster);
|
||||||
|
|||||||
@@ -275,7 +275,8 @@ DirectoryIterator::_NextEntry()
|
|||||||
{
|
{
|
||||||
if (fCurrent == NULL) {
|
if (fCurrent == NULL) {
|
||||||
fsblock_t block;
|
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())
|
block += (fOffset / fInode->GetVolume()->EntriesPerBlock())
|
||||||
% (1 << fInode->GetVolume()->SuperBlock().BlocksPerClusterShift());
|
% (1 << fInode->GetVolume()->SuperBlock().BlocksPerClusterShift());
|
||||||
TRACE("DirectoryIterator::_NextEntry() init to block %" B_PRIu64 "\n",
|
TRACE("DirectoryIterator::_NextEntry() init to block %" B_PRIu64 "\n",
|
||||||
@@ -289,7 +290,8 @@ DirectoryIterator::_NextEntry()
|
|||||||
if (fCluster == EXFAT_CLUSTER_END)
|
if (fCluster == EXFAT_CLUSTER_END)
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
|
|
||||||
fInode->GetVolume()->ClusterToBlock(fCluster, block);
|
if (fInode->GetVolume()->ClusterToBlock(fCluster, block) != B_OK)
|
||||||
|
return B_BAD_DATA;
|
||||||
} else
|
} else
|
||||||
block = fBlock.BlockNumber() + 1;
|
block = fBlock.BlockNumber() + 1;
|
||||||
|
|
||||||
|
|||||||
@@ -416,8 +416,10 @@ Volume::LoadSuperBlock()
|
|||||||
status_t
|
status_t
|
||||||
Volume::ClusterToBlock(cluster_t cluster, fsblock_t &block)
|
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;
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
block = ((fsblock_t)(cluster - EXFAT_FIRST_DATA_CLUSTER)
|
block = ((fsblock_t)(cluster - EXFAT_FIRST_DATA_CLUSTER)
|
||||||
<< SuperBlock().BlocksPerClusterShift())
|
<< SuperBlock().BlocksPerClusterShift())
|
||||||
+ SuperBlock().FirstDataBlock();
|
+ SuperBlock().FirstDataBlock();
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ struct exfat_entry {
|
|||||||
void SetFlag(uint8 newFlag)
|
void SetFlag(uint8 newFlag)
|
||||||
{ flag = newFlag; }
|
{ flag = newFlag; }
|
||||||
uint64 Size() const
|
uint64 Size() const
|
||||||
{ return B_LENDIAN_TO_HOST_INT64(size1); }
|
{ return B_LENDIAN_TO_HOST_INT64(size2); }
|
||||||
} _PACKED file_info;
|
} _PACKED file_info;
|
||||||
struct {
|
struct {
|
||||||
uint8 flags;
|
uint8 flags;
|
||||||
|
|||||||
Reference in New Issue
Block a user