From 009352f4348f2d9ea9752246d219438d7af8c75c Mon Sep 17 00:00:00 2001 From: jkds Date: Wed, 9 Apr 2025 10:56:46 +0200 Subject: [PATCH] android: ndk_utils::get_utf_str!() macro leaks memory. Free the string after use. --- src/native/android.rs | 2 +- src/native/android/ndk_utils.rs | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/native/android.rs b/src/native/android.rs index ff8659ce..001fc24d 100644 --- a/src/native/android.rs +++ b/src/native/android.rs @@ -344,7 +344,7 @@ impl crate::native::Clipboard for AndroidClipboard { return None; } - let text = ndk_utils::get_utf_str!(env, text).to_string(); + let text = ndk_utils::get_utf_str!(env, text); Some(text) } } diff --git a/src/native/android/ndk_utils.rs b/src/native/android/ndk_utils.rs index 57c30ee1..6b8f5e94 100644 --- a/src/native/android/ndk_utils.rs +++ b/src/native/android/ndk_utils.rs @@ -73,9 +73,13 @@ macro_rules! call_bool_method { #[macro_export] macro_rules! get_utf_str { ($env:expr, $obj:expr) => {{ - let string = (**$env).GetStringUTFChars.unwrap()($env, $obj, std::ptr::null_mut()); - let string = std::ffi::CStr::from_ptr(string); - string.to_str().unwrap() + let cstr_dat = (**$env).GetStringUTFChars.unwrap()($env, $obj, std::ptr::null_mut()); + let string = std::ffi::CStr::from_ptr(cstr_dat) + .to_str() + .unwrap() + .to_string(); + (**$env).ReleaseStringUTFChars.unwrap()($env, $obj, cstr_dat); + string }}; }