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
}};
}