From 8eceabb12c85aee0dcda1b79d08c9878421ad505 Mon Sep 17 00:00:00 2001 From: Prateek Sunal Date: Sun, 25 Aug 2024 23:49:29 +0530 Subject: [PATCH] fix: memory leak in vector to string --- src/rust/src/common.rs | 2 +- src/rust/src/utils.rs | 31 ++++++++----------------------- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/src/rust/src/common.rs b/src/rust/src/common.rs index cb4d7ba0c..aa6eefae7 100644 --- a/src/rust/src/common.rs +++ b/src/rust/src/common.rs @@ -563,7 +563,7 @@ impl CType for EncoderConfig { extract: self.extract as _, dtvcc_extract: self.dtvcc_extract as _, gui_mode_reports: self.gui_mode_reports as _, - output_filename: unsafe { string_to_c_char(&self.output_filename) }, + output_filename: string_to_c_char(&self.output_filename), write_format: self.write_format.to_ctype(), keep_output_closed: self.keep_output_closed as _, force_flush: self.force_flush as _, diff --git a/src/rust/src/utils.rs b/src/rust/src/utils.rs index 6305d875d..90ada59dd 100644 --- a/src/rust/src/utils.rs +++ b/src/rust/src/utils.rs @@ -25,7 +25,7 @@ pub unsafe fn c_char_to_string(c: *const ::std::os::raw::c_char) -> Option *mut ::std::os::raw::c_char { +pub fn string_to_c_char(a: &str) -> *mut ::std::os::raw::c_char { if a.is_empty() { return null_pointer(); } @@ -40,31 +40,16 @@ pub fn null_pointer() -> *mut T { std::ptr::null_mut() } -use std::ffi::CString; use std::os::raw::c_char; pub fn string_to_c_chars(strs: Vec) -> *mut *mut c_char { - let cstr_vec: Vec = strs - .iter() - .map(|s| CString::new(s.as_str()).unwrap()) - .collect(); - let c_char_vec: Vec<*mut c_char> = cstr_vec - .iter() - .map(|s| { - if s.as_bytes().is_empty() { - null_pointer() - } else { - s.as_ptr() as *mut c_char - } - }) - .collect(); - - let ptr = c_char_vec.as_ptr(); - - std::mem::forget(cstr_vec); - std::mem::forget(c_char_vec); - - ptr as *mut *mut c_char + let mut c_strs: Vec<*mut c_char> = Vec::new(); + for s in strs { + c_strs.push(string_to_c_char(&s)); + } + let ptr = c_strs.as_mut_ptr(); + std::mem::forget(c_strs); + ptr } /// This function creates a new object of type `T` and fills it with zeros.