//! Physical MBR read, bounded primary mount and overlap refusal. use super::*; use os_partitions::{Error as PartitionError, MountState}; pub fn run(boot: &BootData, allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let before = allocator.remaining_pages(); let mut disk = virtio_ro_turkfs::RoDisk::open( boot, allocator, "TURKOS/OS/K1525-GET")?; if disk.capacity() != 2048 { return Err("k1525-disk-capacity"); } let mut sector = [0u8; 512]; disk.read(0, &mut sector)?; disk.close(allocator)?; if allocator.remaining_pages() != before { return Err("k1525-DMA-leak"); } let mut mounts = MountState::new(); let table = mounts.mount(§or, 2048).map_err(|_| "k1525-valid-MBR")?; if table.count != 2 || table.entry(0).map(|part| (part.start_lba, part.end_lba)) != Some((1, 101)) || table.entry(2).map(|part| (part.start_lba, part.end_lba)) != Some((101, 2048)) { return Err("k1525-primary-layout"); } let before_mount = mounts; let mut overlap = sector; overlap[446 + 2 * 16 + 8..446 + 2 * 16 + 12] .copy_from_slice(&100u32.to_le_bytes()); if mounts.mount(&overlap, 2048) != Err(PartitionError::Overlap) || mounts != before_mount { return Err("k1525-overlap-changed-mount"); } let mut empty = MountState::new(); if empty.mount(&overlap, 2048) != Err(PartitionError::Overlap) || empty.table.is_some() || empty.generation != 0 { return Err("k1525-corrupt-disk-mounted"); } write_line("TURKOS/OS/K1525-MBR: PHYSICAL=READ PRIMARY=2 FIRST=1:101 SECOND=101:2048 OVERLAP=REJECTED MOUNT=UNCHANGED CORRUPT=MOUNT-REFUSED FRAMES=RETURNED"); Ok(()) }