From f59b6c028cf2c3d6f047720c9b4773a758016902 Mon Sep 17 00:00:00 2001 From: dbaranov Date: Thu, 29 Jun 2023 14:22:31 +0400 Subject: [PATCH 1/5] Fix: memory leak on TlTonClient::receive --- src/tl.rs | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/tl.rs b/src/tl.rs index 58f9d983..69ea5c2a 100644 --- a/src/tl.rs +++ b/src/tl.rs @@ -76,23 +76,22 @@ impl TlTonClient { } pub fn receive(&self, timeout: f64) -> Option<(Result, Option)> { - unsafe { - let c_str = tonlib_client_json_receive(self.ptr, timeout); - if c_str.is_null() { - None + let c_str = unsafe { tonlib_client_json_receive(self.ptr, timeout) }; + if c_str.is_null() { + None + } else { + let c_str_slice = unsafe { CStr::from_ptr(c_str) }; + if let Ok(c_str_str) = c_str_slice.to_str() { + trace!("{} receive: {}", self.tag, c_str_str); } else { - trace!( - "{} receive: {}", - self.tag, - CStr::from_ptr(c_str) - .to_str() - .unwrap_or("") - ); - let (result, extra) = deserialize_result_extra(c_str); - Some((result, extra)) + trace!("{} receive: ", self.tag); } + let c_str_bytes = c_str_slice.to_bytes(); + let (result, extra) = unsafe { deserialize_result_extra(c_str_bytes.as_ptr() as *const i8) }; + Some((result, extra)) } } + pub fn set_log_verbosity_level(verbosity_level: u32) { unsafe { tonlib_sys::tonlib_client_set_verbosity_level(verbosity_level) } From 8212b8a7f8f046b3f8c1e9c488d67cd0628d2c2c Mon Sep 17 00:00:00 2001 From: dbaranov Date: Thu, 29 Jun 2023 14:26:59 +0400 Subject: [PATCH 2/5] fmt --- src/tl.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tl.rs b/src/tl.rs index 69ea5c2a..f72f3c39 100644 --- a/src/tl.rs +++ b/src/tl.rs @@ -87,11 +87,11 @@ impl TlTonClient { trace!("{} receive: ", self.tag); } let c_str_bytes = c_str_slice.to_bytes(); - let (result, extra) = unsafe { deserialize_result_extra(c_str_bytes.as_ptr() as *const i8) }; + let (result, extra) = + unsafe { deserialize_result_extra(c_str_bytes.as_ptr() as *const i8) }; Some((result, extra)) } } - pub fn set_log_verbosity_level(verbosity_level: u32) { unsafe { tonlib_sys::tonlib_client_set_verbosity_level(verbosity_level) } From 637119855a713a83b7844083b0e5612653238529 Mon Sep 17 00:00:00 2001 From: dbaranov Date: Thu, 29 Jun 2023 15:57:39 +0400 Subject: [PATCH 3/5] made client receive unsafe --- src/client/connection.rs | 2 +- src/tl.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/connection.rs b/src/client/connection.rs index 4ad628e9..71a937fb 100644 --- a/src/client/connection.rs +++ b/src/client/connection.rs @@ -190,7 +190,7 @@ impl Clone for TonConnection { fn run_loop(tag: String, weak_inner: Weak) -> anyhow::Result<()> { loop { if let Some(inner) = weak_inner.upgrade() { - let recv = inner.tl_client.receive(1.0); + let recv = unsafe { inner.tl_client.receive(1.0) }; if let Some((ton_result, maybe_extra)) = recv { let maybe_request_id = maybe_extra.and_then(|s| s.parse::().ok()); let maybe_data = maybe_request_id.and_then(|i| inner.request_map.remove(&i)); diff --git a/src/tl.rs b/src/tl.rs index f72f3c39..4a904b0f 100644 --- a/src/tl.rs +++ b/src/tl.rs @@ -75,7 +75,7 @@ impl TlTonClient { Ok(()) } - pub fn receive(&self, timeout: f64) -> Option<(Result, Option)> { + pub unsafe fn receive(&self, timeout: f64) -> Option<(Result, Option)> { let c_str = unsafe { tonlib_client_json_receive(self.ptr, timeout) }; if c_str.is_null() { None From c6e6a49e3cc9be0e9de6375a29e6458a0202ea22 Mon Sep 17 00:00:00 2001 From: dbaranov Date: Thu, 29 Jun 2023 16:51:59 +0400 Subject: [PATCH 4/5] more accurate drop fot TlConClient --- src/tl.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tl.rs b/src/tl.rs index 4a904b0f..9fa0677e 100644 --- a/src/tl.rs +++ b/src/tl.rs @@ -100,7 +100,12 @@ impl TlTonClient { impl Drop for TlTonClient { fn drop(&mut self) { - unsafe { tonlib_client_json_destroy(self.ptr) } + unsafe { + if !self.ptr.is_null() { + tonlib_client_json_destroy(self.ptr); + self.ptr = std::ptr::null_mut(); + } + } } } From 98516fef134622b0e8278a62d822da40e892a004 Mon Sep 17 00:00:00 2001 From: dbaranov Date: Thu, 29 Jun 2023 18:57:36 +0400 Subject: [PATCH 5/5] safe client receive --- src/client/connection.rs | 2 +- src/tl.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/connection.rs b/src/client/connection.rs index 71a937fb..4ad628e9 100644 --- a/src/client/connection.rs +++ b/src/client/connection.rs @@ -190,7 +190,7 @@ impl Clone for TonConnection { fn run_loop(tag: String, weak_inner: Weak) -> anyhow::Result<()> { loop { if let Some(inner) = weak_inner.upgrade() { - let recv = unsafe { inner.tl_client.receive(1.0) }; + let recv = inner.tl_client.receive(1.0); if let Some((ton_result, maybe_extra)) = recv { let maybe_request_id = maybe_extra.and_then(|s| s.parse::().ok()); let maybe_data = maybe_request_id.and_then(|i| inner.request_map.remove(&i)); diff --git a/src/tl.rs b/src/tl.rs index 9fa0677e..5fc0d71d 100644 --- a/src/tl.rs +++ b/src/tl.rs @@ -75,7 +75,7 @@ impl TlTonClient { Ok(()) } - pub unsafe fn receive(&self, timeout: f64) -> Option<(Result, Option)> { + pub fn receive(&self, timeout: f64) -> Option<(Result, Option)> { let c_str = unsafe { tonlib_client_json_receive(self.ptr, timeout) }; if c_str.is_null() { None