Skip to content

Commit 353ba6c

Browse files
committed
Fix unchecked string creation from ffi return value
1 parent 438118e commit 353ba6c

File tree

1 file changed

+10
-9
lines changed

1 file changed

+10
-9
lines changed

src/error.rs

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
extern crate libc;
22

3-
use self::libc::{c_char, c_int};
3+
use self::libc::c_char;
44
use crate::defines::AfError;
55
use crate::util::{free_host, DimT, MutDimT};
66
use std::error::Error;
@@ -10,7 +10,7 @@ use std::sync::RwLock;
1010

1111
#[allow(dead_code)]
1212
extern "C" {
13-
fn af_get_last_error(str: *mut *mut c_char, len: *mut DimT) -> c_int;
13+
fn af_get_last_error(str: *mut *mut c_char, len: *mut DimT);
1414
}
1515

1616
/// Signature of error handling callback function
@@ -99,14 +99,15 @@ pub fn HANDLE_ERROR(error_code: AfError) {
9999
}
100100

101101
pub fn get_last_error() -> String {
102-
let result: String;
102+
let mut result: String = String::from("No Last Error");
103+
let mut tmp: *mut c_char = ::std::ptr::null_mut();
104+
let mut len: DimT = 0;
103105
unsafe {
104-
let mut tmp: *mut c_char = ::std::ptr::null_mut();
105-
let mut len: DimT = 0;
106-
let err_val = af_get_last_error(&mut tmp, &mut len as MutDimT);
107-
HANDLE_ERROR(AfError::from(err_val));
108-
result = CStr::from_ptr(tmp).to_string_lossy().into_owned();
109-
free_host(tmp);
106+
af_get_last_error(&mut tmp, &mut len as MutDimT);
107+
if len > 0 {
108+
result = CStr::from_ptr(tmp).to_string_lossy().into_owned();
109+
free_host(tmp);
110+
}
110111
}
111112
result
112113
}

0 commit comments

Comments
 (0)