From d1968d8ccb0f87d1ac9aed98e2a461d61123aa5a Mon Sep 17 00:00:00 2001 From: Dmitry Bogatov Date: Sat, 27 Jul 2019 08:07:38 +0000 Subject: [PATCH] New repl command: send-garbage This new command attempts to send malformed utf8 string to current chat with dc_send_text_msg() function. Currently, instead of error code it causes application crash with following backtrace: thread 'main' panicked at 'Non utf8 string: '[255]' (Utf8Error { valid_up_to: 0, error_len: Some(1) })', src/dc_t ools.rs:1571:9 stack backtrace: 0: backtrace::backtrace::libunwind::trace at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/libunwind.rs:88 1: backtrace::backtrace::trace_unsynchronized at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/mod.rs:66 2: std::sys_common::backtrace::_print at src/libstd/sys_common/backtrace.rs:47 3: std::sys_common::backtrace::print at src/libstd/sys_common/backtrace.rs:36 4: std::panicking::default_hook::{{closure}} at src/libstd/panicking.rs:200 5: std::panicking::default_hook at src/libstd/panicking.rs:214 6: std::panicking::rust_panic_with_hook at src/libstd/panicking.rs:477 7: std::panicking::continue_panic_fmt at src/libstd/panicking.rs:384 8: std::panicking::begin_panic_fmt at src/libstd/panicking.rs:339 9: deltachat::dc_tools::as_str::{{closure}} at src/dc_tools.rs:1571 10: core::result::Result::unwrap_or_else at /rustc/0b680cfce544ff9a59d720020e397c4bf3346650/src/libcore/result.rs:818 11: deltachat::dc_tools::as_str at src/dc_tools.rs:1570 12: deltachat::dc_chat::prepare_msg_raw at src/dc_chat.rs:726 13: deltachat::dc_chat::prepare_msg_common at src/dc_chat.rs:461 14: deltachat::dc_chat::dc_send_msg at src/dc_chat.rs:905 15: deltachat::dc_chat::dc_send_text_msg at src/dc_chat.rs:981 16: repl::cmdline::dc_cmdline at examples/repl/cmdline.rs:955 17: repl::handle_cmd at examples/repl/main.rs:566 18: repl::main_0 at examples/repl/main.rs:445 19: repl::main at examples/repl/main.rs:578 20: std::rt::lang_start::{{closure}} at /rustc/0b680cfce544ff9a59d720020e397c4bf3346650/src/libstd/rt.rs:64 21: std::rt::lang_start_internal::{{closure}} at src/libstd/rt.rs:49 22: std::panicking::try::do_call at src/libstd/panicking.rs:296 23: __rust_maybe_catch_panic at src/libpanic_unwind/lib.rs:82 24: std::panicking::try at src/libstd/panicking.rs:275 25: std::panic::catch_unwind at src/libstd/panic.rs:394 26: std::rt::lang_start_internal at src/libstd/rt.rs:48 27: std::rt::lang_start at /rustc/0b680cfce544ff9a59d720020e397c4bf3346650/src/libstd/rt.rs:64 28: main 29: __libc_start_main 30: _start --- examples/repl/cmdline.rs | 11 +++++++++++ examples/repl/main.rs | 4 +++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/examples/repl/cmdline.rs b/examples/repl/cmdline.rs index 0e72396d1..cabd0a2ba 100644 --- a/examples/repl/cmdline.rs +++ b/examples/repl/cmdline.rs @@ -450,6 +450,7 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E dellocations\n\ getlocations []\n\ send \n\ + send-garbage\n\ sendimage []\n\ sendfile \n\ draft []\n\ @@ -948,6 +949,16 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E bail!("Sending failed."); } } + "send-garbage" => { + ensure!(!sel_chat.is_null(), "No chat selected."); + let msg = b"\xff\x00"; // NUL-terminated C-string, that is malformed utf-8 + if 0 != dc_send_text_msg(context, dc_chat_get_id(sel_chat), msg.as_ptr().cast()) { + println!("Malformed utf-8 succesfully send. Not nice."); + } else { + bail!("Garbage sending failed, as expected."); + } + + } "sendempty" => { ensure!(!sel_chat.is_null(), "No chat selected."); if 0 != dc_send_text_msg( diff --git a/examples/repl/main.rs b/examples/repl/main.rs index 28f923c3f..7cc700af8 100644 --- a/examples/repl/main.rs +++ b/examples/repl/main.rs @@ -3,6 +3,7 @@ //! //! Usage: cargo run --example repl --release -- //! All further options can be set using the set-command (type ? for help). +#![feature(ptr_cast)] #[macro_use] extern crate deltachat; @@ -290,7 +291,7 @@ const DB_COMMANDS: [&'static str; 11] = [ "housekeeping", ]; -const CHAT_COMMANDS: [&'static str; 24] = [ +const CHAT_COMMANDS: [&'static str; 25] = [ "listchats", "listarchived", "chat", @@ -308,6 +309,7 @@ const CHAT_COMMANDS: [&'static str; 24] = [ "dellocations", "getlocations", "send", + "send-garbage", "sendimage", "sendfile", "draft",