From 667e1ec135308e62cb3321b799090e3ff1f738a3 Mon Sep 17 00:00:00 2001 From: Krish Goyal <143925721+KrishGoya1@users.noreply.github.com> Date: Tue, 6 Jan 2026 20:51:44 +0530 Subject: [PATCH] Fix memory leak in Android asset loading and optimize Windows IME loop - Fix memory leak in Android asset loading by properly freeing malloc'd buffers - Optimize needless range loop in Windows IME composition string handling - Reduce Clippy warnings from 4 to 3 --- src/fs.rs | 4 ++++ src/native/android.rs | 4 +++- src/native/windows.rs | 3 +-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/fs.rs b/src/fs.rs index 2212b042..61dc1b20 100644 --- a/src/fs.rs +++ b/src/fs.rs @@ -1,6 +1,9 @@ #[cfg(target_os = "ios")] use crate::native::ios; +#[cfg(target_os = "android")] +use libc; + #[derive(Debug)] pub enum Error { IOError(std::io::Error), @@ -64,6 +67,7 @@ fn load_file_android(path: &str, on_loaded: F) { let slice = unsafe { std::slice::from_raw_parts(data.content, data.content_length as _) }; let response = slice.iter().map(|c| *c as _).collect::>(); + unsafe { libc::free(data.content as *mut std::ffi::c_void); }; Ok(response) } else { Err(Error::AndroidAssetLoadingError) diff --git a/src/native/android.rs b/src/native/android.rs index 3fae9bb0..db75fd62 100644 --- a/src/native/android.rs +++ b/src/native/android.rs @@ -716,12 +716,14 @@ pub(crate) unsafe fn load_asset(filepath: *const ::core::ffi::c_char, out: *mut return; } let length = ndk_sys::AAsset_getLength64(asset); - // TODO: memory leak right here! this buffer would never freed let buffer = libc::malloc(length as _); if ndk_sys::AAsset_read(asset, buffer, length as _) > 0 { ndk_sys::AAsset_close(asset); (*out).content_length = length as _; (*out).content = buffer as _; + } else { + libc::free(buffer); + ndk_sys::AAsset_close(asset); } } diff --git a/src/native/windows.rs b/src/native/windows.rs index 01ffe5fa..b5db3236 100644 --- a/src/native/windows.rs +++ b/src/native/windows.rs @@ -608,8 +608,7 @@ unsafe extern "system" fn win32_wndproc( let char_count = actual_len as usize / 2; let mods = key_mods(); // Send chars in order - for i in 0..char_count { - let chr = buffer[i]; + for &chr in &buffer[..char_count] { if let Some(c) = char::from_u32(chr as u32) { event_handler.char_event(c, mods, false); }