Skip to content

Segmentation Fault on Linux when rustls is present #150

@jonas-schievink

Description

@jonas-schievink

Reproduction

cargo new --bin segfault

Cargo.toml

[package]
name = "ta-client"
version = "0.1.0"

[dependencies]
rmp-serde = "0.13.7"
failure = "0.1.5"
rustls = "0.14.0"

main.rs

extern crate failure;
extern crate rustls;

use failure::Error;

fn main() {
    rmp_serde::from_slice::<()>(&[128])
        .map_err(Error::from)
        .unwrap();
}

Running it, setting RUST_BACKTRACE=1 to make failure obtain a backtrace:

$ env RUST_BACKTRACE=1 cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/ta-client`
fish: 'env RUST_BACKTRACE=1 cargo run' terminated by signal SIGSEGV (Address boundary error)

Removing the extern crate rustls; makes the crash disappear.

Replacing rmp_serde::from_slice::<()>(&[128]) with "abc".parse::<u8>() yields 2 garbage backtraces:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: InvalidDigit }

stack backtrace:
   0:  (0x556643867bd2)
   1: DfU (0x55664386796d)
   2:  (0x556643866289)
   3: (0x5566438661b4)
   4:  (0x5566438668c4)
   5:  (0x556643866586)
   6: .c (0x556643866d3a)
   7:  (0x556643866e7f)
   8: DfU (0x55664389b572)
   9: __rust_maybe_catch_panic (0x55664389d699)
  10:  (0x55664389c0c5)
  11:  (0x556643866e58)
  12: mainA (0x556643866d79)
  13: __libc_start_main (0x7fdc712aa222)
  14:  (0x55664386602d)
  15: <unknown> (0x0)', src/libcore/result.rs:999:5
stack backtrace:
   0: Q
>  1: 
   2: 
   3: <unknown>
   4:y
   5: U
   6: <unknown>
   7: <unknown>
   8: <unknown>
   9: <unknown>
  10: 
  11: <unknown>
  12: 
  13: 
  14: 
  15: 
  16: 
  17: __libc_start_main
  18: <unknown>

This also fixes itself when removing rustls.

GDB

Running GDB via env RUST_BACKTRACE=1 gdb target/debug/ta-client

(gdb) r
Starting program: /home/jonas/dev/segfault/target/debug/ta-client 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7ed5715 in __strlen_avx2 () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff7ed5715 in __strlen_avx2 () from /usr/lib/libc.so.6
#1  0x00005555555c2b7a in std::ffi::c_str::CStr::from_ptr ()
#2  0x00005555555a58c3 in backtrace::symbolize::libbacktrace::Symbol::name ()
#3  0x000055555559d65b in backtrace::symbolize::Symbol::name ()
#4  0x0000555555596c34 in backtrace::capture::Backtrace::resolve::{{closure}} ()
#5  0x00005555555a5cec in backtrace::symbolize::libbacktrace::call ()
#6  0x00005555555a5b8f in backtrace::symbolize::libbacktrace::syminfo_cb ()
#7  0x00005555555a6e69 in elf_syminfo ()
#8  0x00005555555a6235 in __rbt_backtrace_syminfo ()
#9  0x00005555555a5e36 in backtrace::symbolize::libbacktrace::resolve ()
#10 0x000055555559d613 in backtrace::symbolize::resolve_unsynchronized ()
#11 0x000055555559d590 in backtrace::symbolize::resolve ()
#12 0x00005555555969f9 in backtrace::capture::Backtrace::resolve ()
#13 0x00005555555948d6 in failure::backtrace::internal::InternalBacktrace::as_backtrace ()
#14 0x00005555555944bb in <failure::backtrace::Backtrace as core::fmt::Debug>::fmt ()
#15 0x0000555555594161 in <&T as core::fmt::Debug>::fmt ()
#16 0x00005555555df722 in core::fmt::write ()
#17 0x00005555555e0884 in <core::fmt::Formatter<'_> as core::fmt::Write>::write_fmt ()
#18 0x0000555555593e8c in <failure::error::Error as core::fmt::Debug>::fmt ()
#19 0x00005555555df722 in core::fmt::write ()
#20 0x00005555555c86d5 in <std::panicking::continue_panic_fmt::PanicPayload<'a> as core::panic::BoxMeUp>::get ()
#21 0x00005555555c898d in std::panicking::rust_panic_with_hook ()
#22 0x00005555555c8522 in std::panicking::continue_panic_fmt ()
#23 0x00005555555c8406 in rust_begin_unwind ()
#24 0x00005555555dc6ed in core::panicking::panic_fmt ()
#25 0x0000555555587c46 in core::result::unwrap_failed ()
#26 0x0000555555586260 in <core::result::Result<T, E>>::unwrap ()
#27 0x000055555558dda0 in ta_client::main ()
#28 0x000055555558de60 in std::rt::lang_start::{{closure}} ()
#29 0x00005555555c83a3 in std::panicking::try::do_call ()
#30 0x00005555555ca61a in __rust_maybe_catch_panic ()
#31 0x00005555555c8ef6 in std::rt::lang_start_internal ()
#32 0x000055555558de39 in std::rt::lang_start ()
#33 0x000055555558ddda in main ()

For some reason an invalid pointer is passed to CStr::from_ptr (no null pointer, though).

This might very well be a bug in rustc/LLVM, but could also be located in (lib)backtrace like the backtrace indicates, so I'm opening the issue here.

Toolchain versions

rustc 1.33.0-nightly (8e2063d02 2019-01-07)
binary: rustc
commit-hash: 8e2063d02062ee9f088274690a97826333847e17
commit-date: 2019-01-07
host: x86_64-unknown-linux-gnu
release: 1.33.0-nightly
LLVM version: 8.0
gcc version 8.2.1 20181127 (GCC) 
glibc 2.28-5
Linux 4.20.0-arch1-1-ARCH

On stable, it produces a garbled stacktrace instead of a crash.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions