mirror of
https://github.com/chatmail/core.git
synced 2026-04-28 02:46:29 +03:00
Drop unsafe version of dc_decode_header_words
Replace all call sites with safe version and adjust tests as apporiate.
This commit is contained in:
committed by
holger krekel
parent
34b3ddf63b
commit
618abd63cf
@@ -1965,7 +1965,7 @@ unsafe fn add_or_lookup_contact_by_addr(
|
|||||||
/* add addr_spec if missing, update otherwise */
|
/* add addr_spec if missing, update otherwise */
|
||||||
let mut display_name_dec = "".to_string();
|
let mut display_name_dec = "".to_string();
|
||||||
if !display_name_enc.is_null() {
|
if !display_name_enc.is_null() {
|
||||||
let tmp = as_str(dc_decode_header_words(display_name_enc));
|
let tmp = dc_decode_header_words_safe(as_str(display_name_enc));
|
||||||
display_name_dec = normalize_name(&tmp);
|
display_name_dec = normalize_name(&tmp);
|
||||||
}
|
}
|
||||||
/*can be NULL*/
|
/*can be NULL*/
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use std::ffi::CString;
|
|||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
||||||
use charset::Charset;
|
use charset::Charset;
|
||||||
use libc::{free, strlen};
|
use libc::free;
|
||||||
use mmime::mailmime::decode::mailmime_encoded_phrase_parse;
|
use mmime::mailmime::decode::mailmime_encoded_phrase_parse;
|
||||||
use mmime::other::*;
|
use mmime::other::*;
|
||||||
use percent_encoding::{percent_decode, utf8_percent_encode, AsciiSet, CONTROLS};
|
use percent_encoding::{percent_decode, utf8_percent_encode, AsciiSet, CONTROLS};
|
||||||
@@ -68,27 +68,6 @@ fn quote_word(word: &[u8]) -> String {
|
|||||||
* Encode/decode header words, RFC 2047
|
* Encode/decode header words, RFC 2047
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
pub unsafe fn dc_decode_header_words(in_0: *const libc::c_char) -> *mut libc::c_char {
|
|
||||||
if in_0.is_null() {
|
|
||||||
return ptr::null_mut();
|
|
||||||
}
|
|
||||||
let mut out: *mut libc::c_char = ptr::null_mut();
|
|
||||||
let mut cur_token = 0;
|
|
||||||
let r: libc::c_int = mailmime_encoded_phrase_parse(
|
|
||||||
b"iso-8859-1\x00" as *const u8 as *const libc::c_char,
|
|
||||||
in_0,
|
|
||||||
strlen(in_0),
|
|
||||||
&mut cur_token,
|
|
||||||
b"utf-8\x00" as *const u8 as *const libc::c_char,
|
|
||||||
&mut out,
|
|
||||||
);
|
|
||||||
if r != MAILIMF_NO_ERROR as libc::c_int || out.is_null() {
|
|
||||||
out = dc_strdup(in_0)
|
|
||||||
}
|
|
||||||
|
|
||||||
out
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn dc_decode_header_words_safe(input: &str) -> String {
|
pub fn dc_decode_header_words_safe(input: &str) -> String {
|
||||||
static FROM_ENCODING: &[u8] = b"iso-8859-1\x00";
|
static FROM_ENCODING: &[u8] = b"iso-8859-1\x00";
|
||||||
static TO_ENCODING: &[u8] = b"utf-8\x00";
|
static TO_ENCODING: &[u8] = b"utf-8\x00";
|
||||||
@@ -177,60 +156,34 @@ pub fn dc_decode_ext_header(to_decode: &[u8]) -> Cow<str> {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
use libc::strcmp;
|
|
||||||
use std::ffi::CStr;
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_dc_decode_header_words() {
|
fn test_dc_decode_header_words() {
|
||||||
unsafe {
|
assert_eq!(
|
||||||
let mut buf1: *mut libc::c_char = dc_decode_header_words(
|
dc_decode_header_words_safe("=?utf-8?B?dGVzdMOkw7bDvC50eHQ=?="),
|
||||||
b"=?utf-8?B?dGVzdMOkw7bDvC50eHQ=?=\x00" as *const u8 as *const libc::c_char,
|
std::string::String::from_utf8(b"test\xc3\xa4\xc3\xb6\xc3\xbc.txt".to_vec()).unwrap(),
|
||||||
);
|
);
|
||||||
assert_eq!(
|
|
||||||
strcmp(
|
|
||||||
buf1,
|
|
||||||
b"test\xc3\xa4\xc3\xb6\xc3\xbc.txt\x00" as *const u8 as *const libc::c_char
|
|
||||||
),
|
|
||||||
0
|
|
||||||
);
|
|
||||||
free(buf1 as *mut libc::c_void);
|
|
||||||
|
|
||||||
buf1 =
|
assert_eq!(
|
||||||
dc_decode_header_words(b"just ascii test\x00" as *const u8 as *const libc::c_char);
|
dc_decode_header_words_safe("just ascii test"),
|
||||||
assert_eq!(CStr::from_ptr(buf1).to_str().unwrap(), "just ascii test");
|
"just ascii test"
|
||||||
free(buf1 as *mut libc::c_void);
|
);
|
||||||
|
|
||||||
assert_eq!(dc_encode_header_words("abcdef"), "abcdef");
|
assert_eq!(dc_encode_header_words("abcdef"), "abcdef");
|
||||||
|
|
||||||
let r = dc_encode_header_words(
|
let r = dc_encode_header_words(
|
||||||
std::string::String::from_utf8(b"test\xc3\xa4\xc3\xb6\xc3\xbc.txt".to_vec())
|
std::string::String::from_utf8(b"test\xc3\xa4\xc3\xb6\xc3\xbc.txt".to_vec()).unwrap(),
|
||||||
.unwrap(),
|
);
|
||||||
|
assert!(r.starts_with("=?utf-8"));
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
dc_decode_header_words_safe(&r),
|
||||||
|
std::string::String::from_utf8(b"test\xc3\xa4\xc3\xb6\xc3\xbc.txt".to_vec()).unwrap(),
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
dc_decode_header_words_safe("=?ISO-8859-1?Q?attachment=3B=0D=0A_filename=3D?= =?ISO-8859-1?Q?=22test=E4=F6=FC=2Etxt=22=3B=0D=0A_size=3D39?="),
|
||||||
|
std::string::String::from_utf8(b"attachment;\r\n filename=\"test\xc3\xa4\xc3\xb6\xc3\xbc.txt\";\r\n size=39".to_vec()).unwrap(),
|
||||||
);
|
);
|
||||||
assert!(r.starts_with("=?utf-8"));
|
|
||||||
|
|
||||||
buf1 = r.strdup();
|
|
||||||
let buf2: *mut libc::c_char = dc_decode_header_words(buf1);
|
|
||||||
assert_eq!(
|
|
||||||
strcmp(
|
|
||||||
buf2,
|
|
||||||
b"test\xc3\xa4\xc3\xb6\xc3\xbc.txt\x00" as *const u8 as *const libc::c_char
|
|
||||||
),
|
|
||||||
0
|
|
||||||
);
|
|
||||||
free(buf2 as *mut libc::c_void);
|
|
||||||
|
|
||||||
buf1 = dc_decode_header_words(
|
|
||||||
b"=?ISO-8859-1?Q?attachment=3B=0D=0A_filename=3D?= =?ISO-8859-1?Q?=22test=E4=F6=FC=2Etxt=22=3B=0D=0A_size=3D39?=\x00" as *const u8 as *const libc::c_char
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
strcmp(
|
|
||||||
buf1,
|
|
||||||
b"attachment;\r\n filename=\"test\xc3\xa4\xc3\xb6\xc3\xbc.txt\";\r\n size=39\x00" as *const u8 as *const libc::c_char,
|
|
||||||
|
|
||||||
),
|
|
||||||
0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user