From a5ed126853440ba5ec559e056866913f1bde0e77 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sun, 30 Mar 2025 22:50:53 -0400 Subject: [PATCH] Improve Oodle buffer correctness This does not fix the network bugs, but it's better I guess. --- src/oodle.rs | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/oodle.rs b/src/oodle.rs index 730e30b..aaeff8e 100644 --- a/src/oodle.rs +++ b/src/oodle.rs @@ -2,6 +2,7 @@ #![allow(non_snake_case)] #![allow(unused_unsafe)] #![allow(unused_variables)] +#![allow(dead_code)] use std::{ffi::c_void, ptr::null}; @@ -38,6 +39,7 @@ unsafe extern "C" { dec_size: isize, enc: *mut c_void, ) -> bool; + pub fn OodleNetwork1_CompressedBufferSizeNeeded(rawLen: isize) -> isize; } // dummy functions for CI mostly @@ -95,11 +97,15 @@ pub fn OodleNetwork1TCP_Encode( panic!("Something is trying to use Oodle but the feature isn't enabled!") } +#[cfg(not(feature = "oodle"))] +pub fn OodleNetwork1_CompressedBufferSizeNeeded(rawLen: isize) -> isize { + panic!("Something is trying to use Oodle but the feature isn't enabled!") +} + #[derive(Debug, Default)] pub struct OodleNetwork { state: Vec, shared: Vec, - #[allow(dead_code)] // unused in rust but required to still be available for low-level oodle window: Vec, } @@ -120,7 +126,7 @@ impl OodleNetwork { oodle_shared.as_mut_ptr() as *mut c_void, HT_BITS, oodle_window.as_mut_ptr() as *mut c_void, - oodle_window.len().try_into().unwrap(), + WINDOW_SIZE.try_into().unwrap(), ); OodleNetwork1TCP_Train( oodle_state.as_mut_ptr() as *mut c_void, @@ -139,21 +145,21 @@ impl OodleNetwork { } pub fn decode(&mut self, input: Vec, decompressed_size: u32) -> Vec { - let mut padded_buffer = input.clone(); - padded_buffer.resize( - padded_buffer.len() + OODLENETWORK1_DECOMP_BUF_OVERREAD_LEN, - 0, - ); - unsafe { + let mut padded_buffer = input.clone(); + padded_buffer.resize( + padded_buffer.len() + OODLENETWORK1_DECOMP_BUF_OVERREAD_LEN, + 0, + ); + let mut out_buf: Vec = vec![0u8; decompressed_size.try_into().unwrap()]; let success = OodleNetwork1TCP_Decode( - self.state.as_mut_ptr() as *mut c_void, - self.shared.as_ptr() as *const c_void, - padded_buffer.as_mut_ptr() as *const c_void, - input.len().try_into().unwrap(), - out_buf.as_mut_ptr() as *mut c_void, - out_buf.len().try_into().unwrap(), + self.state.as_mut_ptr() as *mut c_void, // state + self.shared.as_ptr() as *const c_void, // shared + padded_buffer.as_mut_ptr() as *const c_void, // comp + input.len().try_into().unwrap(), // compLen + out_buf.as_mut_ptr() as *mut c_void, // raw + decompressed_size.try_into().unwrap(), // rawLen ); if !success { @@ -166,13 +172,15 @@ impl OodleNetwork { pub fn encode(&mut self, mut input: Vec) -> Vec { unsafe { - let mut out_buf: Vec = vec![0u8; input.len()]; + let output_size = OodleNetwork1_CompressedBufferSizeNeeded(input.len() as isize); + let mut out_buf: Vec = vec![0u8; output_size as usize]; + let len = OodleNetwork1TCP_Encode( - self.state.as_mut_ptr() as *mut c_void, - self.shared.as_ptr() as *const c_void, - input.as_mut_ptr() as *const c_void, - input.len().try_into().unwrap(), - out_buf.as_mut_ptr() as *mut c_void, + self.state.as_mut_ptr() as *mut c_void, // state + self.shared.as_ptr() as *const c_void, // shared + input.as_mut_ptr() as *const c_void, // raw + input.len().try_into().unwrap(), // rawLen + out_buf.as_mut_ptr() as *mut c_void, // comp ); out_buf.truncate(len as usize);