Skip to content

Commit 1aef8fd

Browse files
committed
fat: Fix next_cluster()
Signed-off-by: Akira Moroo <retrage01@gmail.com>
1 parent 2ad5eb6 commit 1aef8fd

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

src/fat.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -743,21 +743,20 @@ impl<'a> Filesystem<'a> {
743743
}
744744
}
745745
FatType::FAT16 => {
746-
let fat = [0_u16; SectorBuf::len() / 2];
746+
let mut data = SectorBuf::new();
747747

748748
let fat_offset = cluster * 2;
749749
let fat_sector = self.first_fat_sector + (fat_offset / self.bytes_per_sector);
750750
let offset = fat_offset % self.bytes_per_sector;
751751

752-
let data = unsafe {
753-
core::slice::from_raw_parts_mut(fat.as_ptr() as *mut u8, SectorBuf::len())
754-
};
755-
match self.read(u64::from(fat_sector), data) {
752+
match self.read(u64::from(fat_sector), data.as_mut_bytes()) {
756753
Ok(_) => {}
757754
Err(e) => return Err(Error::Block(e)),
758755
};
759756

760-
let next_cluster = fat[(offset / 2) as usize];
757+
let bytes = data.as_bytes();
758+
let next_cluster_raw = [bytes[offset as usize], bytes[(offset + 1) as usize]];
759+
let next_cluster = u16::from_le_bytes(next_cluster_raw);
761760

762761
if next_cluster >= 0xfff8 {
763762
Err(Error::EndOfFile)
@@ -766,22 +765,25 @@ impl<'a> Filesystem<'a> {
766765
}
767766
}
768767
FatType::FAT32 => {
769-
let fat = [0_u32; SectorBuf::len() / 4];
768+
let mut data = SectorBuf::new();
770769

771770
let fat_offset = cluster * 4;
772771
let fat_sector = self.first_fat_sector + (fat_offset / self.bytes_per_sector);
773772
let offset = fat_offset % self.bytes_per_sector;
774773

775-
let data = unsafe {
776-
core::slice::from_raw_parts_mut(fat.as_ptr() as *mut u8, SectorBuf::len())
777-
};
778-
779-
match self.read(u64::from(fat_sector), data) {
774+
match self.read(u64::from(fat_sector), data.as_mut_bytes()) {
780775
Ok(_) => {}
781776
Err(e) => return Err(Error::Block(e)),
782777
};
783778

784-
let next_cluster_raw = fat[(offset / 4) as usize];
779+
let bytes = data.as_bytes();
780+
let next_cluster_raw = [
781+
bytes[offset as usize],
782+
bytes[(offset + 1) as usize],
783+
bytes[(offset + 2) as usize],
784+
bytes[(offset + 3) as usize],
785+
];
786+
let next_cluster_raw = u32::from_le_bytes(next_cluster_raw);
785787
let next_cluster = next_cluster_raw & 0x0fff_ffff;
786788
if next_cluster >= 0x0fff_fff8 {
787789
Err(Error::EndOfFile)

0 commit comments

Comments
 (0)