From 667e1ec135308e62cb3321b799090e3ff1f738a3 Mon Sep 17 00:00:00 2001
From: Krish Goyal <[email protected]>
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 2212b042a..61dc1b206 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 3fae9bb04..db75fd62e 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 01ffe5fa4..b5db32369 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);
}