diff --git a/CHANGELOG.md b/CHANGELOG.md index 27be248..9328b7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 0.12.0 (2026-04-24) + +### Rust 2024 edition migration +- Bumped `edition = "2024"`. Required code changes: + - FFI declarations in `src/scsi/macos.rs` wrapped in `unsafe extern "C" { … }` per the 2024 FFI safety rules. + - `unsafe_op_in_unsafe_fn` lint: `vtable_fn()` body now has an explicit `unsafe { … }` block rather than relying on implicit unsafe of the containing `unsafe fn`. + - Match-ergonomics: removed redundant `ref`/`ref mut` bindings in `mux/meta.rs`, `mux/mkvstream.rs`, `mux/network.rs`, `mux/stdio.rs` — 2024 tightens "cannot explicitly borrow within an implicitly-borrowing pattern." +- No behavior change. MSRV stays at 1.86. + +### Minor / version sync +- Part of the 0.12.0 ecosystem release. The autorip-side fixes (progress regressions, UI redesign, regression-guard tests) drove the minor bump. + ## 0.11.22 (2026-04-24) ### Version sync — no functional changes diff --git a/Cargo.toml b/Cargo.toml index 639e397..e86f92f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "libfreemkv" -version = "0.11.22" -edition = "2021" +version = "0.12.0" +edition = "2024" rust-version = "1.86" license = "AGPL-3.0-only" description = "Open source raw disc access library for optical drives" diff --git a/src/mux/meta.rs b/src/mux/meta.rs index 7859b62..e6d54e0 100644 --- a/src/mux/meta.rs +++ b/src/mux/meta.rs @@ -211,7 +211,7 @@ impl M2tsMeta { .iter() .map(|s| { if let MetaStream::Video { - codec_private: Some(ref b64), + codec_private: Some(b64), .. } = s { diff --git a/src/mux/mkvstream.rs b/src/mux/mkvstream.rs index 502a352..d811b9b 100644 --- a/src/mux/mkvstream.rs +++ b/src/mux/mkvstream.rs @@ -150,9 +150,9 @@ impl crate::pes::Stream for MkvStream { fn write(&mut self, frame: &crate::pes::PesFrame) -> io::Result<()> { match &mut self.mode { - Mode::Write { - muxer: Some(ref mut m), - } => m.write_frame(frame.track, frame.pts, frame.keyframe, &frame.data), + Mode::Write { muxer: Some(m) } => { + m.write_frame(frame.track, frame.pts, frame.keyframe, &frame.data) + } Mode::Write { muxer: None } => Ok(()), Mode::Read(_) => Err(crate::error::Error::StreamReadOnly.into()), } diff --git a/src/mux/network.rs b/src/mux/network.rs index a43f9eb..2e1053f 100644 --- a/src/mux/network.rs +++ b/src/mux/network.rs @@ -81,7 +81,7 @@ impl crate::pes::Stream for NetworkStream { match &mut self.mode { Mode::Write { writer, - ref mut header_written, + header_written, .. } => { if !*header_written { diff --git a/src/mux/stdio.rs b/src/mux/stdio.rs index 4f5ad96..116e275 100644 --- a/src/mux/stdio.rs +++ b/src/mux/stdio.rs @@ -70,7 +70,7 @@ impl crate::pes::Stream for StdioStream { } fn write(&mut self, frame: &crate::pes::PesFrame) -> io::Result<()> { match &mut self.writer { - Some(ref mut w) => { + Some(w) => { if !self.header_written { if !self.disc_title.streams.is_empty() { let m = meta::M2tsMeta::from_title(&self.disc_title); diff --git a/src/scsi/macos.rs b/src/scsi/macos.rs index 3ef27cf..031ea08 100644 --- a/src/scsi/macos.rs +++ b/src/scsi/macos.rs @@ -63,7 +63,8 @@ struct SCSITaskSGElement { // ── External IOKit / CoreFoundation functions ─────────────────────────────── -extern "C" { +// Rust 2024: FFI blocks declaring extern fns must be `unsafe extern`. +unsafe extern "C" { fn IOMasterPort(bootstrap: u32, master: *mut MachPort) -> IOReturn; fn IOBSDNameMatching( master: MachPort, @@ -97,10 +98,18 @@ extern "C" { // IOSCSIArchitectureModelFamily/UserClientLib/SCSITaskLib.h /// Read a function pointer from a COM vtable at the given index. +/// +/// # Safety +/// `iface` must be a valid COM interface pointer (*mut *mut c_void), and +/// `index` must be a valid vtable slot for the target type `T`. unsafe fn vtable_fn(iface: ComRef, index: usize) -> T { - let vtable = *iface as *const *const std::ffi::c_void; - let fn_ptr = *vtable.add(index); - std::mem::transmute_copy(&fn_ptr) + // Rust 2024: `unsafe fn` bodies are no longer implicitly unsafe. + // Each unsafe op needs its own `unsafe { }` block. + unsafe { + let vtable = *iface as *const *const std::ffi::c_void; + let fn_ptr = *vtable.add(index); + std::mem::transmute_copy(&fn_ptr) + } } /// Call Release (vtable index 3) on any COM interface.