mirror of
https://github.com/isar/rusqlite.git
synced 2025-04-01 19:52:57 +08:00
Fix segfault in regexp user function test
This commit is contained in:
parent
9f5f4ac385
commit
0c3575e845
@ -278,16 +278,16 @@ mod test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern "C" fn regexp_free(raw: *mut c_void) {
|
extern "C" fn regexp_free(raw: *mut c_void) {
|
||||||
unsafe {
|
let _: Box<Regex> = unsafe {
|
||||||
Box::from_raw(raw);
|
Box::from_raw(mem::transmute(raw))
|
||||||
}
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" fn regexp(ctx: *mut sqlite3_context, _: c_int, argv: *mut *mut sqlite3_value) {
|
extern "C" fn regexp(ctx: *mut sqlite3_context, _: c_int, argv: *mut *mut sqlite3_value) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut re_ptr = ffi::sqlite3_get_auxdata(ctx, 0) as *const Regex;
|
let mut re_ptr = ffi::sqlite3_get_auxdata(ctx, 0) as *const Regex;
|
||||||
let mut re_opt = None;
|
let need_re = re_ptr.is_null();
|
||||||
if re_ptr.is_null() {
|
if need_re {
|
||||||
let raw = String::parameter_value(*argv.offset(0));
|
let raw = String::parameter_value(*argv.offset(0));
|
||||||
if raw.is_err() {
|
if raw.is_err() {
|
||||||
let msg = CString::new(format!("{}", raw.unwrap_err())).unwrap();
|
let msg = CString::new(format!("{}", raw.unwrap_err())).unwrap();
|
||||||
@ -300,9 +300,8 @@ mod test {
|
|||||||
ffi::sqlite3_result_error(ctx, msg.as_ptr(), -1);
|
ffi::sqlite3_result_error(ctx, msg.as_ptr(), -1);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let re = comp.unwrap();
|
let re = Box::new(comp.unwrap());
|
||||||
re_ptr = &re as *const Regex;
|
re_ptr = Box::into_raw(re);
|
||||||
re_opt = Some(re);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let text = String::parameter_value(*argv.offset(1));
|
let text = String::parameter_value(*argv.offset(1));
|
||||||
@ -311,8 +310,8 @@ mod test {
|
|||||||
(*re_ptr).is_match(text.as_ref()).set_result(ctx);
|
(*re_ptr).is_match(text.as_ref()).set_result(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
if re_opt.is_some() {
|
if need_re {
|
||||||
ffi::sqlite3_set_auxdata(ctx, 0, mem::transmute(Box::into_raw(Box::new(re_opt.unwrap()))), Some(regexp_free));
|
ffi::sqlite3_set_auxdata(ctx, 0, mem::transmute(re_ptr), Some(regexp_free));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user