Fix segfault in regexp user function test

This commit is contained in:
John Gallagher 2015-12-11 11:40:53 -05:00
parent 9f5f4ac385
commit 0c3575e845

View File

@ -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));
} }
} }
} }