diff --git a/mmime/src/display.rs b/mmime/src/display.rs index 03c8b075a..4282a58bd 100644 --- a/mmime/src/display.rs +++ b/mmime/src/display.rs @@ -221,13 +221,10 @@ unsafe fn display_orig_date(mut orig_date: *mut mailimf_orig_date) { display_date_time((*orig_date).dt_date_time); } unsafe fn display_mailbox(mut mb: *mut mailimf_mailbox) { - if !(*mb).mb_display_name.is_null() { - print!( - "{}", - CStr::from_ptr((*mb).mb_display_name).to_str().unwrap() - ); + if !(*mb).display_name.is_null() { + print!("{}", CStr::from_ptr((*mb).display_name).to_str().unwrap()); } - print!("<{}>", CStr::from_ptr((*mb).mb_addr_spec).to_str().unwrap()); + print!("<{}>", CStr::from_ptr((*mb).addr_spec).to_str().unwrap()); } unsafe fn display_mailbox_list(mut mb_list: *mut mailimf_mailbox_list) { for (i, mb) in (*mb_list).0.iter().enumerate() { diff --git a/mmime/src/mailimf/types.rs b/mmime/src/mailimf/types.rs index 0601a6128..64b996dcf 100644 --- a/mmime/src/mailimf/types.rs +++ b/mmime/src/mailimf/types.rs @@ -75,22 +75,26 @@ impl Drop for mailimf_mailbox_list { } } -/* - mailimf_mailbox is a mailbox - - - display_name is the name that will be displayed for this mailbox, - for example 'name' in '"name" , - should be allocated with malloc() - - - addr_spec is the mailbox, for example 'mailbox@domain' - in '"name" , should be allocated with malloc() -*/ -#[derive(Copy, Clone)] -#[repr(C)] +/// A single mailbox. +#[derive(Clone)] pub struct mailimf_mailbox { - pub mb_display_name: *mut libc::c_char, - pub mb_addr_spec: *mut libc::c_char, + /// The name that will be displayed for this mailbox, + /// for example 'name' in '"name" . + pub display_name: *mut libc::c_char, + /// addr_spec is the mailbox, for example 'mailbox@domain' + /// in '"name" . + pub addr_spec: *mut libc::c_char, } + +impl Drop for mailimf_mailbox { + fn drop(&mut self) { + if !self.display_name.is_null() { + unsafe { mailimf_display_name_free(self.display_name) }; + } + unsafe { mailimf_addr_spec_free(self.addr_spec) }; + } +} + /* mailimf_address_list is a list of addresses @@ -518,31 +522,28 @@ pub unsafe fn mailimf_mailbox_list_free(mb_list: *mut mailimf_mailbox_list) { let _ = Box::from_raw(mb_list); } -#[no_mangle] -pub unsafe fn mailimf_mailbox_free(mut mailbox: *mut mailimf_mailbox) { - if !(*mailbox).mb_display_name.is_null() { - mailimf_display_name_free((*mailbox).mb_display_name); +pub unsafe fn mailimf_mailbox_free(mailbox: *mut mailimf_mailbox) { + if mailbox.is_null() { + return; } - mailimf_addr_spec_free((*mailbox).mb_addr_spec); - free(mailbox as *mut libc::c_void); + let _ = Box::from_raw(mailbox); } + #[no_mangle] pub unsafe fn mailimf_addr_spec_free(mut addr_spec: *mut libc::c_char) { free(addr_spec as *mut libc::c_void); } -#[no_mangle] -pub unsafe fn mailimf_mailbox_new( - mut mb_display_name: *mut libc::c_char, - mut mb_addr_spec: *mut libc::c_char, + +pub fn mailimf_mailbox_new( + display_name: *mut libc::c_char, + addr_spec: *mut libc::c_char, ) -> *mut mailimf_mailbox { - let mut mb: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox; - mb = malloc(::std::mem::size_of::() as libc::size_t) as *mut mailimf_mailbox; - if mb.is_null() { - return 0 as *mut mailimf_mailbox; - } - (*mb).mb_display_name = mb_display_name; - (*mb).mb_addr_spec = mb_addr_spec; - return mb; + let mb = mailimf_mailbox { + display_name, + addr_spec, + }; + + Box::into_raw(Box::new(mb)) } pub fn mailimf_group_new( diff --git a/mmime/src/mailimf/write_generic.rs b/mmime/src/mailimf/write_generic.rs index a623b23f3..016686498 100644 --- a/mmime/src/mailimf/write_generic.rs +++ b/mmime/src/mailimf/write_generic.rs @@ -1084,21 +1084,21 @@ unsafe fn mailimf_mailbox_write_driver( ) -> libc::c_int { let mut r: libc::c_int = 0; let mut do_fold: libc::c_int = 0; - if !(*mb).mb_display_name.is_null() { - if 0 != is_atext((*mb).mb_display_name) { + if !(*mb).display_name.is_null() { + if 0 != is_atext((*mb).display_name) { r = mailimf_header_string_write_driver( do_write, data, col, - (*mb).mb_display_name, - strlen((*mb).mb_display_name), + (*mb).display_name, + strlen((*mb).display_name), ); if r != MAILIMF_NO_ERROR as libc::c_int { return r; } } else { - if !(*mb).mb_display_name.is_null() { - if (*col as libc::size_t).wrapping_add(strlen((*mb).mb_display_name)) + if !(*mb).display_name.is_null() { + if (*col as libc::size_t).wrapping_add(strlen((*mb).display_name)) >= 72i32 as libc::size_t { r = mailimf_string_write_driver( @@ -1113,15 +1113,15 @@ unsafe fn mailimf_mailbox_write_driver( } } } - if strlen((*mb).mb_display_name) > (998i32 / 2i32) as libc::size_t { + if strlen((*mb).display_name) > (998i32 / 2i32) as libc::size_t { return MAILIMF_ERROR_INVAL as libc::c_int; } r = mailimf_quoted_string_write_driver( do_write, data, col, - (*mb).mb_display_name, - strlen((*mb).mb_display_name), + (*mb).display_name, + strlen((*mb).display_name), ); if r != MAILIMF_NO_ERROR as libc::c_int { return r; @@ -1130,7 +1130,7 @@ unsafe fn mailimf_mailbox_write_driver( do_fold = 0i32; if *col > 1i32 { if (*col as libc::size_t) - .wrapping_add(strlen((*mb).mb_addr_spec)) + .wrapping_add(strlen((*mb).addr_spec)) .wrapping_add(3i32 as libc::size_t) >= 72i32 as libc::size_t { @@ -1171,8 +1171,8 @@ unsafe fn mailimf_mailbox_write_driver( do_write, data, col, - (*mb).mb_addr_spec, - strlen((*mb).mb_addr_spec), + (*mb).addr_spec, + strlen((*mb).addr_spec), ); if r != MAILIMF_NO_ERROR as libc::c_int { return r; @@ -1188,8 +1188,7 @@ unsafe fn mailimf_mailbox_write_driver( return r; } } else { - if (*col as libc::size_t).wrapping_add(strlen((*mb).mb_addr_spec)) >= 72i32 as libc::size_t - { + if (*col as libc::size_t).wrapping_add(strlen((*mb).addr_spec)) >= 72i32 as libc::size_t { r = mailimf_string_write_driver( do_write, data, @@ -1205,8 +1204,8 @@ unsafe fn mailimf_mailbox_write_driver( do_write, data, col, - (*mb).mb_addr_spec, - strlen((*mb).mb_addr_spec), + (*mb).addr_spec, + strlen((*mb).addr_spec), ); if r != MAILIMF_NO_ERROR as libc::c_int { return r; diff --git a/src/dc_mimeparser.rs b/src/dc_mimeparser.rs index d65f21330..6585516b3 100644 --- a/src/dc_mimeparser.rs +++ b/src/dc_mimeparser.rs @@ -847,7 +847,7 @@ impl<'a> MimeParser<'a> { .unwrap_or_else(|| ptr::null_mut()); if !mb.is_null() { - let from_addr_norm = addr_normalize(as_str((*mb).mb_addr_spec)); + let from_addr_norm = addr_normalize(as_str((*mb).addr_spec)); let recipients = mailimf_get_recipients(self.header_root); if recipients.len() == 1 { if recipients.contains(from_addr_norm) { @@ -916,8 +916,8 @@ pub fn mailimf_find_first_addr(mb_list: *const mailimf_mailbox_list) -> Option HashSet fn mailimf_get_recipients_add_addr(recipients: &mut HashSet, mb: *mut mailimf_mailbox) { if !mb.is_null() { - let addr_norm = addr_normalize(as_str(unsafe { (*mb).mb_addr_spec })); + let addr_norm = addr_normalize(as_str(unsafe { (*mb).addr_spec })); recipients.insert(addr_norm.into()); } } diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index c1e6ed3b2..dca216573 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -1868,8 +1868,8 @@ unsafe fn dc_add_or_lookup_contacts_by_address_list( if !mb.is_null() { add_or_lookup_contact_by_addr( context, - (*mb).mb_display_name, - (*mb).mb_addr_spec, + (*mb).display_name, + (*mb).addr_spec, origin, ids, check_self, @@ -1906,8 +1906,8 @@ unsafe fn dc_add_or_lookup_contacts_by_mailbox_list( if !mb.is_null() { add_or_lookup_contact_by_addr( context, - (*mb).mb_display_name, - (*mb).mb_addr_spec, + (*mb).display_name, + (*mb).addr_spec, origin, ids, check_self,