From e5a78b8f81dd326d6ed2858e1abe989e7defdfba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Sun, 13 Jul 2025 14:10:31 -0400 Subject: [PATCH] Fix memory leaks: error need to be freed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hubert Figuière --- src/lib.rs | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 365cb2b..ddabbf9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -291,9 +291,11 @@ impl Metadata { let metadata = gexiv2::gexiv2_metadata_new(); let ok = gexiv2::gexiv2_metadata_open_path(metadata, c_str_path.as_ptr(), &mut err); if ok != 1 { - let err_msg = ffi::CStr::from_ptr((*err).message).to_str(); + gexiv2::gexiv2_metadata_free(metadata); + let err_msg = ffi::CStr::from_ptr((*err).message).to_str().map(str::to_string); + gexiv2::g_error_free(err); return Err(Rexiv2Error::Internal( - err_msg.ok().map(|msg| msg.to_string()), + err_msg.ok(), )); } Ok(Metadata { raw: metadata }) @@ -314,9 +316,11 @@ impl Metadata { &mut err, ); if ok != 1 { - let err_msg = ffi::CStr::from_ptr((*err).message).to_str(); + gexiv2::gexiv2_metadata_free(metadata); + let err_msg = ffi::CStr::from_ptr((*err).message).to_str().map(str::to_string); + gexiv2::g_error_free(err); return Err(Rexiv2Error::Internal( - err_msg.ok().map(|msg| msg.to_string()), + err_msg.ok(), )); } Ok(Metadata { raw: metadata }) @@ -346,9 +350,11 @@ impl Metadata { &mut err, ); if ok != 1 { - let err_msg = ffi::CStr::from_ptr((*err).message).to_str(); + gexiv2::gexiv2_metadata_free(metadata); + let err_msg = ffi::CStr::from_ptr((*err).message).to_str().map(str::to_string); + gexiv2::g_error_free(err); return Err(Rexiv2Error::Internal( - err_msg.ok().map(|msg| msg.to_string()), + err_msg.ok(), )); } Ok(Metadata { raw: metadata }) @@ -363,9 +369,10 @@ impl Metadata { unsafe { let ok = gexiv2::gexiv2_metadata_save_file(self.raw, c_str_path.as_ptr(), &mut err); if ok != 1 { - let err_msg = ffi::CStr::from_ptr((*err).message).to_str(); + let err_msg = ffi::CStr::from_ptr((*err).message).to_str().map(str::to_string); + gexiv2::g_error_free(err); return Err(Rexiv2Error::Internal( - err_msg.ok().map(|msg| msg.to_string()), + err_msg.ok(), )); } Ok(()) @@ -729,9 +736,9 @@ impl Metadata { if c_str_val.is_null() { return Err(Rexiv2Error::NoValue); } - let value = ffi::CStr::from_ptr(c_str_val).to_str()?.to_string(); + let value = ffi::CStr::from_ptr(c_str_val).to_str().map(str::to_string); libc::free(c_str_val as *mut libc::c_void); - Ok(value) + Ok(value?) } } @@ -772,9 +779,9 @@ impl Metadata { if c_str_val.is_null() { return Err(Rexiv2Error::NoValue); } - let value = ffi::CStr::from_ptr(c_str_val).to_str()?.to_string(); + let value = ffi::CStr::from_ptr(c_str_val).to_str().map(str::to_string); libc::free(c_str_val as *mut libc::c_void); - Ok(value) + Ok(value?) } } @@ -1085,9 +1092,10 @@ impl Metadata { &mut err, ); if ok != 1 { - let err_msg = ffi::CStr::from_ptr((*err).message).to_str(); + let err_msg = ffi::CStr::from_ptr((*err).message).to_str().map(str::to_string); + gexiv2::g_error_free(err); return Err(Rexiv2Error::Internal( - err_msg.ok().map(|msg| msg.to_string()), + err_msg.ok(), )); } Ok(())