//! Decode a real fixture sector and refuse malformed journal byte sequences. use super::*; use os_turkfs_journal::{Error, Kind, parse}; pub fn run(boot: &BootData, allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let mut disk = virtio_ro_turkfs::RoDisk::open(boot, allocator, "TURKOS/OS/K1665-GET")?; let mut sector = [0u8; 512]; let read = disk.read(112, &mut sector); disk.close(allocator)?; read.map_err(|_| "k1665-read")?; let mut wire = [0u8; 128]; wire.copy_from_slice(§or[..128]); let transaction = parse(&wire, 2048, 7).map_err(|_| "k1665-parse")?; if transaction.sequence != 7 || transaction.records.map(|record| record.kind) != [Kind::Inode, Kind::Bitmap, Kind::Directory] || transaction.records.map(|record| record.block) != [120, 128, 136] || transaction.records.map(|record| record.payload) != [[0x11; 16], [0x22; 16], [0x33; 16]] || u32::from_le_bytes([wire[28], wire[29], wire[30], wire[31]]) != 0x62725158 { return Err("k1665-records"); } write_line("TURKOS/OS/K1665-JOURNAL: SEQ=7 RECORDS=3 CRC32=62725158"); let mut old = wire; old[8] = 2; if parse(&wire[..127], 2048, 7) != Err(Error::Truncated) || parse(&old, 2048, 7) != Err(Error::Version) { return Err("k1665-header-refusal"); } write_line("TURKOS/OS/K1665-JOURNAL: TRUNCATED=REJECTED VERSION=REJECTED"); let mut corrupt = wire; corrupt[127] ^= 1; if parse(&corrupt, 2048, 7) != Err(Error::Checksum) || parse(&wire, 2048, 7) != Ok(transaction) { return Err("k1665-checksum-refusal"); } write_line("TURKOS/OS/K1665-JOURNAL: CHECKSUM=REJECTED"); if allocator.remaining_pages() != frames_before { return Err("k1665-frames"); } write_line("TURKOS/OS/K1665-JOURNAL: FRAMES=UNCHANGED"); Ok(()) }