From 0c3575e845bd49c4d44da2ed9aa4631f7f964709 Mon Sep 17 00:00:00 2001 From: John Gallagher Date: Fri, 11 Dec 2015 11:40:53 -0500 Subject: [PATCH] Fix segfault in regexp user function test --- src/functions.rs | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/functions.rs b/src/functions.rs index fa6220e..3f21889 100644 --- a/src/functions.rs +++ b/src/functions.rs @@ -278,16 +278,16 @@ mod test { } extern "C" fn regexp_free(raw: *mut c_void) { - unsafe { - Box::from_raw(raw); - } + let _: Box = unsafe { + Box::from_raw(mem::transmute(raw)) + }; } extern "C" fn regexp(ctx: *mut sqlite3_context, _: c_int, argv: *mut *mut sqlite3_value) { unsafe { let mut re_ptr = ffi::sqlite3_get_auxdata(ctx, 0) as *const Regex; - let mut re_opt = None; - if re_ptr.is_null() { + let need_re = re_ptr.is_null(); + if need_re { let raw = String::parameter_value(*argv.offset(0)); if raw.is_err() { let msg = CString::new(format!("{}", raw.unwrap_err())).unwrap(); @@ -300,9 +300,8 @@ mod test { ffi::sqlite3_result_error(ctx, msg.as_ptr(), -1); return } - let re = comp.unwrap(); - re_ptr = &re as *const Regex; - re_opt = Some(re); + let re = Box::new(comp.unwrap()); + re_ptr = Box::into_raw(re); } let text = String::parameter_value(*argv.offset(1)); @@ -311,8 +310,8 @@ mod test { (*re_ptr).is_match(text.as_ref()).set_result(ctx); } - if re_opt.is_some() { - ffi::sqlite3_set_auxdata(ctx, 0, mem::transmute(Box::into_raw(Box::new(re_opt.unwrap()))), Some(regexp_free)); + if need_re { + ffi::sqlite3_set_auxdata(ctx, 0, mem::transmute(re_ptr), Some(regexp_free)); } } }