From 0e6b12d7ae62b3978967ea59d568d660790ef654 Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Sat, 27 Jul 2019 23:20:43 +0300 Subject: [PATCH 1/2] Move to_string out of dc_create_setup_code --- examples/repl/cmdline.rs | 9 +++++---- src/dc_imex.rs | 6 +++--- tests/stress.rs | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/examples/repl/cmdline.rs b/examples/repl/cmdline.rs index 9e59b08b8..09c0225a6 100644 --- a/examples/repl/cmdline.rs +++ b/examples/repl/cmdline.rs @@ -1,3 +1,4 @@ +use std::ffi::CString; use std::str::FromStr; use deltachat::chatlist::*; @@ -568,13 +569,14 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E dc_imex(context, 2, context.get_blobdir(), 0 as *const libc::c_char); } "export-setup" => { - let setup_code: *mut libc::c_char = dc_create_setup_code(context); + let setup_code = dc_create_setup_code(context); + let setup_code_c = CString::new(setup_code.clone()).unwrap(); let file_name: *mut libc::c_char = dc_mprintf( b"%s/autocrypt-setup-message.html\x00" as *const u8 as *const libc::c_char, context.get_blobdir(), ); let file_content: *mut libc::c_char; - file_content = dc_render_setup_file(context, setup_code); + file_content = dc_render_setup_file(context, setup_code_c.as_ptr()); if !file_content.is_null() && 0 != dc_write_file( context, @@ -586,14 +588,13 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E println!( "Setup message written to: {}\nSetup code: {}", as_str(file_name), - as_str(setup_code), + &setup_code, ) } else { bail!(""); } free(file_content as *mut libc::c_void); free(file_name as *mut libc::c_void); - free(setup_code as *mut libc::c_void); } "poke" => { ensure!(0 != poke_spec(context, arg1_c), "Poke failed"); diff --git a/src/dc_imex.rs b/src/dc_imex.rs index 0a0ff19a8..ad9e0d401 100644 --- a/src/dc_imex.rs +++ b/src/dc_imex.rs @@ -105,7 +105,7 @@ pub unsafe fn dc_initiate_key_transfer(context: &Context) -> *mut libc::c_char { if 0 == dc_alloc_ongoing(context) { return 0 as *mut libc::c_char; } - setup_code = dc_create_setup_code(context); + setup_code = to_cstring(dc_create_setup_code(context)); if !setup_code.is_null() { /* this may require a keypair to be created. this may take a second ... */ if !context @@ -282,7 +282,7 @@ pub unsafe extern "C" fn dc_render_setup_file( ret_setupfilecontent } -pub unsafe fn dc_create_setup_code(_context: &Context) -> *mut libc::c_char { +pub fn dc_create_setup_code(_context: &Context) -> String { let mut random_val: uint16_t; let mut rng = thread_rng(); let mut ret = String::new(); @@ -302,7 +302,7 @@ pub unsafe fn dc_create_setup_code(_context: &Context) -> *mut libc::c_char { ); } - to_cstring(ret) + ret } // TODO should return bool /rtn diff --git a/tests/stress.rs b/tests/stress.rs index 89beddf4b..1cb46c967 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -529,7 +529,7 @@ unsafe fn stress_functions(context: &Context) { if 0 != dc_is_configured(context) { let setupcode: *mut libc::c_char; let setupfile: *mut libc::c_char; - setupcode = dc_create_setup_code(context); + setupcode = to_cstring(dc_create_setup_code(context)); assert!(!setupcode.is_null()); assert_eq!(strlen(setupcode), 44); assert!( From 3033d8100dac6ca599077eee261b030914c46524 Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Sat, 27 Jul 2019 23:32:20 +0300 Subject: [PATCH 2/2] Test dc_create_setup_code() without to_cstring() --- tests/stress.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/stress.rs b/tests/stress.rs index 1cb46c967..d5518b9e2 100644 --- a/tests/stress.rs +++ b/tests/stress.rs @@ -1,6 +1,7 @@ //! Stress some functions for testing; if used as a lib, this file is obsolete. use std::collections::HashSet; +use std::ffi::CString; use mmime::mailimf_types::*; use tempfile::{tempdir, TempDir}; @@ -527,11 +528,11 @@ unsafe fn stress_functions(context: &Context) { ); free(buf_1 as *mut libc::c_void); if 0 != dc_is_configured(context) { - let setupcode: *mut libc::c_char; let setupfile: *mut libc::c_char; - setupcode = to_cstring(dc_create_setup_code(context)); - assert!(!setupcode.is_null()); - assert_eq!(strlen(setupcode), 44); + let setupcode_c = + CString::new(dc_create_setup_code(context)).expect("invalid string converted"); + assert_eq!(setupcode_c.to_bytes().len(), 44); + let setupcode = setupcode_c.as_ptr(); assert!( 0 != !(*setupcode.offset(4isize) as libc::c_int == '-' as i32 && *setupcode.offset(9isize) as libc::c_int == '-' as i32 @@ -596,7 +597,6 @@ unsafe fn stress_functions(context: &Context) { ); free(payload as *mut libc::c_void); free(setupfile as *mut libc::c_void); - free(setupcode as *mut libc::c_void); } if 0 != dc_is_configured(context) {