about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAidan Hobson Sayers <aidanhs@cantab.net>2017-09-12 20:27:54 +0100
committerAidan Hobson Sayers <aidanhs@cantab.net>2017-09-12 20:27:54 +0100
commit15887d786ba05a84f2fc5e7036cae88b91291c6c (patch)
tree3e0f173b9e59555df4b56153acd00d849dd2700c
parenta7b7dce02da1b10f6da79b2f2e93a73314faf497 (diff)
downloadrust-15887d786ba05a84f2fc5e7036cae88b91291c6c.tar.gz
rust-15887d786ba05a84f2fc5e7036cae88b91291c6c.zip
Correctly bubble up errors from libbacktrace
-rw-r--r--src/libstd/sys_common/gnu/libbacktrace.rs38
1 files changed, 23 insertions, 15 deletions
diff --git a/src/libstd/sys_common/gnu/libbacktrace.rs b/src/libstd/sys_common/gnu/libbacktrace.rs
index 14c0e8699bc..016c840d154 100644
--- a/src/libstd/sys_common/gnu/libbacktrace.rs
+++ b/src/libstd/sys_common/gnu/libbacktrace.rs
@@ -30,6 +30,12 @@ where F: FnMut(&[u8], libc::c_int) -> io::Result<()>
     let ret;
     let fileline_count = {
         let state = unsafe { init_state() };
+        if state.is_null() {
+            return Err(io::Error::new(
+                io::ErrorKind::Other,
+                "failed to allocate libbacktrace state")
+            )
+        }
         let mut fileline_win: &mut [FileLine] = &mut fileline_buf;
         let fileline_addr = &mut fileline_win as *mut &mut [FileLine];
         ret = unsafe {
@@ -62,23 +68,25 @@ pub fn resolve_symname<F>(frame: Frame,
     let symname = {
         let state = unsafe { init_state() };
         if state.is_null() {
+            return Err(io::Error::new(
+                io::ErrorKind::Other,
+                "failed to allocate libbacktrace state")
+            )
+        }
+        let mut data = ptr::null();
+        let data_addr = &mut data as *mut *const libc::c_char;
+        let ret = unsafe {
+            backtrace_syminfo(state,
+                              frame.symbol_addr as libc::uintptr_t,
+                              syminfo_cb,
+                              error_cb,
+                              data_addr as *mut libc::c_void)
+        };
+        if ret == 0 || data.is_null() {
             None
         } else {
-            let mut data = ptr::null();
-            let data_addr = &mut data as *mut *const libc::c_char;
-            let ret = unsafe {
-                backtrace_syminfo(state,
-                                  frame.symbol_addr as libc::uintptr_t,
-                                  syminfo_cb,
-                                  error_cb,
-                                  data_addr as *mut libc::c_void)
-            };
-            if ret == 0 || data.is_null() {
-                None
-            } else {
-                unsafe {
-                    CStr::from_ptr(data).to_str().ok()
-                }
+            unsafe {
+                CStr::from_ptr(data).to_str().ok()
             }
         }
     };