From 1aa00de1b2a3353ce58352a534910fef008efedb Mon Sep 17 00:00:00 2001 From: Logan McNaughton <848146+loganmc10@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:37:35 +0100 Subject: [PATCH] fix crash when attempting to read zip without rom (#345) * fix crash when attempting to read zip without rom * more --- src/device.rs | 19 +++++++++++-------- src/main.rs | 26 +++++++++++++------------- src/ui/gui.rs | 7 +++---- src/ui/gui/gui_netplay.rs | 3 +-- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/device.rs b/src/device.rs index 0f06a91..2ae554b 100644 --- a/src/device.rs +++ b/src/device.rs @@ -99,11 +99,11 @@ fn init_rng(device: &mut Device) { device.rng = rand_chacha::ChaCha8Rng::seed_from_u64(rng_seed); } -fn swap_rom(contents: Vec) -> Vec { +fn swap_rom(contents: Vec) -> Option> { let test = u32::from_be_bytes(contents[0..4].try_into().unwrap()); if test == 0x80371240 { // z64 - contents + Some(contents) } else if test == 0x37804012 { // v64 let mut data: Vec = vec![0; contents.len()]; @@ -111,7 +111,7 @@ fn swap_rom(contents: Vec) -> Vec { let temp = u16::from_ne_bytes(contents[i..i + 2].try_into().unwrap()); data[i..i + 2].copy_from_slice(&temp.to_be_bytes()); } - return data; + Some(data) } else if test == 0x40123780 { // n64 let mut data: Vec = vec![0; contents.len()]; @@ -119,14 +119,13 @@ fn swap_rom(contents: Vec) -> Vec { let temp = u32::from_ne_bytes(contents[i..i + 4].try_into().unwrap()); data[i..i + 4].copy_from_slice(&temp.to_be_bytes()); } - return data; + Some(data) } else { - let data: Vec = vec![]; - data + None } } -pub fn get_rom_contents(file_path: &std::path::Path) -> Vec { +pub fn get_rom_contents(file_path: &std::path::Path) -> Option> { let mut contents = vec![]; if file_path.extension().unwrap().eq_ignore_ascii_case("zip") { let zip_file = fs::File::open(file_path).unwrap(); @@ -173,7 +172,11 @@ pub fn get_rom_contents(file_path: &std::path::Path) -> Vec { contents = fs::read(file_path).expect("Should have been able to read the file"); } - swap_rom(contents) + if contents.is_empty() { + None + } else { + swap_rom(contents) + } } #[derive(serde::Serialize, serde::Deserialize)] diff --git a/src/main.rs b/src/main.rs index 0446cb8..8544b58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -151,22 +151,22 @@ async fn main() { } } else if args.game.is_some() { let file_path = std::path::Path::new(args.game.as_ref().unwrap()); - let rom_contents = device::get_rom_contents(file_path); - if rom_contents.is_empty() { + if let Some(rom_contents) = device::get_rom_contents(file_path) { + let handle = std::thread::Builder::new() + .name("n64".to_string()) + .stack_size(env!("N64_STACK_SIZE").parse().unwrap()) + .spawn(move || { + let mut device = device::Device::new(); + let overclock = device.ui.config.emulation.overclock; + device::run_game(&mut device, rom_contents, args.fullscreen, overclock); + }) + .unwrap(); + + handle.join().unwrap(); + } else { println!("Could not read rom file"); return; } - let handle = std::thread::Builder::new() - .name("n64".to_string()) - .stack_size(env!("N64_STACK_SIZE").parse().unwrap()) - .spawn(move || { - let mut device = device::Device::new(); - let overclock = device.ui.config.emulation.overclock; - device::run_game(&mut device, rom_contents, args.fullscreen, overclock); - }) - .unwrap(); - - handle.join().unwrap(); } else { let options = eframe::NativeOptions { viewport: eframe::egui::ViewportBuilder::default() diff --git a/src/ui/gui.rs b/src/ui/gui.rs index faaad4a..a031dec 100644 --- a/src/ui/gui.rs +++ b/src/ui/gui.rs @@ -445,16 +445,15 @@ pub fn open_rom(app: &mut GopherEguiApp, ctx: &egui::Context, enable_overclock: device.vru_window.gui_ctx = Some(gui_ctx); } - let rom_contents = device::get_rom_contents(file.unwrap().path()); - if rom_contents.is_empty() { - println!("Could not read rom file"); - } else { + if let Some(rom_contents) = device::get_rom_contents(file.unwrap().path()) { device::run_game( &mut device, rom_contents, fullscreen, enable_overclock, ); + } else { + println!("Could not read rom file"); } } let result = std::fs::remove_file(running_file); diff --git a/src/ui/gui/gui_netplay.rs b/src/ui/gui/gui_netplay.rs index 34c1ee5..b3bfde7 100644 --- a/src/ui/gui/gui_netplay.rs +++ b/src/ui/gui/gui_netplay.rs @@ -430,8 +430,7 @@ fn get_sessions(app: &mut GopherEguiApp, ctx: &egui::Context) { } async fn parse_rom_file(file: rfd::FileHandle, tx: tokio::sync::mpsc::Sender) { - let rom_contents = device::get_rom_contents(file.path()); - if !rom_contents.is_empty() { + if let Some(rom_contents) = device::get_rom_contents(file.path()) { let hash = device::cart::rom::calculate_hash(&rom_contents); let game_name = ui::storage::get_game_name(&rom_contents);