Skip to content

Commit 00b8fa8

Browse files
committed
fat: Fix out-of-bounds read in next_cluster
One byte out-of-bounds read happens if the offset is 511 in next_cluster(). This causes boot fail issue reported in #132. Signed-off-by: Akira Moroo <[email protected]>
1 parent b74b90f commit 00b8fa8

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

src/fat.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -615,19 +615,28 @@ impl<'a> Filesystem<'a> {
615615
fn next_cluster(&self, cluster: u32) -> Result<u32, Error> {
616616
match self.fat_type {
617617
FatType::FAT12 => {
618-
let mut data: [u8; 512] = [0; 512];
619-
620618
let fat_offset = cluster + (cluster / 2); // equivalent of x 1.5
621619
let fat_sector = self.first_fat_sector + (fat_offset / self.bytes_per_sector);
622620
let offset = fat_offset % self.bytes_per_sector;
623621

622+
let mut data: [u8; 512] = [0; 512];
624623
match self.read(u64::from(fat_sector), &mut data) {
625624
Ok(_) => {}
626625
Err(_) => return Err(Error::BlockError),
627626
};
627+
let lower_data = data[offset as usize] as u16;
628+
let upper_data = if offset < 511 {
629+
data[offset as usize + 1] as u16
630+
} else {
631+
// read next sector to get upper byte if offset is 511
632+
match self.read(u64::from(fat_sector) + 1, &mut data) {
633+
Ok(_) => {}
634+
Err(_) => return Err(Error::BlockError),
635+
}
636+
data[0] as u16
637+
};
628638

629-
let next_cluster_raw =
630-
unsafe { *((data.as_ptr() as u64 + u64::from(offset)) as *const u16) };
639+
let next_cluster_raw = lower_data | (upper_data << 8);
631640

632641
let next_cluster = if cluster % 2 == 0 {
633642
next_cluster_raw & 0xfff

0 commit comments

Comments
 (0)