Auto merge of #44525 - aidanhs:aphs-no-null-deref, r=alexcrichton

Correctly bubble up errors from libbacktrace

Previously the first part of this code didn't check for a null pointer and blindly passed it back down, causing a segfault if libbacktrace failed to initialise. I've changed this to check and bubble up the error if relevant.

Suggested diff view: https://github.com/rust-lang/rust/pull/44525/files?w=1
This commit is contained in:
bors 2017-09-20 14:50:31 +00:00
commit 01c65cb15a

View File

@ -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,8 +68,11 @@ pub fn resolve_symname<F>(frame: Frame,
let symname = {
let state = unsafe { init_state() };
if state.is_null() {
None
} else {
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 {
@ -80,7 +89,6 @@ pub fn resolve_symname<F>(frame: Frame,
CStr::from_ptr(data).to_str().ok()
}
}
}
};
callback(symname)
}