about summary refs log tree commit diff
path: root/src/libstd/sys_common
diff options
context:
space:
mode:
authorMichał Krasnoborski <mkrdln@gmail.com>2017-02-03 17:48:07 +0100
committerMichał Krasnoborski <mkrdln@gmail.com>2017-02-03 17:48:07 +0100
commit0267529681e2fac6ef4560afe7d8d439d04e6303 (patch)
tree00bac1c7b714a59f1e4f230a64cb5427de2b62eb /src/libstd/sys_common
parentecda7f314fa79bbfbf2125c99fd66288ca83c875 (diff)
parentaed6410a7b0f15dc68536e0735787436526ba395 (diff)
downloadrust-0267529681e2fac6ef4560afe7d8d439d04e6303.tar.gz
rust-0267529681e2fac6ef4560afe7d8d439d04e6303.zip
Merge remote-tracking branch 'upstream/master' into format-with-capacity
Diffstat (limited to 'src/libstd/sys_common')
-rw-r--r--src/libstd/sys_common/gnu/libbacktrace.rs17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/libstd/sys_common/gnu/libbacktrace.rs b/src/libstd/sys_common/gnu/libbacktrace.rs
index b5802afc109..d464a13ad1d 100644
--- a/src/libstd/sys_common/gnu/libbacktrace.rs
+++ b/src/libstd/sys_common/gnu/libbacktrace.rs
@@ -16,6 +16,7 @@ use sys_common::backtrace::{output, output_fileline};
 pub fn print(w: &mut Write, idx: isize, addr: *mut libc::c_void,
              symaddr: *mut libc::c_void) -> io::Result<()> {
     use ffi::CStr;
+    use mem;
     use ptr;
 
     ////////////////////////////////////////////////////////////////////////
@@ -124,7 +125,21 @@ pub fn print(w: &mut Write, idx: isize, addr: *mut libc::c_void,
     unsafe fn init_state() -> *mut backtrace_state {
         static mut STATE: *mut backtrace_state = ptr::null_mut();
         if !STATE.is_null() { return STATE }
-        STATE = backtrace_create_state(ptr::null(), 0, error_cb,
+
+        let filename = match ::sys::backtrace::gnu::get_executable_filename() {
+            Ok((filename, file)) => {
+                // filename is purposely leaked here since libbacktrace requires
+                // it to stay allocated permanently, file is also leaked so that
+                // the file stays locked
+                let filename_ptr = filename.as_ptr();
+                mem::forget(filename);
+                mem::forget(file);
+                filename_ptr
+            },
+            Err(_) => ptr::null(),
+        };
+
+        STATE = backtrace_create_state(filename, 0, error_cb,
                                        ptr::null_mut());
         STATE
     }