Avoid memory leak when failing to open connections

This commit is contained in:
Sean Klein 2020-05-25 10:58:46 -04:00
parent 22580234c1
commit 42f9bbfe01

View File

@ -28,12 +28,25 @@ impl Connection {
pub fn open_with_flags<T: AsRef<Path>>(path: T, flags: OpenFlags) -> Result<Connection> { pub fn open_with_flags<T: AsRef<Path>>(path: T, flags: OpenFlags) -> Result<Connection> {
let mut raw = 0 as *mut _; let mut raw = 0 as *mut _;
unsafe { unsafe {
ok!(ffi::sqlite3_open_v2( let ret = ffi::sqlite3_open_v2(
path_to_cstr!(path.as_ref()).as_ptr(), path_to_cstr!(path.as_ref()).as_ptr(),
&mut raw, &mut raw,
flags.0, flags.0,
0 as *const _, 0 as *const _ );
));
// Explicitly close the connection on error.
// This is a quirk of the C API, where the database handle
// (raw) is unconditionally allocated.
match ret {
ffi::SQLITE_OK => {},
code => {
ffi::sqlite3_close(raw);
return Err(::Error {
code: Some(code as isize),
message: None
});
},
}
} }
Ok(Connection { Ok(Connection {
raw: raw, raw: raw,