diff --git a/dumper/src/main.rs b/dumper/src/main.rs index 5e2d85d..f202d6a 100644 --- a/dumper/src/main.rs +++ b/dumper/src/main.rs @@ -130,27 +130,36 @@ fn run(k: K) { unsafe { k.mtx_unlock_flags(mtx.ptr(), 0, c"".as_ptr(), 0) }; - // Flush data. - if ok { - let td = K::Pcpu::curthread(); - let errno = unsafe { k.kern_fsync(td, fd.as_raw_fd(), 1) }; + if !ok { + return; + } - if errno != 0 { - let m = format!("Couldn't flush data to {} ({})", DUMP_FILE, errno); - notify(k, &m); - return; - } + // Write end entry. + if !write_dump( + k, + fd.as_raw_fd(), + core::slice::from_ref(&FirmwareDump::<()>::ITEM_END), + ) { + return; } - drop(fd); + // Flush data. + let td = K::Pcpu::curthread(); + let errno = unsafe { k.kern_fsync(td, fd.as_raw_fd(), 1) }; - // Notify the user. - if ok { - notify(k, "Dump completed!"); + if errno != 0 { + let m = format!("Couldn't flush data to {} ({})", DUMP_FILE, errno); + notify(k, &m); + return; } + + // Notify the user. + notify(k, "Dump completed!"); } -unsafe fn dump_mount(k: K, fd: c_int, _: *mut K::Mount, _: MtxLock) -> bool { +unsafe fn dump_mount(k: K, fd: c_int, _: *mut K::Mount, lock: MtxLock) -> bool { + drop(lock); + // Write header. if !write_dump( k, diff --git a/obfw/src/lib.rs b/obfw/src/lib.rs index 6f94dfa..49c1eb9 100644 --- a/obfw/src/lib.rs +++ b/obfw/src/lib.rs @@ -16,9 +16,8 @@ pub struct FirmwareDump { impl FirmwareDump { pub const MAGIC: &'static [u8; 4] = b"\x7FOBF"; - - const ITEM_END: u8 = 0; - const ITEM_PARTITION: u8 = 1; + pub const ITEM_END: u8 = 0; + pub const ITEM_PARTITION: u8 = 1; pub fn new(file: F) -> Self { Self { file }