diff --git a/src/dc_mimeparser.rs b/src/dc_mimeparser.rs index 790deb257..75abd2b91 100644 --- a/src/dc_mimeparser.rs +++ b/src/dc_mimeparser.rs @@ -35,7 +35,7 @@ pub struct dc_mimepart_t { pub is_meta: bool, pub int_mimetype: libc::c_int, pub msg: Option, - pub msg_raw: *mut libc::c_char, + pub msg_raw: Option, pub bytes: libc::c_int, pub param: Params, } @@ -116,8 +116,7 @@ unsafe fn dc_mimeparser_empty(mimeparser: &mut dc_mimeparser_t) { unsafe fn dc_mimepart_unref(mut mimepart: dc_mimepart_t) { mimepart.msg = None; - free(mimepart.msg_raw as *mut libc::c_void); - mimepart.msg_raw = ptr::null_mut(); + mimepart.msg_raw = None; } const DC_MIMETYPE_AC_SETUP_FILE: i32 = 111; @@ -369,7 +368,7 @@ unsafe fn dc_mimepart_new() -> dc_mimepart_t { is_meta: false, int_mimetype: 0, msg: None, - msg_raw: std::ptr::null_mut(), + msg_raw: None, bytes: 0, param: Params::new(), } @@ -592,7 +591,7 @@ unsafe fn dc_mimeparser_parse_mime_recursive( .stock_str(StockMessage::CantDecryptMsgBody); let txt = format!("[{}]", msg_body); - part.msg_raw = txt.strdup(); + part.msg_raw = Some(txt.clone()); part.msg = Some(txt); mimeparser.parts.push(part); @@ -1120,8 +1119,13 @@ unsafe fn dc_mimeparser_add_single_part_if_known( part.type_0 = Viewtype::Text; part.int_mimetype = mime_type; part.msg = Some(simplified_txt); - part.msg_raw = - strndup(decoded_data, decoded_data_bytes as libc::c_ulong); + part.msg_raw = { + let raw_c = + strndup(decoded_data, decoded_data_bytes as libc::c_ulong); + let raw = to_string(raw_c); + free(raw_c.cast()); + Some(raw) + }; do_add_single_part(mimeparser, part); } diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index 378966810..c3a0b34e8 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -1,3 +1,4 @@ +use std::ffi::CString; use std::ptr; use itertools::join; @@ -641,6 +642,7 @@ unsafe fn add_parts( } } if part.type_0 == Viewtype::Text { + let msg_raw = CString::yolo(part.msg_raw.as_ref().unwrap().clone()); txt_raw = dc_mprintf( b"%s\n\n%s\x00" as *const u8 as *const libc::c_char, if !mime_parser.subject.is_null() { @@ -648,7 +650,7 @@ unsafe fn add_parts( } else { b"\x00" as *const u8 as *const libc::c_char }, - part.msg_raw, + msg_raw.as_ptr(), ) } if 0 != mime_parser.is_system_message {